MFC的常用结构
目錄:
?
1:MessageBox??????? -------------------------------- 1
2:MessageBox??????? ---------------------------------4
3:MessageBox??????? -------------------------------- 6
4:ShowWindow??????? ---------------------------------9
5:?UpdateWindow__更新窗口? -------------------------11
6:MSG 消息結構???----------------------------------11
7:?GetMessage???? ----------------------------------12
8:TranslateMessage? --------------------------------13
9:?DispatchMessage? --------------------------------14
10:PAINTSTRUCT 結構? -------------------------------14
11:RECT 結構?????----------------------------------15
12:BeginPaint???? ----------------------------------16
13:GetClientRect? ----------------------------------17
14:DrawText?????? ----------------------------------17
15:EndPaint?????? --------------------------------- 20
16:PostQuitMessage?? -------------------------------21
17:DefWindowProc???? -------------------------------22
18:?DestroyWindow??------------------------------- 23
19:TextOut??????? --------------------------------- 23
20:GetTextAlign??--------------------------------- 24
21:SetTextAlign??? -------------------------------- 26
22:wsprintf???? ----------------------------------- 28
23:StringCchPrintf?? ------------------------------ 28
24:strlen????? ------------------------------------30
25:SUCCEEDED 和FAILED 宏?------------------------ 31
26:StringCchLength?? ------------------------------ 31
27:StringCchCat???-------------------------------- 33
28:?lstrcat????? ---------------------------------- 34
29:StringCchCopy??? ------------------------------- 35
30:lstrcpy???? ------------------------------------ 36
31:GET_X_LPARAM和 GET_Y_LPARAM 宏? --------------- 37
32:TEXTMETRIC 結構??? ----------------------------- 37
33:?GetTextMetrics??? ----------------------------? 39
34:GetSystemMetrics?? ----------------------------- 40
35:SetScrollRange??? -----------------------------? 46
36:GetScrollPos????? -----------------------------? 47
37:GetScrollRange?? ------------------------------- 48
38:?LOWORD 和HIWORD 宏? --------------------------50
39:?WM_SIZE 消息??? ------------------------------- 50
40:WM_VSCROLL 消息?? -----------------------------? 51
41:WM_HSCROLL 消息? ------------------------------- 52
42:InvalidateRect? -------------------------------- 54
43:SCROLLINFO 結構? -------------------------------? 55
44:SetScrollInfo??? -------------------------------- 56
45:?GetScrollInfo?? -------------------------------- 57
46:ScrollWindow???? -------------------------------- 59
47:ScrollWidnowEx? --------------------------------- 66
48:RGB 宏??? --------------------------------------- 68
49:SetPixel??? -------------------------------------- 69
50:GetRValue、GetGValue和 GetBValue 宏 ------------ 70
51:GetPixel? --------------------------------------- 71
52:SetPixelV?? ------------------------------------- 72
53:GetDC??? ---------------------------------------- 73
54:ReleaseDC? -------------------------------------- 74
55:?GetWindowDC?? ---------------------------------? 75
56:CreateDC???------------------------------------- 76
57:CreateCompatibleDC? ----------------------------- 77
58:CreateMetaFile?? -------------------------------- 78
59:?CloseMetaFile?? -------------------------------- 79
60:MoveToEx?? -------------------------------------- 79
61:LineTo?? ---------------------------------------? 80
62:POINT 結構?? -----------------------------------? 81
63:GetCurrentPositionEx? --------------------------- 82
64:Polyline?? -------------------------------------- 82
65:PolylineTo??-----------------------------------?83
66:PolyPolyline?? ---------------------------------? 84
67:GetDeviceCaps?---------------------------------- 85
68:PolyBezier??------------------------------------ 91
69:?PolyBezierTo? ---------------------------------? 92
70:Rectangle?-------------------------------------- 93
71:Ellipse??--------------------------------------- 94
72:RoundRect?-------------------------------------- 95
73:Arc?? -------------------------------------------96
74:Chord??----------------------------------------?98
75:Pie??? -----------------------------------------100
76:GetStockObject?-------------------------------- 101
77:SelectObject? -----------------------------------103
78:CreatePen?? ------------------------------------ 105
79:LOGPEN 結構? ----------------------------------- 106
80:?CreatePenIndirect? ---------------------------- 107
81:?DeleteObject? --------------------------------- 108
82:GetObject? ------------------------------------- 109
83:?GetCurrentObject? ----------------------------- 110
84:SetDCBrushColor? ------------------------------- 111
85:SetDCPenColor---------------------------------- 112
86:?GetDCBrushColor------------------------------- 113
87:GetDCPenColor? -------------------------------- 114
88:SetBkColor? ----------------------------------- 115
89:SetBkMode? ------------------------------------ 116
90:SetROP2?? ------------------------------------- 116
91:GetROP2?-------------------------------------- 118
92:Polygon?? ------------------------------------- 119
93:PolyPolygon? ---------------------------------- 120
94:SetPolyFillMode? ------------------------------ 121
95:GetBkMode?------------------------------------ 123
96:?GetPolyFillMode? ----------------------------- 124
97:CreateSolidBrush? ----------------------------- 124
98:LOGBRUSH 結構? -------------------------------- 125
99:CreateHatchBrush ------------------------------ 127
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
1:MessageBox
?
函數功能:
MessageBox 函數用于顯示一個模態對話框,其中包含一個系統圖標、 一組按鈕和一個簡短的特定于應用程序消息,如狀態或錯誤的信息。
??? 消息框中返回一個整數值,該值指示用戶單擊了哪個按鈕。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
?
int WINAPI MessageBox(
??_In_opt_??HWNDhWnd,
??_In_opt_??LPCTSTRlpText,
??_In_opt_??LPCTSTRlpCaption,
??_In_??? ?UINT uType
);
參數解析:
| 參數 | 含義 |
| hWnd | 1. 該消息框的父窗口句柄 |
| lpText | 消息框的內容 |
| lpCaption | 消息框的標題 |
| uType | 1. 指定一個決定對話框的內容和行為的位標志集 |
uType參數定義解析
| 按鈕 | 含義 |
| MB_OK | 默認值,有一個“確認”按鈕在里面 |
| MB_YESNO | 有“是”和“否”兩個按鈕在里面 |
| MB_ABORTRETRYIGNORE | 有“中止”,“重試”和“跳過”三個按鈕在里面 |
| MB_YESNOCANCEL | 有“是”,“否”和“取消”三個按鈕在里面 |
| MB_RETRYCANCEL | 有“重試”和“取消”兩個按鈕在里面 |
| MB_OKCANCEL | 有“確定”和“取消”兩個按鈕在里面 |
| 圖標 | 含義 |
| MB_ICONEXCLAMATION | 一個驚嘆號出現在消息框:? |
| MB_ICONWARNING | 一個驚嘆號出現在消息框(同上) |
| MB_ICONINFORMATION | 一個圓圈中小寫字母i組成的圖標出現在消息框:? |
| MB_ICONASTERISK | 一個圓圈中小寫字母i組成的圖標出現在消息框(同上) |
| MB_ICONQUESTION | 一個問題標記圖標出現在消息框:? |
| MB_ICONSTOP | 一個停止消息圖標出現在消息框:? |
| MB_ICONERROR | 一個停止消息圖標出現在消息框(同上) |
| MB_ICONHAND | 一個停止消息圖標出現在消息框(同上) |
| 默認按鈕 | 含義 |
| MB_DEFBUTTON1 | 指定第一個按鈕為默認按鈕 |
| MB_DEFBUTTON2 | 指定第二個按鈕為默認按鈕 |
| MB_DEFBUTTON3 | 指定第三個按鈕為默認按鈕 |
| MB_DEFBUTTON4 | 指定第四個按鈕為默認按鈕 |
| 消息框形態 | 含義 |
| MB_APPLMODAL | 1. 在 hWnd 參數標識的窗口中繼續工作以前,用戶一定響應消息框 |
| MB_SYSTEMMODAL | 1. 除了消息框有 WB_EX_TOPMOST 類型,否則 MB_APPLMODAL 和 MB_SYSTEMMODAL 一樣 |
| MB_TASKMODAL | 1. 如果參數 hWnd 為 NULL 的話,那么除了所有屬于當前線程高層次的窗口失效外,MB_TASKMODAL 和 MB_APPLMODAL 一樣 |
| 其他標志 | 含義 |
| MB_DEFAULT_DESKTOP_ONLY | 1. 接收輸入的當前桌面一定是一個默認桌面,否則函數調用失敗 |
| MB_HELP | 1. 把一個 Help 按鈕增加到消息框 |
| MB_RIGHT | 文本為右對齊 |
| MB_RTLREADING | 用在 Hebrew 和 Arabic 系統中從右到左的順序顯示消息和大寫文本 |
| MB_SETFOREGROUND | 1. 消息框變為前景窗口 |
| MB_TOPMOST | 消息框用 WS_EX_TOPMOST 窗口類型來創建 MB_SERVICE_NOTIFICATION |
返回值:
| 返回值 | 含義 |
| IDOK | 用戶按下了“確認”按鈕 |
| IDCANCEL | 用戶按下了“取消”按鈕 |
| IDABORT | 用戶按下了“中止”按鈕 |
| IDRETRY | 用戶按下了“重試”按鈕 |
| IDIGNORE | 用戶按下了“忽略”按鈕 |
| IDYES | 用戶按下了“是”按鈕 |
| IDNO | 用戶按下了“否”按鈕 |
舉例:
#include <windows.h>
?
int WINAPI WinMain(HINSTANCEhInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
? ?????MessageBox(NULL, TEXT("這是我在魚C學的第一個程序!"), TEXT("打招呼"), MB_OKCANCEL| MB_ICONQUESTION | MB_DEFBUTTON2);
? ?????return 0;
}
?
?
1:MessageBox
??? Windows的窗口總是基于窗口類來創建的,窗口類同時確定了處理窗口消息的窗口過程(回調函數)。
在創建應用程序窗口之前,必須調用 RegisterClass 函數來注冊窗口類。該函數只需要一個參數,即指向 WNDCLASS 窗口類的指針。因為 WNDCLASS 類包含了窗口所擁有的基本屬性。
結構原型:
typedef struct tagWNDCLASSW {
? ? UINT??? ???style;
? ? WNDPROC????lpfnWndProc;
? ? int??? ?? ?cbClsExtra;
? ? int??? ?? ?cbWndExtra;
? ? HINSTANCE??hInstance;
? ? HICON??? ? hIcon;
? ? HCURSOR????hCursor;
? ? HBRUSH??? ?hbrBackground;
? ? LPCWSTR????lpszMenuName;
? ? LPCWSTR????lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR*NPWNDCLASSW, FAR *LPWNDCLASSW;
成員解析:
| 成員 | 含義 |
| style | 指定窗口類型,各種“類風格”(詳見下方↓)可以使用按位或操作符組合起來 |
| lpfnWndProc | 指定窗口過程(必須是回調函數) |
| cbClsExtra | 預留的額外空間,一般為 0 |
| cbWndExtra | 預留的額外空間,一般為 0 |
| hInstance | 應用程序的實例句柄 |
| hIcon | 為所有基于該窗口類的窗口設定一個圖標 |
| hCursor | 為所有基于該窗口類的窗口設定一個鼠標指針 |
| hbrBackground | 指定窗口背景色 |
| lpszMenuName | 指定窗口菜單 |
| lpszClassName | 指定窗口類名 |
style 類風格解析
| 類風格 | 含義 |
| CS_VREDRAW | 移動或者調整窗口的高度(垂直方向)時,重繪整個窗口 |
| CS_HREDRAW | 移動或者調整窗口的寬度(水平方向)時,重繪整個窗口 |
| CS_DBLCLKS | 當用戶光標在窗口內雙擊時,允許發送雙擊消息給窗口過程 |
| CS_OWNDC | 給予每個窗口實例分配一個唯一的 DC(注意,盡管這樣是很方便,但它必須慎重使用,因為每個 DC 大約要占 800 個字節的內存) |
| CS_CLASSDC | 該窗口類的所有窗口實例都共享一個窗口類 DC |
| CS_PARENTDC | 1. 將子窗口的裁剪區域設置到父窗口的 DC 中去,這樣子窗口便可以在父窗口上繪制自身。(注意,這是子窗口還是從系統緩存中獲取 DC,而不是使用父窗口的 DC。) |
| CS_NOCLOSE | 禁止系統菜單的關閉選項 |
| CS_SAVEBITS | 1. 以位圖形式保存被該窗口遮擋的屏幕部分,這樣當給窗口移動以后,系統便可以用該保存的位圖恢復屏幕移動的相應部分,從而系統不用向被該窗口遮擋的窗口發送 WM_PAINT 消息 |
| CS_BYTEALIGNCLIENT | 在字節邊界上(在 x 方向上)定位窗口的用戶區域的位置 |
| CS_BYTEALIGNWINDOW | 在字節邊界上(在 x 方向上)定位窗口的位置 |
| CS_GLOBALCLASS | 1. 當調用 CreateWindow 或 CreateWindowEx 函數來創建窗口時允許它的 hInstance 參數和注冊窗口類時傳遞給 RegisterClass 的 hInstance 參數不同 |
1:MessageBox
?
函數功能:
CreateWindow 函數創建一個重疊式窗口、彈出式窗口或子窗口。它指定窗口類,窗口標題,窗口風格,以及窗口的初始位置及大小(可選的)。函數也指該窗口的父窗口或所屬窗口(如果存在的話),及窗口的菜單。
若要使用除 CreateWindow 函數支持的風格外的擴展風格,則使用 CreateWindowEx 函數代替 CreateWindow 函數。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
HWND WINAPI CreateWindow(
??_In_opt_??LPCTSTRlpClassName,? ? // 窗口類名稱
??_In_opt_??LPCTSTRlpWindowName,? ?// 窗口標題
??_In_??? ?DWORD dwStyle,? ?? ?? ? // 窗口風格,或稱窗口格式
??_In_??? ?int x,? ?? ?? ???? ?? ?// 初始 x 坐標
??_In_??? ?int y,? ?? ?? ???? ?? ?// 初始 y 坐標
??_In_??? ?int nWidth,? ?? ?? ??? // 初始 x 方向尺寸
??_In_??? ?int nHeight,? ?? ?? ???// 初始 y 方向尺寸
??_In_opt_??HWNDhWndParent,? ?? ???// 父窗口句柄
??_In_opt_??HMENUhMenu,? ?? ?? ?? ?// 窗口菜單句柄
??_In_opt_??HINSTANCEhInstance,? ? // 程序實例句柄
??_In_opt_??LPVOIDlpParam? ?? ?? ? // 創建參數
);
?
?
參數解析:
| 參數 | 含義 |
| lpClassName | 1. 窗口類名稱,可以是一個指向 NULL 結束的字符串或一個整型數值 |
| lpWindowName | 1. 窗口標題,一個指向 NULL 結束的字符串指針 |
| dwStyle | 指定創建窗口的風格(詳見下方↓) |
| x | 1. 指定窗口的初始水平位置(x 坐標) |
| y | 1. 指定窗口的初始垂直位置(y 坐標) |
| nWidth | 1. 以設備單元指明窗口的寬度 |
| nHeight | 1. 以設備單元指明窗口的高度 |
| hWndParent | 1. 指向被創建窗口的父窗口或所有者窗口的句柄 |
| hMenu | 1. 指向窗口菜單句柄,或依據窗口風格指明一個子窗口標識 |
| hInstance | 與窗口相關聯的模塊實例的句柄 |
| lpParam | 1. 指向一個值的指針,該值傳遞給窗口 WM_CREATE 消息。該值通過在 IParam 參數中的 CREATESTRUCT 結構傳遞 |
dwStyle 窗口風格解析
| 窗口風格 | 含義 |
| WS_BORDER | 創建一個帶邊框的窗口 |
| WS_CAPTION | 創建一個有標題框的窗口(包含了 WS_BODER 風格) |
| WS_CHILD | 創建一個子窗口,這個風格的窗口不能擁有菜單也不能與 WS_POPUP 風格合用 |
| WS_CHILDWINDOW | 與 WS_CHILD 相同 |
| WS_CLIPCHILDREN | 當在父窗口內繪圖時,排除子窗口區域,在創建父窗口時使用這個風格 |
| WS_CLIPSIBLINGS | 1. 排除子窗口之間的相對區域,也就是,當一個特定的窗口接收到 WM_PAINT 消息時,WS_CLIPSIBLINGS 風格將所有層疊窗口排除在繪圖之外,只重繪指定的子窗口 |
| WS_DISABLED | 1. 創建一個初始狀態為禁止的子窗口,一個禁止狀態的窗口不能接受來自用戶的輸入信息 |
| WS_DLGFRAME | 創建一個帶對話框邊框風格的窗口,這種風格的窗口不能帶標題條 |
| WS_GROUP | 1. 指定一組“控制窗口”的第一個“控制窗口” |
| WS_HSCROLL | 創建一個有水平滾動條的窗口 |
| WS_ICONIC | 創建一個初始狀態為最小化狀態的窗口,與 WS_MINIMIZE 風格相同 |
| WS_MAXIMIZE | 創建一個初始狀態為最大化狀態的窗口 |
| WS_MAXIMIZEBOX | 創建一個具有最大化按鈕的窗口,該風格不能與 WS_EX_CONTEXTHELP 風格同時出現,同時必須指定 WS_SYSMENU 風格 |
| WS_MINIMIZE | 創建一個初始狀態為最小化狀態的窗口,與 WS_ICONIC 風格相同 |
| WS_MINIMIZEBOX | 創建一個具有最小化按鈕的窗口,該風格不能與 WS_EX_CONTEXTHELP 風格同時出現,同時必須指定 WS_SYSMENU 風格 |
| WS_OVERLAPPED | 產生一個層疊的窗口,一個層疊的窗口有一個標題條和一個邊框,與 WS_TILED 風格相同 |
| WS_OVERLAPPEDWINDOW | 相當于(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX),與 WS_TILEDWINDOW 風格相同 |
| WS_POPUP | 創建一個彈出式窗口,該風格不能與 WS_CHILD 風格同時使用。 |
| WS_POPUPWINDOW | 相當于(WS_POPUP | WS_BORDER | WS_SYSMENU),但 WS_CAPTION 和 WS_POPUPWINDOW 必須同時設定才能使窗口某單可見 |
| WS_SIZEBOX | 創建一個可調邊框的窗口,與 WS_THICKFRAME 風格相同 |
| WS_SYSMENU | 創建一個在標題條上帶有窗口菜單的窗口,必須同時設定 WS_CAPTION 風格 |
| WS_TABSTOP | 1. 創建一個“控制窗口”,在用戶按下 Tab 鍵時可以獲得鍵盤焦點。 |
| WS_THICKFRAME | 創建一個具有可調邊框的窗口,與 WS_SIZEBOX 風格相同 |
| WS_TILED | 產生一個層疊的窗口,一個層疊的窗口有一個標題和一個邊框,與 WS_OVERLAPPED 風格相同 |
| WS_TILEDWINDOW | 相當于(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX),與 WS_OVERLAPPEDWINDOW 風格相同 |
| WS_VISIBLE | 創建一個初始狀態為可見的窗口 |
| WS_VSCROLL | 創建一個有垂直滾動條的窗口 |
返回值:
1. 如果函數成功,返回值為新窗口的句柄;
2. 如果函數失敗,返回值為 NULL。
?
4:ShowWindow
?
函數功能:
ShowWindow 函數用于設置指定窗口的顯示狀態。
?
應用程序第一次調用 ShowWindow 時,應該使用 WinMain 函數的 nCmdshow 參數作為它的 nCmdShow 參數。在隨后調用 ShowWindow 函數時,必須使用下列顯示方式中的一個給定值,而不是由 WinMain 函數的 nCmdSHow 參數指定的值。
API 函數原型:
BOOL WINAPI ShowWindow(
? ?_In_??HWNDhWnd,
??_In_??intnCmdShow
);
參數解析:
| 參數 | 含義 |
| hWnd | 窗口句柄 |
| nCmdShow | 控制窗口如何顯示,如果發送應用程序的程序提供了 STARTUPINFO 結構,則應用程序第一次調用 ShowWindow 時該參數被忽略。否則,在第一次調用 ShowWindow 函數時,該值應為在函數 WinMain 中 nCmdShow 參數。 |
在隨后的調用中,nCmdShow 參數可以為下列值之一:
| 顯示方式 | 含義 |
| SW_FORCEMINIMIZE | 1. 最小化窗口,即使擁有窗口的線程被掛起也會最小化 |
| SW_HIDE | 隱藏窗口并激活其他窗口 |
| SW_MAXIMIZE | 最大化指定的窗口 |
| SW_MINIMIZE | 最小化指定的窗口并且激活在 Z 序中的下一個頂層窗口 |
| SW_RESTORE | 1. 激活并顯示窗口 |
| SW_SHOW | 在窗口原來的位置以原來的尺寸激活并顯示窗口 |
| SW_SHOWDEFAULT | 依據在 STARTUPINFO 結構中指定的 SW_FLAG 標志設定顯示狀態,STARTUPINFO 結構是由啟動應用程序的程序傳遞給 CreateProcess 函數的。 |
| SW_SHOWMAXIMIZED | 激活窗口并將其最大化 |
| SW_SHOWMINIMIZED | 激活窗口并將其最小化 |
| SW_SHOWMINNOACTIVE | 1. 窗口最小化 |
| SW_SHOWNA | 1. 以窗口原來的位置以原來的尺寸顯示窗口 |
| SW_SHOWNOACTIVATE | 1. 以窗口最近一次的位置和尺寸顯示窗口 |
| SW_SHOWNORMAL | 1. 激活并顯示一個窗口 |
返回值:
1. 如果窗口之前可見,則返回值為非 0;
2. 如果窗口之前被隱藏,則返回值為 0。
?
?
?
5:?UpdateWindow__更新窗口
?
函數功能:
UpdateWindow 函數繞過應用程序的消息隊列,直接發送 WM_PAINT 消息給指定窗口的窗口過程。
如果窗口更新的區域不為空,UpdateWindow 函數通過發送一個 WM_PAINT 消息來更新指定窗口的客戶區。如果更新區域為空,則不發送消息。
API 函數原型:
BOOL UpdateWindow(
??_In_??HWNDhWnd
);
參數解析:
| 參數 | 含義 |
| hWnd | 指定要更新的窗口的句柄. |
返回值:
1. 如果函數調用成功,返回值為非 0;
2. 如果函數調用不成功,返回值為 0。
UpdateWindow,?WindowsSDK,?WindowsAPI,?SDK教程,?UpdateWindow詳解
?
?
?
6:MSG 消息結構
MSG 消息結構
在 Windows 程序中,消息是由 MSG 結構體來表示的。
結構原型:
typedef struct tagMSG {
??HWND??hwnd;
??UINT??message;
??WPARAM wParam;
??LPARAM lParam;
??DWORD??time;
??POINT??pt;
} MSG, *PMSG, *LPMSG;
?
成員解析:
| 成員 | 含義 |
| hwnd | 指定接收消息的窗口句柄 |
| message | 1. 消息的標識符,由于數值不便于記憶,所以 Windows 將消息對應的數值定義為 WM_XXX 宏的形式 |
| wParam | 指定消息的附加消息,確切的含義取決于消息成員的值 |
| lParam | 指定消息的附加消息,確切的含義取決于消息成員的值 |
| time | 該消息被投放到消息隊列的時間 |
| pt | 當消息被投放到消息隊列的時,鼠標位于屏幕中的位置 |
?
?
?
7:?GetMessage
?
函數功能:
GetMessage 函數的作用是從當前線程的消息隊列里取出一個消息并填入?MSG結構?中。
?
該函數只能獲取調用線程的消息,不能獲得其他線程的消息。成功獲取消息后,線程將從消息隊列中刪除該消息。如果消息隊列為空,函數會一直等待直到有消息到來才有返回值。
API 函數原型:
BOOL WINAPI GetMessage(
??_Out_????LPMSG lpMsg,
??_In_opt_??HWNDhWnd,
??_In_??? ?UINT wMsgFilterMin,
??_In_??? ?UINT wMsgFilterMax
);
參數解析:
| 參數 | 含義 |
| lpMsg | 指向 MSG 結構的指針 |
| hWnd | 1. 需要檢索消息的窗口的句柄,該窗口必須屬于當前線程 |
| wMsgFilterMin | 指定被檢索的最小消息值的整數 |
| wMsgFilterMax | 指定被檢索的最大消息值的整數 |
返回值:
1. 如果函數取得 WM_QUIT 之外的其他消息,返回非零值;
2. 如果函數取得 WM_QUIT 消息,返回值是零;
3. 如果出現了錯誤,返回值是 -1。
?
8:TranslateMessage
?
函數功能:
TranslateMessage 函數將虛擬鍵消息轉換為字符消息,字符消息被寄送到當前線程的消息隊列里。
當下一次線程調用函數 GetMessage 或PeekMessage 時被讀出。
API 函數原型:
BOOL WINAPI TranslateMessage(
??_In_??constMSG *lpMsg
);
參數解析:
| 參數 | 含義 |
| lpMsg | 指向含有消息的 MSG 結構的指針 |
返回值:
1. 如果消息被轉換(字符消息被寄送到當前線程的消息隊列里)則返回非零值;
2. 如果消息是 WM_KEYDOWN,WM_KEYUPWM_SYSKEYDOWN 或 WM_SYSKEYUP,返回非零值,不考慮轉換;
3. 如果消息沒被轉換(字符消息沒被寄送到調用線程的消息隊列里)則返回值是零。
?
9:?DispatchMessage
?
函數功能:
DispatchMessage 函數分派一個消息給窗口過程(回調函數),通常該消息從 GetMessage 函數獲得。Windows 的控制權在該函數交給了應用程序。
API 函數原型:
LRESULT WINAPIDispatchMessage(
??_In_??constMSG *lpmsg
);
參數解析:
| 參數 | 含義 |
| lpmsg | 指向含有消息的 MSG結構 的指針 |
返回值:
1. 返回值是窗口過程返回的值;
2. 盡管返回值的含義依賴于被分派的消息,但返回值通常被忽略。
備注:
1. MSG 結構必須包含有效的消息值。
2. 如果參數 lpmsg 指向一個 WM_TIMER 消息,并且 WM_TIMER 消息的參數 lParam 不為 NULL,則調用 lParam 指向的函數,而不是調用窗口程序。
?
?
10:PAINTSTRUCT 結構
PAINTSTRUCT 結構包含一些窗口過程用來對客戶區進行繪制的信息。
結構原型:
typedef struct tagPAINTSTRUCT{
??HDC??hdc;
??BOOL fErase;
??RECT rcPaint;
??BOOL fRestore;
??BOOL fIncUpdate;
??BYTErgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT;
?
成員解析:
| 成員 | 含義 |
| hdc | 用于繪制的設備環境句柄 |
| fErase | 1. 表示背景是否必須擦除,如果為非零值則擦除背景,否則不擦除背景 |
| rcPaint | 一個?RECT結構,指定左上角和右下角的坐標確定一個要繪制的矩形范圍 |
| fRestore | 系統保留 |
| fIncUpdate | 系統保留 |
| rgbReserved | 系統保留 |
11:RECT 結構
RECT 結構定義了一個矩形的左上角和右下角的坐標。
結構原型:
typedef struct _RECT {
??LONG left;
??LONG top;
??LONG right;
??LONG bottom;
} RECT, *PRECT;
成員解析:
| 成員 | 含義 |
| left | 指定矩形左上角的 x 坐標 |
| top | 指定矩形左上角的 y 坐標 |
| right | 指定矩形右下角的 x 坐標 |
| bottom | 指定矩形右下角的 y 坐標 |
12:BeginPaint
?
函數功能:
BeginPaint 函數為指定窗口進行繪畫工作的準備,并用將和繪畫有關的信息填充到一個?PAINTSTRUCT結構中。
API 函數原型:
HDC BeginPaint(
??_In_??HWND hwnd,
??_Out_??LPPAINTSTRUCTlpPaint
);
參數解析:
| 參數 | 含義 |
| hwnd | 需要重新繪制的窗口句柄 |
| lpPaint | 指向?PAINTSTRUCT結構的指針,用于存放繪畫相關的信息 |
返回值:
1. 如果函數成功,返回值是指定窗口的“顯示設備描述表”句柄;
2. 如果函數失敗,返回值是 NULL,表明沒有得到顯示設備的內容。
備注:
1. BeginPaint 函數自動設置顯示設備內容的剪切區域,而排除任何更新區域外的區域。該更新區域可以通過 InvalidateRect 或 InvalidateRgn 函數設置,也可以是系統在改變大小、移動、創建、滾動后設置的,或者其他的影響客戶區的操作來設置的。
2. 如果更新區域被標記為可擦除的,BeginPaint 發送一個 WM_ERASEBKGND 消息給窗口。
3. 一個應用程序除了響應 WM_PAINT 消息外,不應該調用 BeginPaint。
4. 每次調用 BeginPaint 都應該有相應的 EndPaint 函數。
5. 如果被繪畫的客戶區中有一個 caret(caret:插入符。是窗口客戶區中的一個閃爍的線,塊,或位圖。插入符通常表示文本或圖形將被插入的地方。即一閃一閃的光標),BeginPaint 自動隱藏該符號,而保證它不被擦除。
6. 如果窗口類有一個背景刷,BeginPaint 使用這個刷子來擦除更新區域的背景。
?
13:GetClientRect?
?
函數原型:
GetClientRect 函數用于獲取窗口客戶區的坐標,客戶區坐標指定客戶區的左上角和右下角。
由于客戶區坐標是相對窗口客戶區的左上角而言的,因此左上角坐標為(0,0)
API 函數原型:
BOOL WINAPI GetClientRect(
??_In_??HWND hWnd,
??_Out_??LPRECTlpRect
);
參數解析:
| 參數 | 含義 |
| hWnd | 需要獲取客戶區坐標的窗口句柄 |
| lpRect | 1. 指向?RECT結構的指針,該結構有四個成員,分別為 left、top、right 和 bottom |
返回值:
1. 如果函數成功,返回值是非 0;
2. 如果函數失敗,返回值是 0。
14:DrawText
?
函數原型:
DrawText 函數在指定的矩形里寫入格式化的正文,根據指定的方法對正文格式化(擴展的制表符,字符對齊、折行等)。
需要指定更多的格式選項,可以使用 DrawTextEx 函數。
API 函數原型:
int DrawText(
??_In_????HDC hDC,
??_Inout_??LPCTSTRlpchText,
??_In_????int nCount,
??_Inout_??LPRECTlpRect,
??_In_????UINT uFormat
);
?
?
參數解析:
| 參數 | 含義 |
| hDC | 指定“顯示設備描述表”句柄 |
| lpchText | 1. 指向將被寫入的字符串的指針,如果參數 nCount 是 -1,則字符串必須是以 \0 結束的 |
| nCount | 1. 指向字符串中的字符數 |
| lpRect | 指向?RECT結構的指針,其中包含文本將被置于其中的矩形的信息(按邏輯坐標) |
| uFormat | 1. 指定格式化文本的方法 |
uFormat 參數各種標志解析
| 標志 | 含義 |
| DT_BOTTOM | 對齊文字到矩形的底部,當且僅當設置了 DT_SINGLELINE 標志才有效 |
| DT_CALCRECT | 1. 這個參數決定矩形的寬度和高度 |
| DT_CENTER | 文本水平居中顯示 |
| DT_EDITCONTROL | 將擁有多行編輯控件的正文顯示特性(尤其是平均字符寬度的計算方法,并且不會顯示不可見的最后一行) |
| DT_END_ELLIPSIS | 1. 對于顯示的文本,如果結束的字符串的范圍不在矩形內,它會被截斷并以省略號標識 |
| DT_EXPANDTABS | 1. 擴展制表符,每個制表符的缺省字符數是 8 |
| DT_EXTERNALLEADING | 在行的高度里包含字體的外部標頭(通常外部標頭不被包含在正文行的高度里) |
| DT_HIDEPREFIX | 1. 忽略正文中的前綴字符(&),并且前綴字符后面的字母不會出現下劃線,其它前綴字符的調用方式不受影響 |
| DT_INTERNAL | 用系統字體來計算正文尺寸 |
| DT_LEFT | 正文左對齊 |
| DT_MODIFYSTRING | 1. 允許系統修改給定的字符串來匹配顯示的正文 |
| DT_NOCLIP | 無裁剪繪制,使用 DT_NOCLIP 可以提高 DrawText 的效率 |
| DT_NOFULLWIDTHCHARBREAK | 1. 在寬字符的字符串中防止行斷開,因此折行規則相當于單字符的字符串 |
| DT_NOPREFIX | 1. 關閉前綴字符的處理(通常 DrawText 解釋 & 為給其后的字符加下劃線,解釋 && 為顯示單個 &) |
| DT_PATH_ELLIPSIS | 1. 對于過長的正文,自動替換字符串中間的字符為省略號(...),以確保結果能在合適的矩形內顯示 |
| DT_PREFIXONLY | 1. 僅僅在(&)前綴字符的位置下繪制一個下劃線,但不繪制字符串中的任何其他字符 |
| DT_RIGHT | 正文右對齊 |
| DT_RTLREADING | 當設備環境的字體是希伯來文或阿拉伯文字體時,為雙向正文安排從右到左的閱讀順序 |
| DT_SINGLELINE | 顯示正文的同一行,回車和換行符都不能換行 |
| DT_TABSTOP | 1. 設置制表符,參數 uFormat 的 8~15 位(低位字中的高位字節)指定每個制表符的字符數,每個制表符的缺省字符數是 8 |
| DT_TOP | 正文頂端對齊 |
| DT_VCENTER | 使正文在矩形中垂直居中,當且僅當設置了 DT_SINGLELINE 標志才有效 |
| DT_WORDBREAK | 1. 當一行中的字符將會延伸到由 lpRect 指定的矩形的邊框時,此行自動地在單詞之間斷開 |
| DT_WORD_ELLIPSIS | 截短不符合矩形的正文,并增加省略號(與 DT_END_ELLIPSIS 類似) |
返回值:
1. 如果函數調用成功,返回值是正文的高度(邏輯單位);
2. 如果指定了 DT_VCENTER 或 DT_BOTTOM,返回值是 lpRect -> top 到繪制的正文的底部的偏移值;
3. 如果函數調用失敗,返回值是 0。
備注:
1. 函數 DrawText 用設備環境中的字體選擇、正文顏色和背景顏色來寫正文。
2. DrawText 裁剪正文,使之不會出現在指定矩形的外面,除非指定了 DT_NOCLIP。
3. 除非使用 DT_SINGLELINE 格式化,否則其余的格式都認為正文有多行。?
4. 如果選擇的字體對指定的矩形而言太大,DrawText 并不會試圖去換成一種小字體。
5. 設備環境的正文對齊方式必須包括 TA_LEFT, TA_TOP 和 TA_NOUPDATECP 標志。?
?
15:EndPaint
?
函數原型:
EndPaint 函數標記指定窗口的繪畫過程結束。
這個函數在每次調用 BeginPaint 函數之后被調用(釋放設備描述表),但僅僅在繪畫完成以后。
API 函數原型:
BOOL EndPaint(
??_In_??HWNDhWnd,
??_In_??constPAINTSTRUCT *lpPaint
);
參數解析:
| 參數 | 含義 |
| hWnd | 已經被重新繪制的窗口句柄 |
| lpPaint | 指向?PAINTSTRUCT結構的指針,用于存放繪畫相關的信息(該指針在調用 BeginPaint 時被賦值) |
返回值:
??? 該函數返回值始終是非 0。
?
?
16:PostQuitMessage
?
函數原型:
PostQuitMessage 函數向系統表明有個線程有終止(退出)請求。這個函數通常用來響應WM_DESTROY 消息。
API 函數原型:
VOID WINAPI PostQuitMessage(
??_In_??intnExitCode
);
參數解析:
| 參數 | 含義 |
| nExitCode | 指定應用程序的退出代碼,此值被用作 WM_QUIT 消息的 wParam 參數 |
返回值: 該函數沒有返回值。
備注:
1. PostQuitMessage 函數的功能是發送一個 WM_QUIT 消息給線程的消息隊列并立即返回。
2. 當線程從消息隊列里取得 WM_QUIT 消息時,應當退出消息循環并將返回系統,返回給系統的退出值必須是消息WM_QUIT 的 wParam 參數(所以 WinMain 函數的返回值是 msg.wParam)。
?
17:DefWindowProc
?
函數功能:
DefWindowProc 函數調用缺省的窗口過程來處理那些窗口過程沒有處理的任何消息,該函數是為了確保每個消息都被處理。
?? DefWindowProc函數傳入和窗口過程同樣的參數。
API 函數原型:
LRESULT WINAPI DefWindowProc(
??_In_??HWNDhWnd,
??_In_??UINTMsg,
??_In_??WPARAMwParam,
??_In_??LPARAMlParam
);
?
參數解析:
| 參數 | 含義 |
| hWnd | 指定接收消息的窗口句柄 |
| Msg | 1. 消息的標識符,由于數值不便于記憶,所以 Windows 將消息對應的數值定義為 WM_XXX 宏的形式 |
| wParam | 指定消息的附加消息,確切的含義取決于消息成員的值 |
| lParam | 指定消息的附加消息,確切的含義取決于消息成員的值 |
返回值:
1. 返回值就是消息處理結果,它取決于發送的消息。
?
?
18:?DestroyWindow?
?
函數功能:
DestroyWindow 用于銷毀一個指定的窗口,該函數通過發送 WM_DESTROY 消息和 WM_NCDESTROY 消息使窗口無效并移除其鍵盤焦點。
DestroyWindow 函數還銷毀窗口的菜單,清空線程的消息隊列,銷毀與窗口過程相關的定時器,解除窗口對剪貼板的擁有權,打斷剪貼板器的查看鏈。
如果指定的窗口擁有子窗口或擁有其它窗口,該函數將自動先銷毀其子窗口或所擁有的窗口,然后再銷毀自身。
API 函數原型:
BOOL WINAPI DestroyWindow(
??_In_??HWNDhWnd
);
?
參數解析:
| 參數 | 含義 |
| hWnd | 指定將被銷毀的窗口句柄 |
返回值:
1. 如果函數成功執行,返回值為非 0;
2. 如果函數執行失敗,返回值為 0。
備注:
1. 一個線程不能使用本函數銷毀別的線程創建的窗口。
2. 如果這個窗口是一個不具有 WS_EX_NOPARENTNOTIFY 樣式的子窗口,則銷毀窗口時將發WM_PARENTNOTIFY 消息給其父窗口。
?
19:TextOut
?
函數功能:
TextOut 函數使用當前選擇的字體、背景顏色和文本顏色,將一個字符串繪畫于窗口的指定位置。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
BOOL TextOut(
??_In_??HDChdc,
??_In_??intnXStart,
??_In_??intnYStart,
??_In_??LPCTSTRlpString,
??_In_??intcchString
);
參數解析:
| 參數 | 含義 |
| hdc | 設備環境句柄 |
| nXStart | 指定用于字符串對齊的基準點的邏輯 x 坐標(有關基準點請看下邊備注) |
| nYStart | 指定用于字符串對齊的基準點的邏輯 y 坐標 |
| lpString | 1. 指向將被繪制字符串的指針 |
| cchString | lpString 字符串的長度(有多少個字符) |
返回值:
1. 如果函數調用成功,返回值為非 0;
2. 如果函數調用失敗,返回值為 0。
備注:字符串對齊的基準點取決于當前的文本對齊模式。應用程序可以通過調用?GetTextAlign?獲得當前的文本對齊模式,通過調用SetTextAlign?修改該模式。
?
?
20:GetTextAlign
?
GetTextAlign 函數獲得指定的設備環境下的文字對齊方式的設置。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
UINT GetTextAlign(
??_In_??HDChdc
);
參數解析:
| 參數 | 含義 |
| hdc | 指定設備環境句柄 |
返回值:
1. 如果函數調用失敗,返回值是 GDI_ERROR;
2. 如果函數調用成功,返回值是文字對齊標志的狀態。
該返回值是下列值的組合:
| 值 | 含義 |
| TA_BASELINE | 基準點在正文的基線上 |
| TA_BOTTOM | 基準點在限定矩形的底邊上(限定矩形的含義請看下邊備注) |
| TA_TOP | 基準點在限定矩形的頂邊上 |
| TA_CENTER | 基準點在限定矩形的中心水平對齊位置 |
| TA_LEFT | 基準點在限定矩形的左邊上 |
| TA_RIGHT | 基準點在限定矩形的右邊上 |
| TA_RTLREADING | 1. 適用于中東 Windows 版本:正文從右到左的閱讀順序排列,與缺省的從左到右正好相反 |
| TA_NOUPDATECP | 每次輸出調用后當前狀態不改變 |
| TA_UPDATECP | 每次輸出調用后當前狀態改變 |
?
若當前字體有一條缺省的垂直基線(如Kanji),下列值用于取代 TA_BASELINE 和 TA_CENTER:
| 值 | 含義 |
| VTA_BASELINE | 基準點在正文的基線上 |
| VTA_CENTER | 基準點與限定矩形的中心垂直對齊 |
備注:
1. 默認值是 TA_LEFT, TA_TOP 和 TA_NOUPDATECP
2. 限定矩形是指能將正文字符串的所有字符單元限定于其中的矩形
3. 限定矩形的尺寸可通過調用 GetTextExtentPoint32 來獲得
4. 文字對齊標志決定?TextOut?和 ExtTextOut 如何將正文字符串與基準點對齊
5. 文字對齊標志不必是單個的標志位,可以等于0
6. 標志必須按相關的組來檢查,如下:
??? TA_LEFT, TA_RIGHT, andTA_CENTER
TA_BOTTOM, TA_TOP, and TA_BASELINE
TA_NOUPDATECP and TA_UPDATECP
如果當前字體有缺省的垂直基線,相關的標志如下所示:
??? TA_LEFT, TA_RIGHT, andVTA_BASELINE
TA_BOTTOM, TA_TOP, and VTA_CENTER
TA_NOUPDATECP and TA_UPDATECP
7. 要驗證一個特定的標志在返回值中被設置,應用程序必須執行以下步驟:
(例子:如何設置文本對齊模式)
??? 對該標志及其相關標志實施位OR操作;
對結果和返回值實施位AND操作;
檢查結果值和標志是否相等。
?
21:SetTextAlign
?
函數功能:
SetTextAlign 函數為指定設備環境設置文字的對齊標志。
API 函數原型:
UINT SetTextAlign(
??_In_??HDChdc,
??_In_??UINTfMode
);
參數解析:
| 參數 | 含義 |
| hdc | 指定設備環境句柄 |
| fMode | 1. 文本對齊標志 |
使用下面的列表中的掩碼指定文本對齊方式:
| 值 | 含義 |
| TA_BASELINE | 基準點在正文的基線上 |
| TA_BOTTOM | 基準點在限定矩形的底邊上(限定矩形的含義請看下邊備注) |
| TA_TOP | 基準點在限定矩形的頂邊上 |
| TA_CENTER | 基準點在限定矩形的中心水平對齊位置 |
| TA_LEFT | 基準點在限定矩形的左邊上 |
| TA_RIGHT | 基準點在限定矩形的右邊上 |
| TA_NOUPDATECP | 1. 適用于中東 Windows 版本:正文從右到左的閱讀順序排列,與缺省的從左到右正好相反 |
| TA_RTLREADING | 每次輸出調用后當前狀態不改變 |
| TA_UPDATECP | 每次輸出調用后當前狀態改變 |
若當前字體有一條缺省的垂直基線(如Kanji),下列值用于取代 TA_BASELINE 和 TA_CENTER:
| 值 | 含義 |
| VTA_BASELINE | 基準點在正文的基線上 |
| VTA_CENTER | 基準點與限定矩形的中心垂直對齊 |
默認值是TA_LEFT, TA_TOP 和 TA_NOUPDATECP。
返回值:
1. 如果函數調用失敗,返回值是 GDI_ERROR;
2. 如果函數調用成功,返回值是文字對齊方式的前一個設置。
備注:
1. 限定矩形是指能將正文字符串的所有字符單元限定于其中的矩形
2.?TextOut?和 ExtTextOut 函數用文字對齊標志來將一個正文字符串定位于顯示器或者其他設備
3. 該標志指定了基準點與限定正文的矩形的位置關系,基準點可以是當前位置,也可是傳給正文輸出函數的一個點
4. 設置左對齊文本的做好方法可以是如下:
SetTextAlign (hdc, GetTextAlign(hdc) & (~TA_CENTER))
或者
SetTextAlign (hdc,TA_LEFT | <other flags>)
?
你當然可以使用 SetTextAlign (hdc, TA_LEFT) 來達到這個目的,但是這個方法會丟失所有的垂直基線或者從右到左的設置。
5. 調用 SetTextAlign 函數時,如果使用 TA_UPDATECP 標志,Windows 會忽略 TextOut 的 xStart 和 yStart 參數,而使用由 MoveToEx、LineTo 或更改目前位置的另一個函數設定的位置。
?
?
?
?
22:wsprintf
?
函數功能:
wsprintf 函數用于把數據格式化寫入到指定的緩沖區里,輸出緩沖區里的的值取決于格式說明符(即"%"),如果寫入的是文字,此函數給寫入的文字的末尾追加一個'\0',函數的返回值是寫入的長度,但不包括最后的'\0'
?
注意:實際編程中不要再使用該函數,請使用?StringCchPrintf?或StringCbPrint 代替。
API 函數原型:
int __cdecl wsprintf(
??_Out_??LPTSTRlpOut,
??_In_??LPCTSTR lpFmt,
??_In_? ?...
);
?
參數解析:
| 參數 | 含義 |
| lpOut | 1. 指定格式化數據將要寫入的緩沖區 |
| lpFmt | 1. 格式化字符串 |
| ... | 可變參數,參數的個數取決 lpFmt 參數 |
返回值:
1. 如果函數調用成功,返回值與計劃寫入緩沖區的字符個數相等(不包含最后的'\0');
2. 如果函數調用失敗,返回值小于計劃寫入緩沖區的字符個數,可通過調用 GetLastError 獲取詳細的錯誤信息。
?
?
23:StringCchPrintf
?
函數功能:
StringCchPrintf 函數用于把數據格式化寫入到指定的緩沖區里,該函數要求提供目標緩沖區的大小,確保不會發生越界訪問。
微軟推薦使用該函數替代以下函數:
sprintf, swprintf, _stprintf
wsprintf
wnsprintf
_snprintf, _snwprintf,_sntprintf
API 函數原型:
HRESULT StringCchPrintf(
??_Out_??LPTSTRpszDest,
??_In_??size_t cchDest,
??_In_??LPCTSTR pszFormat,
??_In_??...
);
?
參數解析:
| 參數 | 含義 |
| pszDest | 指定格式化數據將要寫入的緩沖區 |
| cchDest | 1. 緩沖區大小 |
| pszFormat | 1. 格式化字符串 |
| ... | 可變參數,參數的個數取決 pszFormat 參數 |
返回值:
這個函數返回一個 HRESULT,而不是像 sprintf 一樣返回存儲在其目標緩沖區的字節數。我們強烈建議您使用?SUCCEEDED和?FAILED?宏來測試這個函數的返回值。
返回值可以是以下任意一個值:
| 返回代碼 | 描述 |
| S_OK | 表示有足夠的空間將拷貝到 pszDest,沒有發生截斷 |
| STRSAFE_E_INVALID_PARAMETER | cchDest 的值為 0 或大于 STRSAFE_MAX_CCH |
| STRSAFE_E_INSUFFICIENT_BUFFER | 1. 由于緩沖區空間不足而導致的復制失敗 |
備注:
使用 StringCchPrintf 函數需要添加頭文件:strsafe.h
代碼演示:
#include "strsafe.h"
?
......
?
TCHAR pszDest[30];?
size_t cchDest = 30;
LPCTSTR pszFormat =TEXT("從你家到魚C工作室需要 %f 公里!");
HRESULT hr =StringCchPrintf(pszDest, cchDest, pszFormat, 123.45);
?
......
?
?
?
24:strlen
?
函數功能:
lstrlen 函數用于計算指定字符串的長度(不包含'\0),注意:實際編程中不要再使用該函數,請使用?StringCchLength?或StringCbLength 代替。
API 函數原型:
int WINAPI lstrlen(
??_In_??LPCTSTRlpString
);
參數解析:
| 參數 | 含義 |
| lpString | 指向以'\0'為終止符的字符串 |
返回值:
1. 該函數返回指定字符串的字符數;
2. 如果是空字符串,則返回 0。
安全建議:
錯誤的使用 lstrlen 函數將可能會危害到應用程序的安全:lstrlen 函數假定 lpString 參數是以'\0'結尾的字符串,如果事實上傳入的參數不按套路出牌,則會造成緩沖區溢出,最終導致程序無法按照期望正常運行。
?
?
25:SUCCEEDED 和 FAILED 宏
?
宏功能:
SUCCEEDED 宏表示測試成功,FAILED 宏表示測試失敗。
宏定義:
#define??SUCCEEDED(hr)??(((HRESULT)(hr))>= 0)
#define??FAILED(hr)??(((HRESULT)(hr))< 0)
參數解析:
| 參數 | 含義 |
| hr | 1. 狀態碼 |
返回值:
1. 如果 hr 的值大于等于 0,則結果為TRUE;
2. 如果 hr 的值小于 0,則結果為FALSE。
?
?
?
26:StringCchLength
?
函數功能:
StringCchLength 函數用于確定字符串是否超過了規定的長度,以字符為計算單位。
微軟推薦使用該函數替代以下函數:
strlen, wcslen, _tcslen
API 函數原型:
HRESULT StringCchLength(
??_In_??LPCTSTR psz,
??_In_??size_t cchMax,
??_Out_??size_t*pcch
);
?
參數解析:
| 參數 | 含義 |
| psz | 指向待檢查的字符串 |
| cchMax | 1. psz 參數里最大允許的字符數量,包括'\0' |
| pcch | 1. psz 參數指向字符串的字符個數,不包括'\0' |
返回值:
這個函數返回一個 HRESULT,而不是指定字符串的字符個數。我們強烈建議您使用?SUCCEEDED?和?FAILED?宏來測試這個函數的返回值。
返回值可以是以下任意一個值:
| 返回代碼 | 描述 |
| S_OK | psz 指向的字符串不為空,且字符串的長度(包括'\0')小于等于 cchMax |
| STRSAFE_E_INVALID_PARAMETER | 1. psz 指向空字符串 |
備注:
1. 對比 StringCchLength 所替代的函數,StringCchLength 是可以使你的代碼正確處理緩存區的一個附加功能。因為小的緩沖處理會牽連很多安全問題,例如緩存區溢出
2. 使用 StringCchLength 函數需要添加頭文件:strsafe.h
?
?
?
27:StringCchCat?
?
函數功能:
StringCchCat 函數的功能是將一個字符串拼接到另一個字符串。StringCchCat 函數要求提供目標緩沖區的長度,以確保寫入數據不會超出緩沖區的末尾。
微軟推薦使用該函數替代以下函數:
strcat, wcscat, _tcsat
lstrcat
StrCat
StrCatBuff
API 函數原型:
HRESULT StringCchCat(
??_Inout_??LPTSTRpszDest,
??_In_????size_t cchDest,
??_In_????LPCTSTR pszSrc
);
參數解析:
| 參數 | 含義 |
| pszDest | 1. 目標緩沖區,同時包含第一個字符串 |
| cchDest | 1. 目標緩沖區的大小(字符個數) |
| pszSrc | 第二個字符串 |
返回值:
??? 這個函數返回一個 HRESULT,而不是拼接好的字符串指針。我們強烈建議您使用?SUCCEEDED?和?FAILED?宏來測試這個函數的返回值。
返回值可以是以下任意一個值:
| 返回代碼 | 描述 |
| S_OK | 字符串正常拼接 |
| STRSAFE_E_INVALID_PARAMETER | 1. cchDest 參數的值為 0? |
| STRSAFE_E_INSUFFICIENT_BUFFER | 1. 因緩沖區空間不足導致失敗 |
28:?lstrcat
函數功能:
lstrcat 函數的功能是將一個字符串拼接在另一個字符串后邊。
注意:實際編程中不要再使用該函數,請使用?StringCchCat?代替。
API 函數原型:
LPTSTR WINAPI lstrcat(
??_Inout_??LPTSTRlpString1,
??_In_????LPTSTR lpString2
);
參數解析:
| 參數 | 含義 |
| lpString1 | 一個以'\0'為結尾的字符串,該字符串空間必須大到足以容納本身及另一個字符串 |
| lpString2 | 一個以'\0'為結尾的字符串,該字符串將拼接到 lpString1 指向的字符串后邊 |
返回值:
1. 如果函數調用成功,返回指向拼接好的字符串指針;
2. 如果函數調用失敗,返回值為 NULL,并且 lpString1 可能會變成非 '\0' 結束的字符串。
安全建議:
1. 不正確的使用 lstrcat 函數,可能會損害應用程序的安全性
2. lstrcat 函數使用結構化異常處理(SEH)來捕捉訪問沖突和其他錯誤。當該函數捕獲 SEH 錯誤,如果沒有以'\0'結尾的字符串,則返回 NULL,且不把錯誤通知調用者。因此,把空間不足作為錯誤的條件是不安全的
3. lpString1 必須足夠大,以增加 lpString2 和結束'\0',否則可能發生緩沖區溢出
4. 在最壞的情況下,緩沖區溢出可能允許攻擊者可執行代碼注入到你的進程,尤其是當 lpString1 是一個基于堆棧的緩沖區
29:StringCchCopy
?
函數功能:
StringCchCopy 函數的功能是復制一個字符串到緩沖區。StringCchCopy 函數要求提供目標緩沖區的長度,以確保寫入數據不會超出緩沖區的末尾。
微軟推薦使用該函數替代以下函數:
strcpy, wcscpy, _tcscpy
lstrcpy
StrCpy
API 函數原型:
HRESULT StringCchCopy(
??_Out_??LPTSTRpszDest,
??_In_??size_t cchDest,
??_In_??LPCTSTR pszSrc
);
參數解析:
| 參數 | 含義 |
| pszDest | 緩沖區,用于接收拷貝過來的字符串 |
| cchDest | 1. 目標緩沖區的大小(字符個數) |
| pszSrc | 待拷貝的字符串 |
返回值:
這個函數返回一個 HRESULT,而不是指向緩沖區的指針。我們強烈建議您使用 SUCCEEDED 和 FAILED 宏來測試這個函數的返回值。
返回值可以是以下任意一個值:
| 返回代碼 | 描述 |
| S_OK | 字符串正常拷貝 |
| STRSAFE_E_INVALID_PARAMETER | 1. cchDest 參數的值為 0 |
| STRSAFE_E_INSUFFICIENT_BUFFER | 1. 因緩沖區空間不足導致失敗 |
?
30:lstrcpy
?
函數功能:
lstrcpy 函數的功能是復制一個字符串到緩沖區。
注意:實際編程中不要再使用該函數,請使用?StringCchCopy?代替。
API 函數原型:
LPTSTR WINAPI lstrcpy(
??_Out_??LPTSTRlpString1,
??_In_??LPTSTR lpString2
);
?
參數解析:
| 參數 | 含義 |
| lpString1 | 1. 緩沖區,用于接收來自 lpString2 參數指向的字符串 |
| lpString2 | 待拷貝的字符串 |
返回值:
1. 如果函數調用成功,返回指向緩沖區的指針;
2. 如果函數調用失敗,返回值是 NULL,并且 lpString1 可能會變成非 '\0' 結束的字符串。
安全建議:
1. 不正確的使用 lstcpy 函數,可能會損害應用程序的安全性
2. lstrcpy 函數使用結構化異常處理(SEH)來捕捉訪問沖突和其他錯誤。當該函數捕獲 SEH 錯誤,如果沒有以'\0'結尾的字符串,則返回 NULL,且不把錯誤通知調用者。因此,把空間不足作為錯誤的條件是不安全的
3. lpString1 必須足夠大,以增加 lpString2 和結束'\0',否則可能發生緩沖區溢出
4. 在最壞的情況下,緩沖區溢出可能允許攻擊者可執行代碼注入到你的進程,尤其是當 lpString1 是一個基于堆棧的緩沖區
?
?
31:GET_X_LPARAM和 GET_Y_LPARAM 宏
?
宏功能:
通過 lParam 參數獲得相關消息觸發的坐標 (x , y)
宏定義:
#define LOWORD(lp)??? ?? ???((WORD)(((DWORD_PTR)(lp)) &0xffff))
#define HIWORD(lp)??? ?? ???((WORD)((((DWORD_PTR)(lp)) >>16) & 0xffff))
?
#define GET_X_LPARAM(lParam)??? ??? ((int)(short)LOWORD(lParam))
#define GET_Y_LPARAM(lParam)??? ?? ?((int)(short)HIWORD(lParam))
?
參數解析:
| 參數 | 含義 |
| lParam | 將要被轉換的 lParam 參數 |
返回值:
1. GET_X_LPARAM(lParam) 返回坐標的 x 值;
2. GET_Y_LPARAM(lParam) 返回坐標的 y 值。
重要備注:
1. 使用該宏需要包含頭文件:windowsx.h。
2. 不要再使用 LOWORD 和 HIWORD 去獲取鼠標的坐標了,因為在多顯示器的情況下會得到錯誤的坐標。
?
32:TEXTMETRIC 結構
?
TEXTMETRIC 結構
TEXTMETRIC 結構記錄當前設備環境中有關字體的各種信息。
TEXTMETRIC 結構成員的值的單位取決于設備環境中當前選定的映射模式,默認的映射模式是MM_TEXT,所以它們的值是以像素為單位的。
結構原型:
typedef struct tagTEXTMETRIC
{
??LONG??tmHeight;
??LONG??tmAscent;
??LONG??tmDescent;
??LONG??tmInternalLeading;
??LONG??tmExternalLeading;
??LONG??tmAveCharWidth;
??LONG??tmMaxCharWidth;
??LONG??tmWeight;
??LONG??tmOverhang;
??LONG??tmDigitizedAspectX;
??LONG??tmDigitizedAspectY;
??TCHAR tmFirstChar;
??TCHAR tmLastChar;
??TCHAR tmDefaultChar;
??TCHAR tmBreakChar;
??BYTE??tmItalic;
??BYTE??tmUnderlined;
??BYTE??tmStruckOut;
??BYTE??tmPitchAndFamily;
??BYTE??tmCharSet;
} TEXTMETRIC, *PTEXTMETRIC;
成員解析:
| 成員 | 含義 |
| tmHeight | 字符高度(tmAscent + tmDescent) |
| tmAscent | 字符上部高度(基線以上) |
| tmDescent | 字符下部高度(基線以下) |
| tmInternalLeading | 內部間距(包含在 tmHeight 中),該間距通常被用于顯示重音符號 |
| tmExternalLeading | 外部間距,這個值是字體設計者建議在兩行文字間留出的空間大小 |
| tmAveCharWidth | 1. 字體中小寫字符的平均寬度(一般定義為字母 x 的寬度) |
| tmMaxCharWidth | 字體中最寬字符的寬度 |
| tmWeight | 字體的粗細輕重程度 |
| tmOverhang | 加入某些拼接字體上的附加高度 |
| tmDigitizedAspectX | 字體設計所針對的設備水平方向 |
| tmDigitizedAspectY | 字體設計所針對的設備垂直方向 |
| tmFirstChar | 為字體定義的第一個字符 |
| tmLastChar | 為字體定義的最后一個字符 |
| tmDefaultChar | 字體中所沒有字符的替代字符 |
| tmBreakChar | 定義文本對齊截斷操作所顯示的字符 |
| tmItalic | 如果該值非零,則為斜體字體 |
| tmUnderlined | 如果該值非零,則為帶下橫線字體 |
| tmStruckOut | 如果該值非零,則為帶刪除線字體(字符中間畫一條線) |
| tmPitchAndFamily | 1. 如果低位為 0,表示等寬字體,小寫和大寫字母平均寬度一樣 |
| tmCharSet | 字體的字符集 |
?
?
33:?GetTextMetrics
?
函數功能:
GetTextMetrics 函數將當前字體的信息填充到指定緩沖區(TEXTMETRIC結構)
API 函數原型:
BOOL GetTextMetrics(
??_In_??HDC hdc,
??_Out_??LPTEXTMETRIClptm
);
參數解析:
| 參數 | 含義 |
| hdc | 設備環境句柄 |
| lptm | 指向?TEXTMETRIC結構的指針,該結構用于獲得字體信息 |
返回值:
1. 如果函數調用成功,返回值是非 0;
2. 如果函數調用失敗,返回值是 0。
備注:
1. 要確定一種字體是否為 TrueType 字體,可以通過調用 GetTextMetrics 函數,然后檢查TEXTMETRIC.tmPitchAndFamily 的值是否為 TMPF_TRUETYPE
2. 注意,調用 GetDC 函數返回的是一個未初始化的 DC,它具有“系統”(一個位圖字體)作為默認字體。因此你需要先選擇一種字體到 DC
?
34:GetSystemMetrics
?
函數功能:
GetSystemMetrics 函數返回 Windows 中各種圖形項(圖標、鼠標指針、標題欄和滾動條等)的尺寸信息。
在不同的顯卡和驅動中,這些尺寸是不一樣的,為了在程序中做到與設備無關的圖形輸出,GetSystemMetrics是一個很重要的函數。
注意:GetSystemMetrics 函數獲取的所有尺寸均以像素為單位。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
int WINAPI GetSystemMetrics(
??_In_??intnIndex
);
參數解析:
| 參數 | 含義 |
| nIndex | 該參數是一個索引值,函數返回該索引值對應的配置信息 |
nIndex 參數是一個索引值,可以是以下列表中任意一個:
注意:
所有 SM_CX* 開頭表示寬(橫向),SM_CY* 開頭表示高(縱向),如果是返回布爾類型的數據,用非 0 值表示 TRUE,用 0 表示 FALSE
注釋:括號內代表宏的值
?
?
| 索引值 | 含義 |
| SM_ARRANGE(56) | 指定系統如何排列最小化窗口 |
| SM_CLEANBOOT(67) | 指定系統如何啟動: |
| SM_CMONITORS(80) | 有多少個顯示器 |
| SM_CMOUSEBUTTONS(43) | 鼠標上有多少個按鈕,如果為 0 則沒有安裝鼠標 |
| SM_CONVERTIBLESLATEMODE(0x2003) | 筆記本電腦或平板模式,0 為平板模式,非 0 表示其他模式 |
| SM_CXBORDER(5) | 1. 一個窗口邊框的寬 |
| SM_CXCURSOR(13) | 1. 光標的寬 |
| SM_CXDLGFRAME(7) | 這個值與 SM_CXFIXEDFRAME 是相同的 |
| SM_CXDOUBLECLK(36) | 雙擊有效的矩形區域的寬度 |
| SM_CXDRAG(68) | 鼠標在某個矩形內單擊移動被認為是拖拽 |
| SM_CXEDGE(45) | 3-D 邊框的寬度 |
| SM_CXFIXEDFRAME(7) | 1. 具有標題欄但不可以調整大小的窗口邊框的寬度 |
| SM_CXFOCUSBORDER(83) | 1. DrawFocusRect 函數畫出的矩形左右邊框的寬度 |
| SM_CXFRAME(32) | 這個值等同于 SM_CXSIZEFRAME |
| SM_CXFULLSCREEN(16) | 客戶區在全屏模式下的寬度 |
| SM_CXHSCROLL(21) | 水平滾動條上箭頭位圖的寬度 |
| SM_CXHTHUMB(10) | 水平滾動條滑塊的寬度 |
| SM_CXICON(11) | 1. 圖標的默認寬度? |
| SM_CXICONSPACING(38) | 一個網格單元的大圖標視圖中項的寬度 |
| SM_CXMAXIMIZED(61) | 最大化頂級窗口的寬度 |
| SM_CXMAXTRACK(59) | 一個具有標題欄及可調整大小的窗口所能達到的最大寬度 |
| SM_CXMENUCHECK(71) | 菜單上位圖的寬度 |
| SM_CXMENUSIZE(54) | 菜單條按鈕的寬度 |
| SM_CXMIN(28) | 窗口的最小寬度 |
| SM_CXMINIMIZED(57) | 最小化窗口的寬度 |
| SM_CXMINSPACING(47) | 各個最小化窗體所占的矩形的寬度,該值需要大于等于 SM_CXMINIMIZED |
| SM_CXMINTRACK(34) | 1. 窗口支持拖拽的最小寬度 |
| SM_CXPADDEDBORDER(92) | 1. 帶標題欄窗口邊框的填充量 |
| SM_CXSCREEN(0) | 1. 主顯示屏的屏幕寬度 |
| SM_CXSIZE(30) | 標題欄上按鈕的寬度 |
| SM_CXSIZEFRAME(32) | 可調整大小的窗口的邊框的寬度 |
| SM_CXSMICON(49) | 推薦的小圖標的寬度(一般出現在窗口標題欄) |
| SM_CXSMSIZE(52) | 小標題按鈕的寬度 |
| SM_CXVIRTUALSCREEN(78) | 虛擬屏幕的寬度(虛擬屏幕是所有顯示器的邊框) |
| SM_CXVSCROLL(2) | 垂直滾動條的寬度 |
| SM_CYBORDER(6) | 1. 一個窗口邊框的高 |
| SM_CYCAPTION(4) | 標題區域的高度 |
| SM_CYCURSOR(14) | 1. 光標的高 |
| SM_CYDLGFRAME(8) | 這個值與 SM_CYFIXEDFRAME 是相同的 |
| SM_CYDOUBLECLK(37) | 雙擊有效的矩形區域的高度 |
| SM_CYDRAG(69) | 鼠標在某個矩形內單擊移動被認為是拖拽 |
| SM_CYEDGE(46) | 3-D 邊框的高度 |
| SM_CYFIXEDFRAME(8) | 1. 具有標題欄但不可以調整大小的窗口邊框的高度 |
| SM_CYFOCUSBORDER(84) | 1. DrawFocusRect 函數畫出的矩形上下邊框的高度 |
| SM_CYFRAME(33) | 這個值等同于 SM_CYSIZEFRAME |
| SM_CYFULLSCREEN(17) | 客戶區在全屏模式下的高度 |
| SM_CYHSCROLL(3) | 水平滾動條上箭頭位圖的高度 |
| SM_CYICON(12) | 1. 圖標的默認高度 |
| SM_CYICONSPACING(39) | 一個網格單元的大圖標視圖中項的高度 |
| SM_CYKANJIWINDOW(18) | 對于系統的雙字節字符集版本,這個是漢字在窗口底部的高度 |
| SM_CYMAXIMIZED(62) | 最大化頂級窗口的高度 |
| SM_CYMAXTRACK(60) | 一個具有標題欄及可調整大小的窗口所能達到的最大高度 |
| SM_CYMENU(15) | 單行菜單欄的高 |
| SM_CYMENUCHECK(72) | 菜單上位圖的高度 |
| SM_CYMENUSIZE(55) | 菜單條按鈕的高度 |
| SM_CYMIN(29) | 窗口的最小高度 |
| SM_CYMINIMIZED(58) | 最小化窗口的高度 |
| SM_CYMINSPACING(48) | 各個最小化窗體所占的矩形的高度,該值需要大于等于 SM_CYMINIMIZED |
| SM_CYMINTRACK(35) | 1. 窗口支持拖拽的最小高度 |
| SM_CYSCREEN(1) | 1. 主顯示屏的屏幕高度 |
| SM_CYSIZE(31) | 標題欄上按鈕的高度 |
| SM_CYSIZEFRAME(33) | 可調整大小的窗口的邊框的高度 |
| SM_CYSMCAPTION(51) | 小標題的高度 |
| SM_CYSMICON(50) | 推薦的小圖標的高度(一般出現在窗口標題欄) |
| SM_CYSMSIZE(53) | 小標題按鈕的高度 |
| SM_CYVIRTUALSCREEN(79) | 虛擬屏幕的高度(虛擬屏幕是所有顯示器的邊框) |
| SM_CYVSCROLL(20) | 垂直滾動條的寬度 |
| SM_CYVTHUMB(9) | 垂直滾動條滑塊框的高度 |
| SM_DBCSENABLED(42) | 如果 User32.dll 支持 DBCS 返回非 0 值,否則返回 0 |
| SM_DEBUG(22) | 如果已安裝的 User.exe 的調試版本返回非 0 值,否則返回 0 |
| SM_DIGITIZER(94) | 1. 如果當前的操作系統是 Windows 7 或者 Windows Server 2008 R2 并且 Tablet PC input 服務已啟動,則返回非 0 值,否則返回 0 |
| SM_IMMENABLED(82) | 如果啟用了輸入法管理器或輸入法編輯器功能,則返回非 0,否則返回 0 |
| SM_MAXIMUMTOUCHES(95) | 1. 如果有在系統中的數字化儀,則返回非 0,否則返回 0 |
| SM_MEDIACENTER(87) | 如果當前的操作系統是 Windows XP(MCE,媒體中心版),則返回非 0,否則返回 0 |
| SM_MENUDROPALIGNMENT(40) | 如果下來菜單相應的菜單欄項目是右對齊的,則返回非 0,否則如果是左對齊返回 0 |
| SM_MIDEASTENABLED(74) | 如果系統啟用了希伯來語和阿拉伯語的語言,則返回非 0,否則返回 0 |
| SM_MOUSEPRESENT(19) | 1. 如果安裝了鼠標返回非 0,否則返回 0? |
| SM_MOUSEHORIZONTALWHEELPRESENT(91) | 如果鼠標有水平滾動輪,則返回非 0,否則返回 0 |
| SM_MOUSEWHEELPRESENT(75) | 如果鼠標有垂直滾動輪,則返回非 0,否則返回 0 |
| SM_NETWORK(63) | 1. 如果存在網絡,則返回值最后一位被設置為 1,否則返回 0? |
| SM_PENWINDOWS(41) | 如果安裝了 Windows 手寫畫板的擴展,則返回非 0,否則返回 0 |
| SM_REMOTECONTROL(0x2001) | 1. 該系統信息是用在終端服務環境下,用于判斷當前的終端服務器會話是否被遠程控制 |
| SM_REMOTESESSION(0x1000) | 1. 該系統信息是用在終端服務環境下 |
| SM_SAMEDISPLAYFORMAT(81) | 1. 如果所有的顯示器具有相同的顏色格式,則返回非 0,否則返回 0 |
| SM_SECURE(44) | 該系統信息被忽略,它總是返回 0 |
| SM_SERVERR2(89) | 如果系統是 Windows Server 2003 R2 則返回內部版本號,否則返回 0 |
| SM_SHOWSOUNDS(70) | 如果用戶需要應用程序可視化音頻信息,則返回非 0,否則返回 0 |
| SM_SHUTTINGDOWN(0x2000) | 1. 如果當前會話關閉返回非 0,否則返回 0 |
| SM_SLOWMACHINE(73) | 如果計算機擁有一個低端(慢速)處理器,則返回非 0,否則返回 0 |
| SM_STARTER(88) | 如果當前的操作系統是 Windows 7 入門版,Windows Vista 入門版,或 Windows XP 入門版,則返回非 0,否則返回 0 |
| SM_SWAPBUTTON(23) | 如果鼠標左右鍵的含義互相交換,則返回非 0,否則返回 0 |
| SM_SYSTEMDOCKED(0x2004) | 反映了底座模式,返回 0 為非底座模式,否則返回非 0 |
| SM_TABLETPC(86) | 1. 如果當前的操作系統是 Windows XP Tablet PC 版,或者如果當前的操作系統是 Windows Vista 或 Windows 7 且 Tablet PC input 服務已啟動,則返回非 0,否則返回 0 |
| SM_XVIRTUALSCREEN(76) | 1. 虛擬屏幕左側的坐標(虛擬屏幕是所有顯示器的邊框) |
| SM_YVIRTUALSCREEN(77) | 1. 虛擬屏幕頂側的坐標(虛擬屏幕是所有顯示器的邊框) |
返回值:
1. 如果函數調用成功,返回值索引參數對應的配置信息;
2. 如果函數調用失敗,返回值是 0。
?
?
?
?
?
35:SetScrollRange
?
函數功能:
SetScrollRange 函數設置所指定滾動條范圍的最小值和最大值。
注意:SetScrollRange 函數提供了向后的兼容性。但新的應用程序應該提倡使用 SetScrollInfo 函數代替。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
BOOL SetScrollRange(
??_In_??HWNDhWnd,
??_In_??intnBar,
??_In_??intnMinPos,
??_In_??intnMaxPos,
??_In_??BOOLbRedraw
);
?
參數解析:
| 參數 | 含義 |
| hWnd | 1. 滾動條控件的句柄或帶有標準滾動條窗體的句柄 |
| nBar | 指定將要設置哪類滾動條的參數: |
| nMinPos | 指定滾動位置的最小值 |
| nMaxPos | 指定滾動位置的最大值 |
| bRedraw | 指定滾動條是否被重畫以反映變化(如果這個參數為 TRUE,滾動條將被重畫;如果為 FALSE 則不被重畫) |
返回值:
1. 如果函數調用成功,返回值為非 0;
2. 如果函數調用失敗,返回值為 0。
備注:
1. 將 SetScrollRange 函數中的 nMinPos 和 nMaxPos 參數設置為一樣的值,可以達到隱藏滾動條的目的。但在處理滾動條消息時,應用程序不應該調用 SetScrollRange 函數來隱藏滾動條。新的應用程序應該調用ShowScrollBar 函數來隱藏滾動條。
2. 如果調用 SetScrollPos 函數之后馬上調用 SetScrollRange 函數,則 SetScrollPos 函數中的 bRedraw 參數一定要設置為零值(FALSE),以防止滾動條被畫兩次。
?
3. 標準滾動條的缺省范圍是 0 到100。滾動條控件的缺省值為 NULL(參數 nMinPos 和 nMaxPos 的值均為零)。兩個范圍值之間的不同之處在于由參數 nMinPos 和 nMaxPos 指定,不過不能超過 MAXLONG 定義的大小。
4. 因為說明滾動條位置的消息 WM_HSCROLL 和 WM_VSCROLL 是 16 位數據,所以那些只依賴于說明位置數據消息的應用程序在SetScrollRange 函數的參數 nMaxPos 中有一個實際最大值 65,535。但是,因為 SetScrolllnfo,SetScrollPos, SetScrollRange,GetScrolllnfo,GetScrollPos 和 GetScrollRange 函數都支持 32 位的滾動條位置數據,所以有一個解決 16 位 WM_HSCROLL 和WM_VSCROLL 消息阻礙的途徑,請參見函數 GetScrolllnfo 的有關技術說明。
5. 如果參數 nBar 設置為 SB_CTL 并且參數 hWnd 所標識的不是一個標準的滾動條控件。系統將發送一個 SBM_SETRANGE 消息到窗體用以設置滾動條消息。這將允許 SetScrollRange 函數操作一個定制的偽滾動條控件。如果窗體沒有處理SBM_SETRANGE 消息,SetScrollRange 函數將調用失敗。
?
?
36:GetScrollPos
?
函數功能:
GetScrollPos 函數獲取指定滾動條中滾動按鈕的當前位置。當前位置是一個根據當前滾動范圍而定的相對值。例如,如果滾動范圍是 0~10,滾動按鈕恰好在中間的位置,則其當前位置就為 50。
注意:該函數提供了向后兼容性,新的應用程序應該使用 GetScrollInfo 函數代替。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
int GetScrollPos(
??_In_??HWNDhWnd,
??_In_??intnBar
);
參數解析:
| 參數 | 含義 |
| hWnd | 1. 滾動條控件的句柄或帶有標準滾動條窗體的句柄 |
| nBar | 指定哪類滾動條的當前位置將被返回: |
返回值:
1. 如果函數調用成功,返回值是指定滾動條的當前位置;
2. 如果函數調用失敗,返回值是 0。
備注:
1. GetScrollPos 函數可以使應用程序使用 32 位數據的滾動位置。盡管消息 WM_HSCROLL 和 WM_VSCROLL 只支持 16 位的數據,而 SetScrollPos,SetScrollRange,GetScrollPos 和 GetscrollRange 函數都支持 32 位的滾動條數據,因此,應用程序在處理任 WM_HSCROLL 或 WM_VSCROLL 消息時可以調用 GetScrollPos 函數來獲得 32 位數據的滾動條位。
2. 為了獲得在一個 WM_HSCROLL 或 WM_VSCROLL 消息的 SB_THUMBTRACK 請求碼的滾動框(滑塊)的 32位數據的位置,請使用 GetScrollInfo 函數。
?
?
?
?
37:GetScrollRange
?
函數功能:
GetScrollRange 函數獲得指定滾動條的范圍。
注意:GetScrollRange 函數提供了向后的兼容性。但新的應用程序應該提倡使用 GetScrollInfo 函數代替。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
BOOL GetScrollRange(
??_In_??HWND hWnd,
??_In_??int nBar,
??_Out_??LPINTlpMinPos,
??_Out_??LPINTlpMaxPos
);
參數解析:
| 參數 | 含義 |
| hWnd | 1. 滾動條控件的句柄或帶有標準滾動條窗體的句柄 |
| nBar | 指定將要設置哪類滾動條的參數: |
| lpMinPos | 指向存放最小位置的整型變量 |
| lpMaxPos | 指向存放最大位置的整型變量 |
返回值:
1. 如果函數調用成功,返回值是非 0;
2. 如果函數調用失敗,返回值是 0。
備注:
1. 如果指定的窗口沒有標準的滾動條或不是滾動條控件,GetScrollRange 函數將零復制到 lpMinPos 和 lpMaxPos 參數中。
2. 標準滾動條的默認范圍是 0 到 100。滾動條控件的缺省值為空。
3. 因為說明滾動條位置的消息 WM_HSCROLL 和 WM_VSCROLL 是 16 位數據,所以那些只依賴于說明位置數據消息的應用程序在SetScrollRange 函數的參數 nMaxPos 中有一個實際最大值 65,535。但是,因為 SetScrolllnfo,SetScrollPos, SetScrollRange,GetScrolllnfo,GetScrollPos 和 GetScrollRange 函數都支持 32 位的滾動條位置數據,所以有一個解決 16 位 WM_HSCROLL 和WM_VSCROLL 消息阻礙的途徑,請參見函數 GetScrolllnfo 的有關技術說明。
4. 如果參數 nBar 設置為 SB_CTL 并且參數 hWnd 所標識的不是一個標準的滾動條控件。系統將發送一個 SBM_GETRANGE 消息到窗體用以設置滾動條消息。這將允許 GetScrollRange 函數操作一個定制的偽滾動條控件。如果窗體沒有處理SBM_GETRANGE 消息,GetScrollRange 函數將調用失敗。
?
?
?
?
?
?
?
38:?LOWORD和 HIWORD 宏
?
宏功能:
獲得指定 32 位數據的低 16位數據和高 16 位數據。
?
小甲魚溫馨提醒:不要使用 LOWORD 和 HIWORD 宏去獲取鼠標的坐標,因為在多顯示器的情況下會得到錯誤的坐標。應該使用?GET_X_LPARAM和 GET_Y_LPARAM 宏來獲取。
宏定義:
#define LOWORD(lParam)??? ?((WORD)(((DWORD_PTR)(lParam)) & 0xffff))
#define HIWORD(lParam)??? ?((WORD)((((DWORD_PTR)(lParam)) >> 16) & 0xffff))
參數解析:
| 參數 | 含義 |
| lParam | 32 位的目標數據 |
返回值:
1. LOWORD(lParam) 返回 lParam 的低16 位數據;
2. HIWORD(lParam) 返回 lParam 的高16 位數據。
39:?WM_SIZE消息
?
消息含義:
當主窗口的客戶區部分大小改變時,操作系統將給應用程序發送 WM_SIZE 消息。
應用程序通過窗口過程接收該消息(請關注:《Windows程序設計(SDK)》視頻教學)。
消息定義:
#define WM_SIZE??? ?? ?? ?? ?? ???? ? 0x0005
?
參數解析:
wParam:指出窗口的新狀態
wParam 參數可以是下列值之一:
| 值 | 含義 |
| SIZE_MAXHIDE(4) | 當該應用程序的其他窗口被最大化的時候,消息被發送往所有的彈出窗口 |
| SIZE_MAXIMIZED(2) | 該窗口被最大化 |
| SIZE_MAXSHOW(3) | 當該應用程序的其他窗口已經恢復到原來大小的時候,消息被發送往所有的彈出窗口 |
| SIZE_MINIMIZED(1) | 該窗口被最小化 |
| SIZE_RESTORED(0) | 該窗口的大小發生變化,但不是最大化(SIZE_MAXIMIZED)或最小化(MINIMIZED) |
lParam:指出當前客戶區的大小(寬度和高度)
1. lParam 參數的低 16 位指定了新窗口的寬度;
2. lParam 參數的高 16 位制定了新窗口的高度。
?
小甲魚溫馨提醒:可以通過?LOWORD宏和?HIWORD宏來獲取 lParam 參數的低 16 位和高16 位。
返回值:
1. 如果窗口過程響應該消息,必須返回 0。
?
?
40:WM_VSCROLL消息
?
消息含義:
當窗口的標準垂直滾動條有滾動事件發生時,操作系統向窗口的消息隊列投入一條WM_VSCROLL 消息。
此消息也適用于觸發垂直滾動條控件。
應用程序通過窗口過程接收該消息(請關注:《Windows程序設計(SDK)》視頻教學)。
消息定義:
#define WM_VSCROLL??? ?? ?? ?? ?? ??? 0x0115
參數解析:
wParam:當?LOWORD(wParam)?的結果(取低 16 位)為SB_THUMBPOSITION 或 SB_THUMBTRACK 時,HIWORD(wParam)?的值(取高 16 位)是當前滑塊在滾動框的位置。
小甲魚溫馨提示:
當 wParam 的低 16 位的值是 SB_THUMBTRACK 時,wParam 的高 16 位是用戶拖動滑塊的當前位置
當 wParam 的低 16 位的值是 SB_THUMBPOSITION 時,wParam 的高 16 位是用戶松開鼠標按鍵時滑塊的最終位置
對于其他的滾動操作,wParam 的高 16 位應該被忽略
LOWORD(wParam) 的結果(取低 16 位)代表了鼠標在滾動條上的動作,這個值被稱之為“通知碼”,由一個以“SB”開頭的標識符定義。
該通知碼是下列值之一:
| 值 | 含義 |
| SB_BOTTOM | 滾動到底部(鍵盤 End 按鍵觸發) |
| SB_ENDSCROLL | 完成滾動操作(松開鼠標) |
| SB_LINEDOWN | 向下滾動一行 |
| SB_LINEUP | 向上滾動一行 |
| SB_PAGEDOWN | 向下滾動一頁 |
| SB_PAGEUP | 向上滾動一頁 |
| SB_THUMBPOSITION | 1. 用戶有拖動滾動條的操作,并已經松開了鼠標按鈕 |
| SB_THUMBTRACK | 1. 用戶拖動滾動條滑塊觸發此消息 |
| SB_TOP | 滾動到頂端(鍵盤 Home 按鍵觸發) |
lParam:如果該參數等于 0,說明它是標準的窗口滾動條;如果該參數等于滾動條窗口句柄,說明它是滾動條控件。
返回值:
1. 如果窗口過程響應該消息,必須返回 0。
?
?
?
41:WM_HSCROLL消息
?
消息含義:
當窗口的標準水平滾動條有滾動事件發生時,操作系統向窗口的消息隊列投入一條WM_HSCROLL 消息。
此消息也適用于觸發水平滾動條控件。
應用程序通過窗口過程接收該消息(請關注:《Windows程序設計(SDK)》視頻教學)。
消息定義:
#define WM_HSCROLL??? ?? ?? ?? ?? ??? 0x0114
參數解析:
wParam:wParam:當?LOWORD(wParam)?的結果(取低 16 位)為SB_THUMBPOSITION 或 SB_THUMBTRACK 時,HIWORD(wParam)?的值(取高 16 位)是當前滑塊在滾動框的位置。
小甲魚溫馨提示:
當 wParam 的低 16 位的值是 SB_THUMBTRACK 時,wParam 的高 16 位是用戶拖動滑塊的當前位置
當 wParam 的低 16 位的值是 SB_THUMBPOSITION 時,wParam 的高 16 位是用戶松開鼠標按鍵時滑塊的最終位置
對于其他的滾動操作,wParam 的高 16 位應該被忽略
LOWORD(wParam) 的結果(取低 16 位)代表了鼠標在滾動條上的動作,這個值被稱之為“通知碼”,由一個以“SB”開頭的標識符定義。
該通知碼是下列值之一:
| 值 | 含義 |
| SB_ENDSCROLL | 完成滾動操作(松開鼠標) |
| SB_LEFT | 滾動到左邊 |
| SB_RIGHT | 滾動到右邊 |
| SB_LINELEFT | 向左滾動一行 |
| SB_LINERIGHT | 向右滾動一行 |
| SB_PAGELEFT | 向左滾動一頁 |
| SB_PAGERIGHT | 向右滾動一頁 |
| SB_THUMBPOSITION | 1. 用戶有拖動滾動條的操作,并已經松開了鼠標按鈕 |
| SB_THUMBTRACK | 1. 用戶拖動滾動條滑塊觸發此消息 |
lParam:如果該參數等于 0,說明它是標準的窗口滾動條;如果該參數等于滾動條窗口句柄,說明它是滾動條控件。
返回值:
1. 如果窗口過程響應該消息,必須返回 0。
?
?
?
42:InvalidateRect
?
函數功能:
InvalidateRect 函數向指定的窗體更新區域添加一個矩形,然后窗口客戶區域的這一部分將被重新繪制。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
BOOL InvalidateRect(
??_In_??HWNDhWnd,
??_In_??constRECT *lpRect,
??_In_??BOOLbErase
);
參數解析:
| 參數 | 含義 |
| hWnd | 1. 指向待更新的客戶區所在的窗體的句柄 |
| lpRect | 1. 一個指向?RECT結構的指針,指定無效區域的矩形,該矩形將會被重新繪制 |
| bErase | 1. 指定更新區域內的背景是否重繪 |
返回值:
1. 如果函數調用成功,返回值是非 0;
2. 如果函數調用失敗,返回值是 0。
備注:
1. 在下一個 WM_PAINT 消息產生前,所有 ValidateRect 或 ValidateRgn 函數產生的更新區域會被拼接成一個大的更新區域。
2. 當更新區域不為空并且窗口的消息隊列中沒有其他消息,系統向窗口過程發送 WM_PAINT 消息,令其重繪。
3. 如果任何一個更新區域的 bErase 參數為 TRUE,整個背景會被擦除重繪。
?
?
?
?
43:SCROLLINFO結構
?
SetScrollInfo?函數通過 SCROLLINFO 結構設置滾動條參數(或者 SBM_SETSCROLLINFO 消息),GetScrollInfo?函數也通過 SCROLLINFO 結構獲得滾動條參數(或者 SBM_GETSCROLLINFO 消息)。
結構原型:
typedef struct tagSCROLLINFO {
??UINT cbSize;
??UINT fMask;
??int??nMin;
??int??nMax;
??UINT nPage;
??int??nPos;
??int??nTrackPos;
} SCROLLINFO, *LPCSCROLLINFO;
成員解析:
| 成員 | 含義 |
| cbSize | 1. 該結構的大小(以字節為單位) |
| fMask | 指定被設置或獲取的滾動條參數,該參數可以由下列標志組成: |
| nMin | 滾動條范圍的最小值 |
| nMax | 滾動條范圍的最大值 |
| nPage | 頁面的大小,滾動條通過這個值來動態確定滑塊的大小 |
| nPos | 滑塊的位置 |
| nTrackPos | 當前滑塊的位置 |
如在使用上有任何不同,可以參考小甲魚的《Windows程序設計(SDK)》第 14 講:滾動條3
?
?
?
?
?
44:SetScrollInfo
?
函數功能:
SetScrollInfo 函數用于設置滾動條的參數,其中包括:滾動范圍的最小值和最大值,頁面的大小,以及滑塊的位置。如果需要,該函數還可以重繪滾動條。
API 函數原型:
int SetScrollInfo(
??_In_??HWNDhwnd,
??_In_??intfnBar,
??_In_??LPCSCROLLINFOlpsi,
??_In_??BOOLfRedraw
);
參數解析:
| 參數 | 含義 |
| hwnd | 1. 滾動條控件的句柄或帶有標準滾動條窗體的句柄 |
| fnBar | 指定將要設置哪類滾動條的參數: |
| lpsi | 1. 指向?SCROLLINFO結構 |
| fRedraw | 指定滾動條是否被重畫以反映變化(如果這個參數為 TRUE,滾動條將被重畫;如果為 FALSE 則不被重畫) |
返回值
SetScrollInfo 函數的返回值是滾動按鈕的當前位置。
備注:
SetScrollInfo 函數將會檢查?SCROLLINFO結構中的 nPage 和 nPos 兩個成員的值的范圍(nPage 成員的值必須是 0 ~ nMax-nMin+1;nPos 成員的值必須是在 nMin 到 nMax - max(nPage-1, 0) 之間),如果任何一個值超過了范圍,函數將在指定范圍內為它設置一個值。
如在使用上有任何不同,可以參考小甲魚的《Windows程序設計(SDK)》第 14 講:滾動條3
?
?
?
?
45:?GetScrollInfo
?
函數功能:
GetScrollInfo 函數用于獲取滾動條的參數,其中包括:滾動范圍的最小值和最大值,頁面的大小,以及滑塊的位置。
API 函數原型:
BOOL GetScrollInfo(
??_In_????HWND hwnd,
??_In_????int fnBar,
??_Inout_??LPSCROLLINFOlpsi
);
參數解析:
| 參數 | 含義 |
| hwnd | 1. 滾動條控件的句柄或帶有標準滾動條窗體的句柄 |
| fnBar | 指定將要設置哪類滾動條的參數: |
| lpsi | 1. 指向?SCROLLINFO結構 |
返回值:
1. 如果函數成功獲取滾動條的參數,則返回值是非 0;
2. 如果函數沒有獲取滾動條的參數,則返回值是 0。
備注:
1. 盡管滾動條消息 WM_HSCROLL 和 WM_VSCROLL 可以通過 HIWORD(wParam) 取得滾動條的位置(當 LOWORD(wParam) 通知碼為 SB_THUMBPOSITION 和 SB_THUMBTRACK 的時候),但得到是 16 位的滾動條位置。如果想要得到 32 位的滾動條數據,可以使用 GetScrollInfo 函數。
2. 為了在 WM_HSCROLL 或 WM_VSCROLL 的 SB_THUMBTRACK 通知碼中獲得滾動條滑塊的 32 位的位置,可以通過調用 GetScrollInfo 函數并設置?SCROLLINFO結構?fMask 成員的值為 SIF_TRACKPOS 實現。GetScrollInfo 函數將滾動條滑塊的位置存放在 SCROLLINFO 結構的 nTrackPos 成員中。這將使得用戶在移動滑塊時你可以及時獲得滑塊的位置。
【API檔案】版權歸魚C工作室(www.fishc.com)所有,轉載請注明來源。
示例:
SCROLLINFO si;
case WM_HSCROLL:
? ?switch(LOWORD(wparam)) {
? ?????case SB_THUMBTRACK:
? ???? ? // Initialize SCROLLINFO structure
?
? ???? ?? ?ZeroMemory(&si, sizeof(si));
? ???? ?? ?si.cbSize = sizeof(si);
? ???? ?? ?si.fMask = SIF_TRACKPOS;
?
? ???? ? // Call GetScrollInfo to get current tracking?
? ???? ? //? ? position in si.nTrackPos
?
? ???? ?? ?if (!GetScrollInfo(hwnd, SB_HORZ, &si) )
? ???? ?? ?? ? return 1; // GetScrollInfo failed
? ???? ?? ?break;
? ?????.
? ?????.
? ?????.
? ? }
?
如在使用上有任何不同,可以參考小甲魚的《Windows程序設計(SDK)》第 14 講:滾動條3
?
?
?
?
46:ScrollWindow
函數功能:
ScrollWindow 函數滾動指定窗口的客戶區內容。
注意:該函數提供了向后兼容性,新的應用程序應該使用?ScrollWindowsEx?函數代替。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
?
BOOL ScrollWindow(
??_In_??HWNDhWnd,
??_In_??intXAmount,
??_In_??intYAmount,
??_In_??constRECT *lpRect,
??_In_??constRECT *lpClipRect
);
參數解析:
| 參數 | 含義 |
| hWnd | 指向客戶區將被滾動的窗口句柄 |
| XAmount | 1. 在設備單元中,指定水平滾動的數量 |
| YAmount | 1. 在設備單元中,指定垂直滾動的數量 |
| lpRect | 1. 指向?RECT結構指針,該結構指定了將要滾動的客戶區范圍 |
| lpClipRect | 1. 指向?RECT結構指針,該結構指定了要滾動的裁剪區域 |
返回值:
1. 如果函數調用成功,返回值是非 0;
2. 如果函數調用失敗,返回值是 0。
備注:
1. 如果在被滾動的窗口中含有插入符,ScrollWindow 函數將自動隱藏插入符,以防它被擦掉。當滾動結束后再恢復插入符,插入符的位置相應的被調整。
2. 未被 ScrollWindow 函數覆蓋的區域不會被重繪,但該區域會與窗口更新區域組合,當應用程序最終收到 WM_PAINT 的消息時,組合區域統一重繪。為了在滾動操作的同時重畫未覆蓋區域,則應在調用 ScrollWindow 函數后馬上調用UpdateWindow?函數。
3. 如果 lpRect 參數的值為 NULL,則窗口中的任何子窗口的位置由參數 XAmount 和 Yamount 的數值決定移動距離;窗口中無效的區域(未重繪)也會移動。
4. 當 lpRect 參數為 NULL 時,ScrollWindow函數可以執行得更快。
5. 如果 lpRect 參數不為 NULL,則窗口中的子窗口的位置不改變,窗口中無效的區域(未重繪)也不移動。為了防止 lpRect 參數不為 NULL 時更新的問題,需要在調用 ScrollWindow 函數前調用?UpdateWindow?函數重繪窗口。
/*-------------------------------------------------------------------
? ???? ?? ?? ???【API檔案】ScrollWindow 函數使用例子
? ???? ?? ?? ?? ?? ?魚C工作室 -- www.fishc.com
--------------------------------------------------------------------*/
LRESULT CALLBACK WndProc(HWNDhwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
? ?????HDC hdc;
? ?????PAINTSTRUCT ps;
? ?????TEXTMETRIC tm;
? ?????SCROLLINFO si;
?
? ?????static int xClient;? ???// 客戶區的寬度
? ?????static int yClient;? ???// 客戶區的高度
? ?????static int xClientMax;??// 客戶區內容顯示的最大寬度(超過此寬度則加入滾動條)
?
? ?????static int xChar;? ?? ? // 字體的平均水平寬度
? ?????static int yChar;? ?? ? // 字體的垂直高度
? ?????static int xUpper;? ?? ?// 字體的大寫字符的水平寬度
?
? ?????static int xPos;? ?? ???// 當前水平滾動條滑塊的位置
? ?????static int yPos;? ?? ???// 當前垂直滾動條滑塊的位置
?
? ?????int i;? ?? ?? ???? ?? ?// 循環計數器
? ?????int x, y;? ?? ?? ???? ?// 水平和垂直的坐標
?
? ?????int FirstLine;? ?? ?? ? // 失效區域的第一行(需重繪的第一行)
? ?????int LastLine;? ?? ?????// 失效區域的最后一行((需重繪的最后一行))
? ?????HRESULT hr;
? ?????size_t abcLength;? ?? ? // 用于存放 abc 數組的長度
?
? ?????// 創建要顯示的行(呃,打印的內容我就不翻譯了吧...)
? ?????#define LINES 28?
? ?????static TCHAR *abc[] = {
? ???? ?? ?? ? TEXT("anteater"),TEXT("bear"), TEXT("cougar"),
? ???? ?? ?? ? TEXT("dingo"),TEXT("elephant"), TEXT("falcon"),
? ???? ?? ?? ? TEXT("gazelle"),TEXT("hyena"), TEXT("iguana"),
? ???? ?? ?? ? TEXT("jackal"),TEXT("kangaroo"), TEXT("llama"),
? ???? ?? ?? ? TEXT("moose"),TEXT("newt"), TEXT("octopus"),
? ???? ?? ?? ? TEXT("penguin"),TEXT("quail"), TEXT("rat"),
? ???? ?? ?? ? TEXT("squid"),TEXT("tortoise"), TEXT("urus"),
? ???? ?? ?? ? TEXT("vole"),TEXT("walrus"), TEXT("xylophone"),
? ???? ?? ?? ? TEXT("yak"),TEXT("zebra"),
? ???? ?? ?? ? TEXT("This line containswords, but no character. Go figure."),
? ???? ?? ?? ? TEXT("")
? ?????};
?
? ?????switch (message)
? ?????{
? ?????case WM_CREATE:
? ???? ?? ?? ? // 獲得設備環境句柄
? ???? ?? ?? ? hdc = GetDC(hwnd);
?
? ???? ?? ?? ? // 獲得文本中字體的大小?
? ???? ?? ?? ? GetTextMetrics(hdc, &tm);
? ???? ?? ?? ? xChar = tm.tmAveCharWidth;
? ???? ?? ?? ? xUpper = (tm.tmPitchAndFamily& 1 ? 3 : 2) * xChar / 2;
? ???? ?? ?? ? yChar = tm.tmHeight +tm.tmExternalLeading;
?
? ???? ?? ?? ? // 釋放設備環境句柄?
? ???? ?? ?? ? ReleaseDC(hwnd, hdc);
?
? ???? ?? ?? ? // 設置客戶區的最大寬度?
? ???? ?? ?? ? // (我們這里設置為 48 個小寫字符的寬度 + 12 個大寫字符的寬度)
? ???? ?? ?? ? xClientMax = 48 * xChar + 12 *xUpper;
?
? ???? ?? ?? ? return 0;
?
? ?????case WM_SIZE:
? ???? ?? ?? ? // 獲得客戶區的尺寸?
? ???? ?? ?? ? yClient = HIWORD(lParam);
? ???? ?? ?? ? xClient = LOWORD(lParam);
?
? ???? ?? ?? ? // 設置垂直滾動條范圍和頁面大小(設置頁面大小將決定滑塊的粗細)
? ???? ?? ?? ? si.cbSize = sizeof(si);
? ???? ?? ?? ? si.fMask = SIF_RANGE | SIF_PAGE;
? ???? ?? ?? ? si.nMin = 0;
? ???? ?? ?? ? si.nMax = LINES - 1;
? ???? ?? ?? ? si.nPage = yClient / yChar;
? ???? ?? ?? ? SetScrollInfo(hwnd, SB_VERT,&si, TRUE);
?
? ???? ?? ?? ? // 設置水平滾動條范圍和頁面大小(設置頁面大小將決定滑塊的粗細)?
? ???? ?? ?? ? si.cbSize = sizeof(si);
? ???? ?? ?? ? si.fMask = SIF_RANGE | SIF_PAGE;
? ???? ?? ?? ? si.nMin = 0;
? ???? ?? ?? ? si.nMax = 2 + xClientMax / xChar;
? ???? ?? ?? ? si.nPage = xClient / xChar;
? ???? ?? ?? ? SetScrollInfo(hwnd, SB_HORZ,&si, TRUE);
?
? ???? ?? ?? ? return 0;
? ?????case WM_HSCROLL:
? ???? ?? ?? ? // 獲得水平滾動條的所有信息
? ???? ?? ?? ? si.cbSize = sizeof (si);
? ???? ?? ?? ? si.fMask = SIF_ALL;
? ???? ?? ?? ? GetScrollInfo(hwnd, SB_HORZ,&si);
?
? ???? ?? ?? ? // 保存當前滑塊位置,遲些進行比較
? ???? ?? ?? ? xPos = si.nPos;
? ???? ?? ?? ? switch (LOWORD(wParam))
? ???? ?? ?? ? {
? ???? ?? ?? ?? ?? ???// 用戶點擊滾動條左邊的三角形
? ???? ?? ?? ? case SB_LINELEFT:
? ???? ?? ?? ?? ?? ???si.nPos -= 1;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ?? ?? ???// 用戶點擊滾動條右邊的三角形
? ???? ?? ?? ? case SB_LINERIGHT:
? ???? ?? ?? ?? ?? ???si.nPos += 1;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ?? ?? ???// 用戶點擊滑塊左邊的滾動條軸
? ???? ?? ?? ? case SB_PAGELEFT:
? ???? ?? ?? ?? ?? ???si.nPos -= si.nPage;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ?? ?? ???// 用戶點擊滑塊右邊的滾動條軸
? ???? ?? ?? ? case SB_PAGERIGHT:
? ???? ?? ?? ?? ?? ???si.nPos += si.nPage;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ?? ?? ???// 用戶拖動滾動條
? ?? ???? ?? ? case SB_THUMBTRACK:
? ???? ?? ?? ?? ?? ???si.nPos = si.nTrackPos;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ? default:
? ???? ?? ?? ?? ?? ???break;
? ???? ?? ?? ? }
?
? ???? ?? ?? ? // 設置滾動條滑塊的新位置
? ???? ?? ?? ? si.fMask = SIF_POS;
? ???? ?? ?? ? SetScrollInfo(hwnd, SB_HORZ,&si, TRUE);
?
? ???? ?? ?? ? // 獲得滾動條滑塊的位置,由于窗口調整,它可能不是同一個值
? ???? ?? ?? ? GetScrollInfo(hwnd, SB_HORZ,&si);
?
? ???? ?? ?? ? // 與此前的保存的值進行比較,如果不同則滾動窗口
? ???? ?? ?? ? if (si.nPos != xPos)
? ???? ?? ?? ? {
? ?? ???? ?? ?? ?? ???ScrollWindow(hwnd, xChar * (xPos - si.nPos), 0, NULL, NULL);
? ???? ?? ?? ? }
?
? ???? ?? ?? ? return 0;
?
? ?????case WM_VSCROLL:
? ???? ?? ?? ? // 獲得垂直滾動條的所有信息
? ???? ?? ?? ? si.cbSize = sizeof (si);
? ???? ?? ?? ? si.fMask = SIF_ALL;
? ???? ?? ?? ? GetScrollInfo(hwnd, SB_VERT,&si);
?
? ???? ?? ?? ? // 保存當前滑塊位置,遲些進行比較
? ???? ?? ?? ? yPos = si.nPos;
? ???? ?? ?? ? switch (LOWORD(wParam))
? ???? ?? ?? ? {
? ???? ?? ?? ?? ?? ???// 用戶點擊鍵盤 Home 按鍵
? ???? ?? ?? ? case SB_TOP:
? ?? ???? ?? ?? ?? ?? ?si.nPos= si.nMin;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ?? ?? ???// 用戶點擊鍵盤 End 按鍵
? ???? ?? ?? ? case SB_BOTTOM:
? ???? ?? ?? ?? ?? ???si.nPos = si.nMax;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ?? ?? ???// 用戶點擊滾動條上邊的三角形
? ???? ?? ?? ? case SB_LINEUP:
? ???? ?? ?? ?? ?? ???si.nPos -= 1;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ?? ?? ???// 用戶點擊滾動條下邊的三角形
? ???? ?? ?? ? case SB_LINEDOWN:
? ???? ?? ?? ?? ?? ???si.nPos += 1;
? ???? ?? ?? ?? ?? ???break;
?
? ?? ???? ?? ?? ?? ?? ?// 用戶點擊滑塊上邊的滾動條軸
? ???? ?? ?? ? case SB_PAGEUP:
? ???? ?? ?? ?? ?? ???si.nPos -= si.nPage;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ?? ?? ???// 用戶點擊滑塊下邊的滾動條軸
? ???? ?? ?? ? case SB_PAGEDOWN:
? ???? ?? ?? ?? ?? ???si.nPos += si.nPage;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ?? ?? ???// 用戶拖動滾動條
? ???? ?? ?? ? case SB_THUMBTRACK:
? ???? ?? ?? ?? ?? ???si.nPos = si.nTrackPos;
? ???? ?? ?? ?? ?? ???break;
?
? ???? ?? ?? ? default:
? ???? ?? ?? ?? ?? ???break;
? ???? ?? ?? ? }
?
? ???? ?? ?? ? // 設置滾動條滑塊的新位置
? ???? ?? ?? ? si.fMask = SIF_POS;
? ???? ?? ?? ? SetScrollInfo(hwnd, SB_VERT,&si, TRUE);
?
? ???? ?? ?? ? // 獲得滾動條滑塊的位置,由于窗口調整,它可能不是同一個值
? ???? ?? ?? ? GetScrollInfo(hwnd, SB_VERT,&si);
?
? ???? ?? ?? ? // 與此前的保存的值進行比較,如果不同則滾動窗口
? ???? ?? ?? ? if (si.nPos != yPos)
? ???? ?? ?? ? {
? ???? ?? ?? ?? ?? ???ScrollWindow(hwnd, 0, yChar * (yPos - si.nPos), NULL, NULL);
? ???? ?? ?? ?? ?? ???UpdateWindow(hwnd);
? ???? ?? ?? ? }
?
? ???? ?? ?? ? return 0;
?
? ?? ???caseWM_PAINT:
? ???? ?? ?? ? // 準備繪制
? ???? ?? ?? ? hdc = BeginPaint(hwnd, &ps);
?
? ???? ?? ?? ? // 獲得垂直滾動條的位置
? ???? ?? ?? ? si.cbSize = sizeof (si);
? ???? ?? ?? ? si.fMask = SIF_POS;
? ???? ?? ?? ? GetScrollInfo(hwnd, SB_VERT,&si);
? ???? ?? ?? ? yPos = si.nPos;
?
? ???? ?? ?? ? // 獲得水平滾動條的位置
? ???? ?? ?? ? GetScrollInfo(hwnd, SB_HORZ,&si);
? ???? ?? ?? ? xPos = si.nPos;
?
? ???? ?? ?? ? // 計算需要重繪的區域
? ???? ?? ?? ? FirstLine = max(0, yPos +ps.rcPaint.top / yChar);
? ???? ?? ?? ? LastLine = min(LINES - 1, yPos +ps.rcPaint.bottom / yChar);
?
? ???? ?? ?? ? for (i = FirstLine; i <=LastLine; i++)
? ???? ?? ?? ? {
? ???? ?? ?? ?? ?? ???x = xChar * (1 - xPos);
? ???? ?? ?? ?? ?? ???y = yChar * (i - yPos);
?
? ???? ?? ?? ?? ?? ???// 使用安全字符串函數獲得字符串長度
? ???? ?? ?? ?? ?? ???hr = StringCchLength(abc[i], 55, &abcLength);
? ???? ?? ?? ?? ?? ???if ((FAILED(hr)) | (abcLength == NULL))
? ???? ?? ?? ?? ?? ???{
? ???? ?? ?? ?? ?? ???? ?? ???// 獲取字符串長度失敗的提示...
? ???? ?? ?? ?? ?? ???}
?
? ?? ???? ?? ?? ?? ?? ?// 在客戶區繪制一行數據
? ???? ?? ?? ?? ?? ???TextOut(hdc, x, y, abc[i], abcLength);
? ???? ?? ?? ? }
?
? ???? ?? ?? ? // 繪制完畢
? ???? ?? ?? ? EndPaint(hwnd, &ps);
? ???? ?? ?? ? return 0;
? ?????case WM_DESTROY:
? ???? ?? ?? ? PostQuitMessage(0);
? ???? ?? ?? ? return 0;
? ?????}
? ?????return DefWindowProc(hwnd, message, wParam, lParam);
}
?
?
?
?
47:ScrollWidnowEx
?
函數功能:? ScrollWindowEx函數滾動指定窗口的客戶區內容。
API 函數原型:
int ScrollWindowEx(
??_In_??HWND hWnd,
??_In_??int dx,
??_In_??int dy,
??_In_??const RECT *prcScroll,
??_In_??const RECT *prcClip,
??_In_??HRGN hrgnUpdate,
??_Out_??LPRECTprcUpdate,
??_In_??UINT flags
);
參數解析:
| 參數 | 含義 |
| hWnd | 指向客戶區將被滾動的窗口句柄 |
| dx | 1. 在設備單元中,指定水平滾動的數量 |
| dy | 1. 在設備單元中,指定垂直滾動的數量 |
| prcScroll | 1. 指向?RECT結構指針,該結構指定了將要滾動的客戶區范圍 |
| prcClip | 1. 指向?RECT結構指針,該結構指定了要滾動的裁剪區域 |
| hrgnUpdate | 1. 指向由于滾動而無效的區域的句柄 |
| prcUpdate | 1. 指向?RECT結構,該結構指定由于滾動而無效的矩形的邊界 |
| flags | 指定控制滾動的標志 |
flags 參數由下列標志組合:
| 標志 | 含義 |
| SW_ERASE | 通過發送 WM_ERASEBKGND 消息給窗口,令其擦除新的無效區域(需同時指定 SW_INVALIDATE 消息) |
| SW_INVALIDATE | 滾動后,使得 hrgnUpdate 參數指定的區域無效 |
| SW_SCROLLCHILDREN | 1. 滾動所有由參數 prcScroll 指定的相交重疊的子窗口 |
| SW_SMOOTHSCROLL | Windows 98/Me, Windows 2000/XP:使用平滑滾動,使用 HIWORD(flags) 指出平滑滾動需要多少時間(以毫秒為單位) |
返回值:
1. 如果函數調用成功,返回值是 SIMPLEREGION(矩形的無效區域),COMPLEXREGION(非矩形的無效區域;重疊的矩形)或 NULLREGION(沒有無效區域);
2. 如果函數調用失敗,返回值是 ERROR。
備注:
1. 如果flags 參數的 SW_INVALIDATE 和 SW_ERASE 標志沒有被設定,那么 ScrollWindowEx 函數不能使滾動過的區域失效。如果 flags 參數中任何一個標志被設置,ScrollWindowEx 函數就可以使該區域失效。這個區域就不會被更新直到應用程序調用?UpdateWindow?函數,或調用 RedrawWindow 函數(指定 RDW_UPDATENOW 或 RDW_ERASENOW 標志),或響應 WM_PAINT 消息。
2. 如果窗口擁有 WS_CLIPCHILDREN 類型,那么由 hrgnUpdate 和 prcUpdate 參數指定的返回區域描述了必須更新的滾動窗口的全部區域,包括所需更新子窗口的任何區域。
3. 如果 flags 參數的 SW_SCROLLCHILDREN 標志被設置,那么在子窗口的一部分被滾動時,系統將不能完全更新屏幕。位于矩形外邊的滾動子窗體部分不被擦除,也不在它的新方向上被重繪。為了移動子窗體使之完全不在 prcScroll 參數指定的矩形中,可以使用 DeferWindowPos 函數。如果 SW_SCROLLCHILDREN 標志被設置并且插入符矩形和滾動矩形相交重疊,則光標也重新設置。
4. 所有輸入和輸出坐標(prcScroll, prcClip, prcUpdate 和 hrgnUpdate)均被定義為客戶端,無論窗口是否具 CS_OWNDC 或 CS_CLASSDC 類型。必要的話,還可以使用 LPtoDP 和 DPtoLP 函數來轉換邏輯坐標和設備坐標。
?
?
48:RGB 宏
?
宏功能:
RGB 宏有三個參數(byRed, byGreen, byBlue),功能是將這三個參數轉換為COLORREF 顏色值。
注釋:COLORREF 顏色被定義為 DWORD 類型(4 個字節),用于表示 RGB 顏色。
宏定義:
#define RGB(r,g,b)? ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
參數解析:
| 參數 | 含義 |
| byRed | 紅色的顏色值 |
| byGreen | 綠色的顏色值 |
| byBlue | 藍色的顏色值 |
小甲魚忍不住羅嗦補充一句:色彩中不能再分解的基本色稱之為原色,紅綠藍即三原色,將它們按照不同比例混合,可以搭配出所有的顏色。
返回值:
1. 返回三個參數轉換后的 COLORREF 顏色值
備注:
1. 每個顏色可以指定的顏色值是 0 ~ 255,三個參數同時為 0,即黑色,同時為 255 即白色。
2. 通過?GetRValue、GetGValue和 GetBValue 宏可以分別從 COLORREF 顏色值中獲得紅色、綠色、藍色的顏色值。
?
?
49:SetPixel
?
函數功能:
SetPixel 函數將指定坐標處的像素設為指定的顏色。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
COLORREF SetPixel(
??_In_??HDChdc,
??_In_??intx,
??_In_??inty,
??_In_??COLORREFcrColor
);
參數解析:
| 參數 | 含義 |
| hdc | 設備環境句柄 |
| x | 指定要設置的像素點的 X 軸坐標,按邏輯單位表示坐標 |
| y | 指定要設置的像素點的 Y 軸坐標,按邏輯單位表示坐標 |
| crColor | 1. 指定該像素點的顏色 |
注釋:COLORREF 顏色被定義為 DWORD 類型(4 個字節),用于表示 RGB 顏色。
返回值:
1. 如果函數調用成功,那么返回值就是函數設置像素的 RGB 顏色值(這個值可能與 crColor 指定的顏色有所不同,之所以有時發生這種情況是因為沒有找到對指定顏色進行真正匹配造成的);
2. 如果函數調用失敗,那么返回值是 -1。
可以是以下值
| 返回值 | 含義 |
| ERROR_INVALID_PARAMETER | 一個或者多個參數不正確 |
備注:
1. 如果像素點坐標位于當前剪裁區之外,那么該函數執行失敗。
2. 不是所有設備都支持 SetPixel 函數。有關詳情,請參考 GetDeviceCaps。
?
?
?
?
50:GetRValue、GetGValue 和 GetBValue 宏
?
宏功能:
GetRValue、GetGValue 和 GetBValue 宏分別從 RGB 顏色值(COLORREF)中獲得紅色、綠色、藍色的顏色值。
宏定義:
#define GetRValue(rgb)??? ?(LOBYTE(rgb))
#define GetGValue(rgb)??? ?(LOBYTE(((WORD)(rgb)) >> 8))
#define GetBValue(rgb)??? ?(LOBYTE((rgb)>>16))
參數解析:
| 參數 | 含義 |
| rgb | 指定一個 RGB 顏色值(COLORREF) |
返回值:
1. 分別返回三原色(紅色、綠色、藍色)的顏色值。
備注:
顏色值的取值范圍是 0 ~ 255
?
?
?
51:GetPixel
?
函數功能:
GetPixel 函數獲得指定坐標處的像素的 RGB 顏色值。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
COLORREF GetPixel(
??_In_??HDChdc,
??_In_??intnXPos,
??_In_??intnYPos
);
參數解析:
| 參數 | 含義 |
| hdc | 設備環境句柄 |
| nXPos | 指定要獲取的像素點的 X 軸坐標,按邏輯單位表示坐標 |
| nYPos | 指定要獲取的像素點的 Y 軸坐標,按邏輯單位表示坐標 |
返回值:
1. 返回值是 COLORREF 值,指定像素的 RGB(可以通過?GetRValue、GetGValue和 GetBValue 宏分別獲得紅、綠、藍分別的色值);
2. 如果指定的像素點在當前剪裁區之外;那么返回值是 CLR_INVALID。
備注:
1. 如果像素點坐標位于當前剪裁區之外,那么該函數執行失敗。
2. 不是所有設備都支持 GetPixel 函數。有關詳情,請參考 GetDeviceCaps。
3. 位圖必須選入設備環境中,否則也會返回 CLR_INVALID
?
?
?
?
?
?
52:SetPixelV
?
函數功能:
SetPixelV 函數將指定坐標處的像素設為指定的顏色(與?SetPixel?一樣,但效率高一些)。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
BOOL SetPixelV(
??_In_??HDChdc,
??_In_??intX,
??_In_??intY,
??_In_??COLORREFcrColor
);
參數解析:
| 參數 | 含義 |
| hdc | 設備環境句柄 |
| x | 指定要設置的像素點的 X 軸坐標,按邏輯單位表示坐標 |
| y | 指定要設置的像素點的 Y 軸坐標,按邏輯單位表示坐標 |
| crColor | 1. 指定該像素點的顏色 |
注釋:COLORREF 顏色被定義為 DWORD 類型(4 個字節),用于表示 RGB 顏色。
返回值:
1. 如果函數調用成功,返回值為非 0;
2. 如果函數調用失敗,返回值為 0。
備注:
1. 不是所有設備都支持 SetPixelV 函數。有關詳情,請參考 GetDeviceCaps。
2. SetPixelV 函數比 SetPixel 函數快,因為 SetPixelV 不需要返回實際繪制的像素值(返回布爾類型)。
?
?
?
?
53:GetDC
?
函數功能:
GetDC 函數用戶獲得指定窗口的客戶區或整個屏幕的設備環境句柄,隨后,你可以在 GDI 函數中使用該句柄在設備環境中繪圖。
設備環境是一個不公開的數據結構,它的值供 GDI 函數內部使用。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
HDC GetDC(
??_In_??HWNDhWnd
);
參數解析:
| 參數 | 含義 |
| hWnd | 1. 指定的窗口句柄 |
返回值:
1. 如果函數調用成功,返回值是指定窗口的客戶區的設備環境句柄;
2. 如果函數調用失敗,返回值是 NULL。
備注:
1. GetDC 函數根據指定類型的窗口獲得普通的、典型的或特有的設備環境。
2. 對于普通的設備環境,GetDC 函數在每次調用的時候為它賦值默認屬性;對于典型的和特有的設備環境,GetDC函數不改變先前設置的屬性。
3. 在使用普通的設備環境繪圖之后,必須調用?ReleaseDc函數釋放該設備環境;典型的和特有的設備環境則不需要釋放,設備環境的個數僅受有效內存的限制。
4. 有一點要特別注意,GetDC 函數對系統的開銷相對比較大,如果你的應用程序里使用了幾百個 GetDC 函數而又不通過 ReleaseDC 函數釋放的話,那么你機器運行速度將是龜速。
?
?
?
?
?
?
?
54:ReleaseDC
?
函數功能:
ReleaseDC 函數用于釋放設備環境,以供其他應用程序使用。
ReleaseDC 函數的效果取決于設備環境的類型,它只能釋放普通的和窗口設備環境;對于典型的和特有的設備環境則無效。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
int ReleaseDC(
??_In_??HWNDhWnd,
??_In_??HDChDC
);
參數解析:
| 參數 | 含義 |
| hWnd | 指定的窗口句柄 |
| hDC | 指定將要被釋放的設備環境句柄 |
返回值:
返回值說明設備環境是否成功釋放
1. 如果設備環境成功釋放,返回 1;
2. 如果設備環境沒有釋放,返回 0。
備注:
1. 每次調用?GetWindowDC?函數和 GetDC 函數獲得普通的設備環境之后,應用程序必須調用?ReleaseDC?函數來釋放設備環境。
2. 應用程序不能調用?ReleaseDC?函數來釋放由?CreateDC?函數創建的設備環境,CreateDC?創建的設備環境只能使用DeleteDC?函數來刪除。
3.?ReleaseDC?函數必須跟?GetDC?函數同在一個線程內調用。
?
?
?
?
?
?
55:?GetWindowDC
?
函數功能:
GetWindowDC 函數用于獲得的整個窗口(包括非客戶區)的設備環境,例如標題欄、菜單、滾動條,以及邊框。
一個窗口的設備環境允許在任何地方繪畫,因為該設備環境的原點為窗口的左上角,而不是客戶區。
GetWindowDC 函數每次獲得設備環境時都為它賦值默認屬性。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
HDC GetWindowDC(
??_In_??HWNDhWnd
);
參數解析:
| 參數 | 含義 |
| hWnd | 1. 指定的窗口句柄 |
?
小甲魚注釋:如果 hWnd 的值是 NULL,GetWindowDC 函數獲得的是主顯示器(多顯示器的情況下)的設備環境,可以通過調用 EnumDisplayMonitors 和?CreateDC?函數獲得其他顯示器的設備環境。
返回值:
1. 如果函數調用成功,返回值是指定窗口的設備環境句柄;
2. 如果函數調用失敗,返回值是 NULL。
備注:
1. GetWindowDC 函數獲得的設備環境包含窗口的非客戶區,在非客戶區進行繪畫是不推薦的。
2. 可以通過調用?GetSystemMetrics?函數來獲得非客戶區的各個部位(如標題欄、菜單或滾動條等)的尺寸。
3.?GetDC?函數也可用于獲得整個屏幕的設備環境。
4. 繪制結束后,必須調用 ReleaseDC 函數釋放設備環境,如沒有釋放設備環境,對有繪畫需求的應用程序將帶來嚴重的影響。
?
56:CreateDC?
?
函數功能:
CreateDC 函數通過使用指定的名字為一個設備創建設備環境。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_out_ 說明該參數是輸出的,_opt_ 說明該參數是可選參數。
HDC CreateDC(
??LPCTSTRlpszDriver,
??_In_??LPCTSTRlpszDevice,
??LPCTSTRlpszOutput,
??_In_??constDEVMODE *lpInitData
);
參數解析:
| 參數 | 含義 |
| lpszDriver | 1. 指向一個以 NULL 為結束符的字符串指針,它可以是 TEXT("DISPLAY") 或顯示設備的名稱 |
| lpszDevice | 1. 指向一個以 NULL 為結束符的字符串指針,該字符串指定了正在使用的特定輸出設備的名字(注意:不是打印機模式名) |
| lpszOutput | 這個參數必須為 NULL(僅為兼容 16 位系統而存在) |
| lpInitData | 1. 指向一個 DEVMODE 結構,該結構包含指定設備驅動程序初始化時需要的數據 |
返回值:
1. 如果函數調用成功,返回值是指定設備的設備環境句柄;
2. 如果函數調用失敗,返回值是 NULL。
備注:
1. 注意,設備環境的句柄在任何時候都只能由單線程使用。
2. 對于 lpszDriver 和 lpszDevice 參數,可以通過調用 EnumDisplayDevices 函數獲得顯示設備的名字。
3. 如果你不再需要設備環境,請調用?DeleteDC?函數。
?
?
?
?
57:CreateCompatibleDC
?
函數功能:
CreateCompatibleDC 函數創建一個與指定設備兼容的內存設備環境(DC)。
API 函數原型:
注釋:_In_ 說明該參數是輸入的。
HDC CreateCompatibleDC(
??_In_??HDChdc
);
參數解析:
| 參數 | 含義 |
| hdc | 1. 指定一個存在的設備環境句柄 |
返回值:
1. 如果函數調用成功,返回值是內存設備環境句柄;
2. 如果函數調用失敗,返回值是 NULL。
備注:
1. 內存設備環境是僅在內存中的;當內存設備環境被創建時,它的顯示界面是標準的一個單色像素寬和一個單色像素高;在一個應用程序可以使用內存設備環境進行繪圖操作之前,它必須選擇一個高和寬都正確的位圖到設備環境中;可以通過調用 CreateCompatibleBitmap 函數指定高、寬和色彩組合以滿足函數調用的需要。
2. 當一個內存設備環境被創建時,所有的特性都被設置為默認值;可以把內存設備環境當作一個普通的設備環境那樣去使用:可以設置屬性、獲得當前的設置、為它選擇畫筆,刷子和區域。
3. CreateCompatibleDc 函數只適用于支持光柵操作的設備,應用程序可以通過調用?GetDeviceCaps?函數來確定一個設備是否支持這些操作。
4. 當不再需要內存設備環境時,可調用?DeleteDc?函數刪除它。
?
?
?
?
58:CreateMetaFile
?
函數功能:
CreateMetaFile 函數用于創建一個圖元文件的設備環境。
注意:該函數只兼容 Windows 格式的圖元文件;對于新的應用程序,推薦使用功能更加卓越的增強型圖元文件;調用 CreateEnhMetaFile 函數可以創建增強型圖元文件對應的設備環境。
API 函數原型:
注釋:_In_ 說明該參數是輸入的。
HDC CreateMetaFile(
??_In_??LPCTSTRlpszFile
);
參數解析:
| 參數 | 含義 |
| lpszFile | 1. 一個以 NULL 字符為結尾的指針,指向將被創建的 Windows 格式的圖元文件的名稱 |
返回值:
1. 如果函數調用成功,返回值是 Windows 格式的圖元文件的設備環境句柄;
2. 如果函數調用失敗,返回值是 NULL。
?
?
?
?
?
?
?
59:?CloseMetaFile
?
函數功能:
CloseMetaFile 函數用于關閉指定圖元文件的設備環境,并返回一個圖元文件句柄。
注意:該函數只兼容 Windows 格式的圖元文件;對于新的應用程序,推薦使用功能更加卓越的增強型圖元文件;調用 CreateEnhMetaFile 函數可以創建增強型圖元文件對應的設備環境(調用CloseEnhMetaFile 來關閉它)。
API 函數原型:
注釋:_In_ 說明該參數是輸入的。
HMETAFILE CloseMetaFile(
??_In_??HDChdc
);
參數解析:
| 參數 | 含義 |
| hdc | 圖元文件的設備環境句柄,用于創建 Windows 格式的圖元文件 |
返回值:
1. 如果函數調用成功,返回值是 Windows 格式的圖元文件句柄;
2. 如果函數調用失敗,返回值是 NULL。
?
?
?
60:MoveToEx
?
函數功能:
MoveToEx 函數將當前繪圖位置移動到某個具體的點,同時也可獲得之前位置的坐標。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
BOOL MoveToEx(
??_In_??HDC hdc,
??_In_??int X,
??_In_??int Y,
??_Out_??LPPOINTlpPoint
);
?
參數解析:
| 參數 | 含義 |
| hdc | 指定設備環境句柄 |
| X | 指定新位置的 X 軸坐標,按邏輯單位表示坐標 |
| Y | 指定新位置的 Y 軸坐標,按邏輯單位表示坐標 |
| lpPoint | 1. 一個?POINT結構的指針,用于獲得之前位置的坐標 |
返回值:
1. 如果函數調用成功,返回值是非 0;
2. 如果函數調用失敗,返回值是 0。
備注:
1. MoveExTo 函數將影響所有的繪圖函數。
2. 在默認的設備環境中,點 (0, 0) 為最初設定的當前位置。
?
?
?
?
61:LineTo
?
函數功能:
LineTo 函數使用當前畫筆繪制一條線,線段從當前位置連到一個指定的點 (x, y)。
當這個函數調用完畢后,當前位置變成 (x, y)。
小甲魚提示:所繪制的線段并不包含指定的點 (x, y)。
API 函數原型:
注釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
BOOL LineTo(
??_In_??HDChdc,
??_In_??intnXEnd,
??_In_??intnYEnd
);
參數解析:
| 參數 | 含義 |
| hdc | 指定設備環境句柄 |
| nXEnd | 1. 線段終點X坐標位置,采用邏輯坐標表示。 |
| nYEnd | 1. 線段終點Y坐標位置,采用邏輯坐標表示。 |
返回值:
1. 如果函數調用成功,返回值是非 0;
2. 如果函數調用失敗,返回值是 0。
?
?
?
?
62:POINT 結構
?
POINT 結構定義了一個點的 x 坐標和 y 坐標。
結構原型:
typedef struct tagPOINT {
??LONG x;
??LONG y;
} POINT, *PPOINT;
?
成員解析:
| 成員 | 含義 |
| x | 被定義的點的 x 坐標 |
| y | 被定義的點的 y 坐標 |
63:GetCurrentPositionEx?
?
函數功能:
GetCurrentPositionEx 函數用于獲取邏輯坐標中的當前位置。
API 函數原型:
BOOL GetCurrentPositionEx(
??_In_??HDC hdc,
??_Out_??LPPOINTlpPoint
);
參數解析:
| 參數 | 含義 |
| hdc | 指定設備環境句柄 |
| lpPoint | 一個?POINT結構的指針,用于獲得當前邏輯坐標的位置 |
返回值:
1. 如果函數調用成功,返回值是非 0;
2. 如果函數調用失敗,返回值是 0。
?
?
?
64:Polyline
?
函數功能:
Polyline 函數將指定數組的連接點繪制成一系列線段(折線)。
API 函數原型:
注釋:_In_ 說明該參數是輸入的。
BOOL Polyline(
??_In_??HDChdc,
??_In_??constPOINT *lppt,
??_In_??intcPoints
);
參數解析:
| 參數 | 含義 |
| hdc | 指定設備環境句柄 |
| lppt | 一個指向?POINT結構的數組的指針(折線的頂點) |
| cPoints | 1. lppt 參數指向的數組中頂點(POINT結構)的個數 |
返回值:
1. 如果函數調用成功,返回值是非 0;
2. 如果函數調用失敗,返回值是 0。
備注:
1. 該折線是使用當前畫筆,通過將指定數組中的頂點依次連接繪制出來的。
2. 不像?LineTo?或?PolylineTo?函數,Polyline?函數既不會用到當前位置,也不會去修改它。
?
?
?
65:PolylineTo
?
函數功能:
PolylineTo 函數將指定數組的連接點繪制成一系列線段(折線)。
API 函數原型:
注釋:_In_ 說明該參數是輸入的。
BOOL PolylineTo(
??_In_??HDChdc,
??_In_??constPOINT *lppt,
??_In_??DWORDcCount
);
?
參數解析:
| 參數 | 含義 |
| hdc | 指定設備環境句柄 |
| lppt | 一個指向?POINT結構的數組的指針(折線的頂點) |
| cCount | 1. lppt 參數指向的數組中頂點(POINT結構)的個數 |
返回值:
1. 如果函數調用成功,返回值是非 0;
2. 如果函數調用失敗,返回值是 0。
備注:
1. 不像?Polyline<
總結
- 上一篇: 计算机专业常用英语词汇1695
- 下一篇: .net中使用ckeditor4+ckf