函數功能:php
MessageBox 函數用於顯示一個模態對話框,其中包含一個系統圖標、 一組按鈕和一個簡短的特定於應用程序消息,如狀態或錯誤的信息。
消息框中返回一個整數值,該值指示用戶單擊了哪一個按鈕。
API 函數原型:
註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。html
int WINAPI MessageBox(git
_In_opt_ HWNDhWnd,程序員
_In_opt_ LPCTSTRlpText,編程
_In_opt_ LPCTSTRlpCaption,windows
_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 函數,PolylineTo 函數會使用並修改當前位置。
2. 繪畫時,會使用使用當前畫筆,先從當前位置畫一條線鏈接到 lppt 指定的第一個頂點的位置,而後畫到下一個頂點,以此類推。
3. 繪畫完成以後,會將當前位置移動到最後一個頂點的位置。
4. 若是該函數繪製了一個封閉的圖形,那麼該圖形不會被填充。
66:PolyPolyline
函數功能:
PolyPolyline 函數用於同時繪製多條折線。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL PolyPolyline(
_In_ HDChdc,
_In_ constPOINT *lppt,
_In_ constDWORD *lpdwPolyPoints,
_In_ DWORDcCount
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
lppt |
一個指向 POINT 結構的數組的指針(一系列折線上的頂點) |
lpdwPolyPoints |
一個指向數組的指針,數組中每一個元素用於指定 lppt 參數中相應折線的頂點的數量 |
cCount |
lpdwPolyPoints 參數指向的數組的元素數量(折線的數量) |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
1. 該函數繪製的一系類折線都是使用當前畫筆完成。
2. 該函數繪製的圖形並無填充。
3. 該函數既不會用到當前位置,也不會去修改它。
67:GetDeviceCaps
函數功能:
GetDeviceCaps 函數用於得到指定設備的一些特定信息。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
int GetDeviceCaps(
_In_ HDChdc,
_In_ intnIndex
);
參數解析:
參數 |
含義 |
hdc |
設備環境句柄 |
nIndex |
索引值,根據這個索引值該函數得到並返回相應信息的值 |
nIndex 的索引值能夠是如下值:
索引值 |
含義 |
||||||||||||||||||||||||||||||||||
DRIVERVERSION |
設備驅動程序版本 |
||||||||||||||||||||||||||||||||||
TECHNOLOGY |
1. 設備技術,能夠是下列任何一個值:
2. 若是 hdc 參數是加強型圖元文件的設備環境句柄,則設備技術就是給 CreateEnhMetaFile 函數的引用設備,使用 GetObjectType 函數能夠肯定它是否加強型圖元文件的設備環境。 |
||||||||||||||||||||||||||||||||||
HORZSIZE |
物理顯示器的寬度(毫米) |
||||||||||||||||||||||||||||||||||
VERTSIZE |
物理顯示器的高度(毫米) |
||||||||||||||||||||||||||||||||||
HORZRES |
物理顯示器的寬度(像素) |
||||||||||||||||||||||||||||||||||
VERTRES |
物理顯示器的高度(像素) |
||||||||||||||||||||||||||||||||||
LOGPIXELSX |
1. 沿顯示器寬度每邏輯英寸的像素數 |
||||||||||||||||||||||||||||||||||
LOGPIXELSY |
1. 沿顯示器高度每邏輯英寸的像素數 |
||||||||||||||||||||||||||||||||||
BITSPIXEL |
每一個像素的色彩位數 |
||||||||||||||||||||||||||||||||||
PLANES |
色彩平面的數目 |
||||||||||||||||||||||||||||||||||
NUMBRUSHES |
設備指定的畫刷數 |
||||||||||||||||||||||||||||||||||
NUMPENS |
設備指定的畫筆數 |
||||||||||||||||||||||||||||||||||
NUMFONTS |
設備指定的字體數 |
||||||||||||||||||||||||||||||||||
NUMCOLORS |
1. 若是設備的色彩深度不超過 8位/像素點,返回設備的色彩數值 |
||||||||||||||||||||||||||||||||||
ASPECTX |
用於畫線的設備像素的相對寬度 |
||||||||||||||||||||||||||||||||||
ASPECTY |
用於畫線的設備像素的相對高度 |
||||||||||||||||||||||||||||||||||
ASPECTXY |
用於畫線的設備像素的對角線寬度 |
||||||||||||||||||||||||||||||||||
PDEVICESIZE |
保留 |
||||||||||||||||||||||||||||||||||
CLIPCAPS |
1. 顯示設備支持剪切性能的標誌 |
||||||||||||||||||||||||||||||||||
SIZEPALETTE |
1. 系統調色板中的入口數目 |
||||||||||||||||||||||||||||||||||
NUMRESERVED |
1. 系統調色板中保留的入口數目 |
||||||||||||||||||||||||||||||||||
COLORRES |
1. 設備的實際顏色分辨率(位/像素) |
||||||||||||||||||||||||||||||||||
PHYSICALWIDTH |
對於打印設備:設備單位的物理頁面的寬度。例如一個在 8.5 * 11 紙上設置爲 600dpi 的打印機的設備物理單位寬度值爲 5100,注意物理頁面老是大於可打印的頁面面積 |
||||||||||||||||||||||||||||||||||
PHYSICALHEIGHT |
對於打印設備:設備單位的物理頁面的高度。例如一個在 8.5 * 11 紙上設置爲 600dpi 的打印機的設備物理單位高度值爲 6600,注意物理頁面老是大於可打印的頁面面積 |
||||||||||||||||||||||||||||||||||
PHYSICALOFFSETX |
對於打印設備:從物理頁面左邊到打印頁面左邊的距離。例如一個在 8.5 * 11 紙上設置爲 600dpi 的打印機,不能在超出左邊 0.25 英寸的地方打印,且有一個 150 設備單位的水平物理位移 |
||||||||||||||||||||||||||||||||||
PHYSICALOFFSETY |
對於打印設備:從物理頁面上面到打印頁面上邊的距離。例如一個在 8.5 * 11 紙上設置爲 600dpi 的打印機,不能在超出上邊 0.5 英寸的地方打印,且有一個 300 設備單位的垂直物理位移 |
||||||||||||||||||||||||||||||||||
VREFRESH |
對於顯示設備: |
||||||||||||||||||||||||||||||||||
SCALINGFACTORX |
打印機 x 軸的比例係數 |
||||||||||||||||||||||||||||||||||
SCALINGFACTORY |
打印機 y 軸的比例係數 |
||||||||||||||||||||||||||||||||||
BLTALIGNMENT |
1. 首選的水平繪圖調整(表示爲像素的倍數) |
||||||||||||||||||||||||||||||||||
SHADEBLENDCAPS |
該值用於指定顯示設備的陰影和混合性能:
|
||||||||||||||||||||||||||||||||||
RASTERCAPS |
該值用於指定顯示設備的光柵性能:
|
||||||||||||||||||||||||||||||||||
CURVECAPS |
該值用於指定顯示設備繪製曲線的性能:
|
||||||||||||||||||||||||||||||||||
LINECAPS |
該值用於指定顯示設備繪製線段的性能:
|
||||||||||||||||||||||||||||||||||
POLYGONALCAPS |
該值用於指定顯示設備繪製多邊形的性能:
|
||||||||||||||||||||||||||||||||||
TEXTCAPS |
該值用於指定顯示設備繪製文本的性能:
|
||||||||||||||||||||||||||||||||||
COLORMGMTCAPS |
該值用於指定顯示設備顏色管理的性能:
|
返回值:
1. 返回 nIndex 參數指定項的值;
2. 若是 nIndex 參數是 BITSPIXEL, 且設備是具備 15bpp 或 16bpp,返回值是16。
備註:
1. 若是 nIndex 參數的值是 SHADEBLENDCAPS:
對於打印設備:GetDeviceCaps 函數返回任何打印機的報告
對於顯示設備:全部混合操做都支持,除了 SB_NONE,惟一的返回值是 SB_CONST_ALPHA 和 SB_PIXEL_ALPHA,這代表這些操做是否被加速
2. 在多顯示器系統中,若是 hdc 是臺式機,GetDeviceCaps 函數返回主顯示器的功能。若是你想爲其餘顯示器的信息,則必須使用多顯示器的 API 函數或調用 CreateDC 函數獲得一個 hdc 指定顯示器的設備環境。
注意,通常顯示 1 是主顯示器,但並不是老是如此。
3. GetDeviceCaps 提供瞭如下六個索引值爲打印設備轉義符:
索引值 |
打印設備轉義符 |
PHYSICALWIDTH |
GETPHYSPAGESIZE |
PHYSICALHEIGHT |
GETPHYSPAGESIZE |
PHYSICALOFFSETX |
GETPRINTINGOFFSET |
PHYSICALOFFSETY |
GETPHYSICALOFFSET |
SCALINGFACTORX |
GETSCALINGFACTOR |
SCALINGFACTORY |
GETSCALINGFACTOR |
4. 注意:
GetDeviceCaps 函數得到的信息來源於顯示驅動程序。
若是顯示驅動程序拒絕提供任何信息,GetDeviceCaps函數則經過計算固定數據獲得信息。
若是顯示驅動程序報告無效信息,GetDeviceCaps函數返回無效信息。
此外,若是顯示驅動拒絕報告信息,GetDeviceCaps 函數可能計算不正確的信息,由於它假設是固定的 DPI(每英寸點數 96)或固定的大小(取決於顯示驅動程序是否提供)。
不幸的是,實如今 Windows 顯示驅動程序模型(WDDM)(在 Windows Vista 中引入)的顯示驅動程序致使 GDI 拿不到信息,因此 GetDeviceCaps 函數必須經過計算獲得信息。
68:PolyBezier
函數功能:
PolyBezier 函數用於繪製一個或多個貝塞爾曲線。
貝賽爾曲線是一種很是優美的曲線,一條貝賽爾樣條由4個定義點定義:兩個端點和兩個控制點。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL PolyBezier(
_In_ HDChdc,
_In_ constPOINT *lppt,
_In_ DWORDcPoints
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
lppt |
1. 一個指向 POINT 結構的數組的指針,該數組包含端點和控制點的座標 |
cPoints |
指明 lppt 指向的數組中點的個數 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
1. PolyBezier 函數經過使用由 lppt 參數指定的端點和控制點繪製一條或多條三次貝塞爾曲線。
2. 第一條貝塞爾曲線的四個點依次是:起點、第一控制點、第二控制點和終點;隨後的每一條貝塞爾曲線則只需給出三個點,由於前一條貝塞爾曲線的終點會被看成後一條貝塞爾曲線的起點,以此類推。
3. 繪製一系列相連的貝塞爾曲線時,僅當第一條貝塞爾曲線的第二個控點、第一條貝塞爾曲線的終點(也就是第二條貝塞爾曲線的起點)與第二條貝塞爾曲線的第一個控點是線性關係時(即三點共線時),曲線在鏈接點處纔是平滑的。
69: PolyBezierTo
函數功能:
PolyBezierTo 函數用於繪製一個或多個貝塞爾曲線。
貝賽爾曲線是一種很是優美的曲線,一條貝賽爾樣條由4個定義點定義:兩個端點和兩個控制點。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL PolyBezierTo(
_In_ HDChdc,
_In_ constPOINT *lppt,
_In_ DWORDcCount
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
lppt |
1. 一個指向 POINT 結構的數組的指針,該數組包含端點和控制點的座標 |
cCount |
指明 lppt 指向的數組中點的個數,該值必須是要繪製的貝塞爾曲線的數量的三倍 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
1. PolyBezierTo 函數經過使用由 lppt 參數指定的端點和控制點繪製一條或多條三次貝塞爾曲線。
2. 第一條貝塞爾曲線是從當前位置做爲起點開始繪製,鏈接前三個點,分別是:第一控制點、第二控制點和終點;隨後的每一條貝塞爾曲線則只需給出三個點,由於前一條貝塞爾曲線的終點會被看成後一條貝塞爾曲線的起點,以此類推。
3. PolyBezierTo 函數將移動當前位置到最後一條貝塞爾曲線的終點。
70:Rectangle
函數功能:
Rectangle 函數用於繪製一個矩形。
該矩形用當前畫筆繪製輪廓,用當前畫刷填充。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL Rectangle(
_In_ HDChdc,
_In_ intxLeft,
_In_ intyTop,
_In_ intxRight,
_In_ intyBottom
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
xLeft |
指定矩形左上角的邏輯 x 座標 |
yTop |
指定矩形左上角的邏輯 y 座標 |
xRight |
指定矩形右下角的邏輯 x 座標 |
yBottom |
指定矩形右下角的邏輯 y 座標 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
1. 該函數既不使用當前位置,也不修改當前位置。
2. 寫過圖形程序的程序員一般熟悉邊界誤差(off-by-one)的問題:一些圖形程序系統畫出的圖形包含了右座標和底座標表示的點,一些則只畫到右座標和底座標表示的點以前的一點。Windows 使用後一種方法。
3. 若是使用 PS_NULL 畫筆,則矩形的尺寸高和寬比實際少一個像素。
71:Ellipse
函數功能:
Ellipse 函數用於繪製一個橢圓,橢圓的中心是限定矩形的中心。
該橢圓用當前畫筆繪製輪廓,用當前畫刷填充。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL Ellipse(
_In_ HDChdc,
_In_ intxLeft,
_In_ intyTop,
_In_ intxRight,
_In_ intyBottom
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
xLeft |
指定橢圓限定矩形左上角的邏輯 x 座標 |
yTop |
指定橢圓限定矩形左上角的邏輯 y 座標 |
xRight |
指定橢圓限定矩形右下角的邏輯 x 座標 |
yBottom |
指定橢圓限定矩形右下角的邏輯 y 座標 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
該函數既不使用當前位置,也不修改當前位置。
72:RoundRect
函數功能:
RoundRect 函數用於繪製一個帶圓角的矩形。該矩形用當前畫筆繪製輪廓,用當前畫刷填充。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL RoundRect(
_In_ HDChdc,
_In_ intxLeft,
_In_ intyTop,
_In_ intxRight,
_In_ intyBottom,
_In_ intxCornerEllipse,
_In_ intyCornerEllipse
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
xLeft |
指定限定矩形的左上角的邏輯 x 座標 |
yTop |
指定限定矩形的左上角的邏輯 y 座標 |
xRight |
指定限定矩形的右下角的邏輯 x 座標 |
yBottom |
指定限定矩形的右下角的邏輯 y 座標 |
xCornerEllipse |
指定用來畫圓角的橢圓的寬 |
yCornerEllipse |
指定用來畫圓角的橢圓的高 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
該函數既不使用當前位置,也不修改當前位置。
73:Arc
函數功能:
Arc 函數用於繪製一個橢圓的圓弧。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL Arc(
_In_ HDChdc,
_In_ intxLeft,
_In_ intyTop,
_In_ intxRight,
_In_ intyBottom,
_In_ intxStart,
_In_ intyStart,
_In_ intxEnd,
_In_ intyEnd
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
xLeft |
指定限定矩形的左上角的邏輯 x 座標 |
yTop |
指定限定矩形的左上角的邏輯 y 座標 |
xRight |
指定限定矩形的右下角的邏輯 x 座標 |
yBottom |
指定限定矩形的右下角的邏輯 y 座標 |
xStart |
指定圓弧開始的邏輯 x 座標 |
yStart |
指定圓弧開始的邏輯 y 座標 |
xEnd |
指定圓弧結束的邏輯 x 座標 |
yEnd |
指定圓弧結束的邏輯 y 座標 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
1. 點 (xLeft, yTop) 和點 (xRight, yBottom) 指定限定矩形的位置。
2. 由指定的限定矩形造成的橢圓定義弧的曲線。
3. 弧的起始點 (xStart, yStart) 開始和終點 (xEnd, yEnd) 並不在橢圓上,而是定義爲在橢圓的中心的延長線上(不懂的魚油請看上圖)。
4. 若是橢圓的起始點和終點是同一個點,那麼將繪製整個橢圓。
74:Chord
函數功能:
Chord 函數繪製不只繪製一條弧,還會鏈接弧的兩個端點鏈接一條弦,最後構成一個弓形的封閉區域。
該弓形用當前畫筆繪製輪廓,用當前畫刷填充。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL Chord(
_In_ HDChdc,
_In_ intxLeft,
_In_ intyTop,
_In_ intxRight,
_In_ intyBottom,
_In_ intxStart,
_In_ intyStart,
_In_ intxEnd,
_In_ intyEnd
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
xLeft |
指定限定矩形的左上角的邏輯 x 座標 |
yTop |
指定限定矩形的左上角的邏輯 y 座標 |
xRight |
指定限定矩形的右下角的邏輯 x 座標 |
yBottom |
指定限定矩形的右下角的邏輯 y 座標 |
xStart |
指定圓弧開始的邏輯 x 座標 |
yStart |
指定圓弧開始的邏輯 y 座標 |
xEnd |
指定圓弧結束的邏輯 x 座標 |
yEnd |
指定圓弧結束的邏輯 y 座標 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
1. 弦對應的曲線(弧)由限定矩形畫出的橢圓所指定。
2. 曲線(弧)的起始點 (xStart, yStart) 開始和終點 (xEnd, yEnd) 並不在橢圓上,而是定義爲在橢圓的中心的延長線上(不懂的魚油請看上圖)。
3. 若是橢圓的起始點和終點是同一個點,那麼將繪製整個橢圓。
4. 該函數既不使用當前位置,也不修改當前位置。
75:Pie
函數功能:
Pie 函數繪製一個由弧以及橢圓中心構成的扇形。該扇形用當前畫筆繪製輪廓,用當前畫刷填充。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL Pie(
_In_ HDChdc,
_In_ intxLeft,
_In_ intyTop,
_In_ intxRight,
_In_ intyBottom,
_In_ intxStart,
_In_ intyStart,
_In_ intxEnd,
_In_ intyEnd
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
xLeft |
指定限定矩形的左上角的邏輯 x 座標 |
yTop |
指定限定矩形的左上角的邏輯 y 座標 |
xRight |
指定限定矩形的右下角的邏輯 x 座標 |
yBottom |
指定限定矩形的右下角的邏輯 y 座標 |
xStart |
指定圓弧開始的邏輯 x 座標 |
yStart |
指定圓弧開始的邏輯 y 座標 |
xEnd |
指定圓弧結束的邏輯 x 座標 |
yEnd |
指定圓弧結束的邏輯 y 座標 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
1. 扇形對應的曲線(弧)由限定矩形畫出的橢圓所指定。
2. 曲線(弧)的起始點 (xStart, yStart) 開始和終點 (xEnd, yEnd) 並不在橢圓上,而是定義爲在橢圓的中心的延長線上(不懂的魚油請看上圖)。
3. 該函數既不使用當前位置,也不修改當前位置。
76:GetStockObject
函數功能:
GetStockObject 函數用於得到 Windows 預設的畫筆、畫刷、字體或者調色板的句柄。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
HGDIOBJ GetStockObject(
_In_ intfnObject
);
參數解析:
參數 |
含義 |
fnObject |
指定待獲取對象的類型,具體參考下邊。 |
fnObject 可取以下值之一:
值 |
含義 |
BLACK_BRUSH |
黑色畫刷 |
DKGRAY_BRUSH |
暗灰色畫刷 |
DC_BRUSH |
1. 純色畫刷,默認顏色是白色的 |
GRAY_BRUSH |
灰色畫刷 |
HOLLOW_BRUSH |
空畫刷(至關於 NULL_BRUSH) |
LTGRAY_BRUSH |
淺灰色畫刷 |
NULL_BRUSH |
空畫刷(至關於 HOLLOW_BRUSH) |
WHITE_BRUSH |
白色畫刷 |
BLACK_PEN |
黑色畫筆 |
DC_PEN |
1. 純色畫筆,默認顏色是白色的 |
NULL_PEN |
空畫筆(空畫筆不繪製任何東西) |
WHITE_PEN |
白色畫筆 |
ANSI_FIXED_FONT |
Windows 中的固定間距(等寬)系統字體 |
ANSI_VAR_FONT |
Windows 中的可變間距(比例間距)系統字體 |
DEVICE_DEFAULT_FONT |
設備相關字體 |
DEFAULT_GUI_FONT |
1. 用戶界面對象(如菜單、對話框)的默認字體 |
OEM_FIXED_FONT |
原始設備製造商(OEM)相關固定間距(等寬)字體 |
SYSTEM_FONT |
1. 系統字體 |
SYSTEM_FIXED_FONT |
1. 固定間距(等寬)系統字體 |
DEFAULT_PALETTE |
默認調色板(該調色板由系統調色板中的靜態色彩組成) |
返回值:
1. 若是函數調用成功,返回值是所申請的邏輯對象的句柄;
2. 若是函數調用失敗,返回值是 NULL。
備註:
1. 不建議您使用該函數得到對話框和窗口的當前字體。應該使用 SystemParametersInfo 函數(SPI_GETNONCLIENTMETRICS參數)來得到當前字體,由於 SystemParametersInfo 函數將考慮到當前主題,並提供了標題欄,菜單和消息對話框的字體信息。
2. 僅在窗口風格爲 CS_HREDRAW 和 CS_VREDRAW 中,才能使用 DKGRAY_BRUSH、GRAY_BRUSH 和 LTGRAY_BRUSH 對象。若是在其餘風格的窗口中使灰色畫刷,可能致使在窗口移動或改變大小以後出現畫刷模式錯位現象,原始畫刷不能被調整。
3. HOLLOW_BRUSH 和 NULL_BRUSH 對象是同樣的。
4. 沒必要要經過調用 DeleteObject 函數來刪除 Windows 預設的對象。
5. DC_BRUSH 和 DC_PEN 都能與其餘對象如 BLACK_BRUSH 和 BLACK_PEN 相互交換。具體請參考 GetDCBrushColor 函數、SetDCBrushColor 函數、GetDCPenColor 函數和 SetDCPenColor 函數。
77:SelectObject
函數功能:
SelectObject 函數用於選擇一對象到指定的設備環境中,該新對象將替換先前的相同類型的對象。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
HGDIOBJ SelectObject(
_In_ HDChdc,
_In_ HGDIOBJhgdiobj
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
hgdiobj |
1. 被選擇的對象的句柄 |
hgdiobj 參數的對象必需由如下的函數建立:
對象 |
函數 |
位圖 |
CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection |
畫刷 |
CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush |
字體 |
CreateFont, CreateFontIndirect |
畫筆 |
CreatePen, CreatePenIndirect |
區域 |
CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect |
返回值:
1. 若是選擇對象不是區域而且函數調用成功,那麼返回值是被取代的對象的句柄;
2. 若是選擇對象是區域而且函數執行成功,返回如下值之一:
值 |
含義 |
SIMPLEREGION |
區域由單個矩形組成 |
COMPLEXREGION |
區域由多個矩形組成 |
NULLREGION |
區域爲空 |
3. 若是發生錯誤而且選擇對象不是一個區域,那麼返回值爲 NULL,不然返回 HGDI_ERROR。
備註:
1. 該函數返回先前指定類型的選擇對象。
2. 一個應用程序在它使用新對象進行繪製完成以後,應該用原始的默認對象替換新對象。
3. 應用程序不能同時選擇一個位圖到多個設備環境中。
4. ICM:若是被選擇的對象是畫筆或筆,那麼就執行顏色管理。
78:CreatePen
函數功能:
CreatePen 函數用指定的樣式、寬度和顏色建立一個邏輯畫筆。建立的畫筆隨後能夠被選擇到設備環境中,並用於繪製直線和曲線。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
HPEN CreatePen(
_In_ intfnPenStyle,
_In_ intnWidth,
_In_ COLORREFcrColor
);
參數解析:
參數 |
含義 |
fnPenStyle |
指定畫筆樣式,詳細內容請看下邊 |
nWidth |
1. 指定畫筆的寬度 |
crColor |
1. 指定畫筆的 RGB 顏色 |
fnPenStyle 參數指定畫筆樣式爲以下值之一:
值 |
含義 |
PS_SOLID |
實線 |
PS_DASH |
虛線(nWidth 參數的值必須 <= 1) |
PS_DOT |
點線(nWidth 參數的值必須 <= 1) |
PS_DASHDOT |
點劃線(nWidth 參數的值必須 <= 1) |
PS_DASHDOTDOT |
點點劃線(nWidth 參數的值必須 <= 1) |
PS_NULL |
該畫筆看不見 |
PS_INSIDEFRAME |
該畫筆用於在 GDI 函數繪圖中實現,繪製橢圓、矩形、圓角矩形、餅圖以及弦等生成的封閉對象框時,畫筆寬度向內擴展。 |
返回值:
1. 若是函數調用成功,返回值是新畫筆的句柄;
2. 若是函數調用失敗,返回值是 NULL。
備註:
1. 調用該函數建立新畫筆以後,可使用 SelectObject 函數將新畫筆選入設備環境中。只有當畫筆被選入設備環境,才能使用該畫筆繪製線段或曲線。
2. 若是 nWidth 參數的值是 0,則畫筆爲一個像素寬度,無論當前的映射模式。
3. 若是 nWidth 參數的值大於 1,則fnPenStyle 參數的值必須爲 PS_NULL, PS_SOLID 或 PS_INSIDEFRAME 的其中一個。
4. 若是 nWidth 參數的值大於 1,且fnPenStyle 參數的值爲 PS_INSIDEFRAME,全部與該畫筆相關聯(除了折線和多邊形)的封閉圖形繪製,畫筆寬度向內擴展。
5. 若是 nWidth 參數的值大於 1,且fnPenStyle 參數的值爲 PS_INSIDEFRAME,若是指定的 RGB 顏色不存在,就進行抖動處理。
6. 若是你不再須要該畫筆,可使用 DeleteObject 函數將其刪除。
79:LOGPEN 結構
LOGPEN 結構
LOGPEN 結構定義了畫筆、圖形對象用於繪製線條和邊框的寬度、樣式和顏色。CreatePenIndirect 函數須要使用到 LOGPEN 結構。
結構原型:
typedef struct tagLOGPEN {
UINT lopnStyle;
POINT lopnWidth;
COLORREFlopnColor;
} LOGPEN, *PLOGPEN;
成員解析:
成員 |
含義 |
lopnStyle |
指定畫筆樣式,詳細內容請看下邊 |
lopnWidth |
1. 指定畫筆的寬度 |
lopnColor |
1. 指定畫筆的 RGB 顏色 |
lopnStyle 成員指定畫筆樣式爲以下值之一:
值 |
含義 |
PS_SOLID |
實線 |
PS_DASH |
虛線(nWidth 參數的值必須 <= 1) |
PS_DOT |
點線(nWidth 參數的值必須 <= 1) |
PS_DASHDOT |
點劃線(nWidth 參數的值必須 <= 1) |
PS_DASHDOTDOT |
點點劃線(nWidth 參數的值必須 <= 1) |
PS_NULL |
該畫筆看不見 |
PS_INSIDEFRAME |
該畫筆用於在 GDI 函數繪圖中實現,繪製橢圓、矩形、圓角矩形、餅圖以及弦等生成的封閉對象框時,畫筆寬度向內擴展。 |
備註:
1. 若是 lopnWidth 成員的值大於 1,且 lopnStyle 成員的值爲 PS_INSIDEFRAME,全部與該畫筆相關聯(除了折線和多邊形)的封閉圖形繪製,畫筆寬度向內擴展。
2. 若是指定的 RGB 顏色不存在,就進行抖動處理。
3. 若是 lopnWidth 成員的值小於等於 1,則 PS_INSIDEFRAME 樣式與 PS_SOLID 相同。
80: CreatePenIndirect
函數功能:
CreatePenIndirect 函數根據指定的 LOGPEN結構建立一個畫筆。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
HPEN CreatePenIndirect(
_In_ constLOGPEN *lplgpn
);
參數解析:
返回值:
1. 若是函數調用成功,返回值是新畫筆的句柄;
2. 若是函數調用失敗,返回值是 NULL。
備註:
1. 調用該函數建立新畫筆以後,可使用 SelectObject 函數將新畫筆選入設備環境中。只有當畫筆被選入設備環境,才能使用該畫筆繪製線段或曲線。
2. 若是你不再須要該畫筆,可使用 DeleteObject 函數將其刪除。
81: DeleteObject
函數功能:
DeleteObject 函數用於刪除一個邏輯畫筆、畫刷、字體、位圖、區域或者調色板,釋放全部與該對象有關的系統資源。
注意,在對象被刪除以後,指定的句柄也就失效了。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL DeleteObject(
_In_ HGDIOBJhObject
);
參數解析:
參數 |
含義 |
hObject |
指定待刪除的邏輯畫筆、畫刷、字體、位圖、區域或者調色板的句柄 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是指定的句柄無效或者它已被選入設備環境,則返回值是 0。
備註:
1. 當一個繪畫對象(如畫筆或畫刷)當前被選入一個設備環境中時,不要刪除該對象。
2. 當一個畫刷被刪除時,與該畫刷相關的位圖並不被刪除,該圖必須單獨地刪除。
82:GetObject
函數功能:
GetObject 函數用於得到指定圖形對象的信息。
API 函數原型:
註釋:_In_ 說明該參數是輸入的,__Out__ 說明該參數是輸出的。
int GetObject(
_In_ HGDIOBJ hgdiobj,
_In_ int cbBuffer,
_Out_ LPVOIDlpvObject
);
參數解析:
參數 |
含義 |
hgdiobj |
1. 指定目標圖形對象的句柄 |
cbBuffer |
指定將要寫到緩衝區的信息的字節數 |
lpvObject |
指向一個緩衝區的指針(該緩衝區將用於存放指定圖形對象的信息) |
下邊列出的是緩衝區得到的每種圖形對象的信息類型(經過 hgdiobj 參數指定)
對象類型 |
寫入到緩衝區的數據 |
HBITMAP |
BITMAP 結構 |
HBITMAP(經過調用 CreateDIBSection 函數得到) |
1. DIBSECTION 結構(若是 cbBuffer 參數的值被設置爲 sizeof (DIBSECTION)) |
HPALETTE |
邏輯調色板的顏色數(WORD 類型) |
HPEN(經過調用 ExtCreatePen 函數得到) |
EXTLOGPEN 結構 |
HPEN |
|
HBRUSH |
LOGBRUSH 結構 |
HFONT |
LOGFONT 結構 |
註釋:lpvObject 參數指向的地址必須是 4 字節的倍數,不然 GetObject 函數調用失敗。
返回值:
1. 若是函數調用成功,且 lpvObject 參數是一個有效的指針,則返回值是存儲到緩衝區的字節數;
2. 若是函數調用成功,而 lpvObject 參數是 NULL,則返回值是須要存儲到緩衝區的信息的字節數;
3. 若是函數調用失敗,返回值是 0。
備註:
1. lpvObject 參數指向的緩衝區必定要足夠大以接收圖形對象的信息。
2. 若是 hgdiobj 參數指定一個由調用 CreateDIBSection 函數建立的位圖,且指定的緩衝區足夠大,則 GetObject 函數返回一個 DIBSECTION 結構。
3. 若是 hgdiobj 參數指定一個經過其餘途徑建立的位圖,則 GetObject 只返回位圖的寬、高和顏色格式信息,經過調用 GetDIBits 或 GetBitmapBits 函數能夠獲得位置的位值。
4. 若是 hgdiobj 參數指定一個邏輯調色板,則 GetObject 得到一個 2 字節的整數,該整數指定調色板中的項數,函數不會得到定義調色板的LOGPALETTE 結構,爲了得到有關調色板項的信息,應用程序能夠調用 GetPaletteEntries 函數。
83: GetCurrentObject
函數功能:
GetCurrentObject 函數用於得到被選入指定環境設備中的指定對象類型的句柄。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
HGDIOBJ GetCurrentObject(
_In_ HDChdc,
_In_ UINTuObjectType
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
uObjectType |
指定要獲取的對象類型 |
uObjectType 參數能夠是下邊任意一值:
值 |
含義 |
OBJ_BITMAP |
返回指定設備環境選入的位圖 |
OBJ_BRUSH |
返回指定設備環境選入的畫刷 |
OBJ_COLORSPACE |
返回指定設備環境選入的色彩空間 |
OBJ_FONT |
返回指定設備環境選入的字體 |
OBJ_PAL |
返回指定設備環境選入的調色板 |
OBJ_PEN |
返回指定設備環境選入的畫筆 |
返回值:
1. 若是函數調用成功,返回值是指定對象的句柄;
2. 若是函數調用失敗,返回值是 NULL。
備註:
應用程序可使用 GetCurrentObject 函數和 GetObject 函數來得到對當前選入給定設備環境的圖形對象的描述。
84:SetDCBrushColor
函數功能:
SetDCBrushColor 函數用於設置指定設備環境中的畫刷對象的顏色值。若是設備不能提供指定的顏色值,那麼就把顏色設置爲最近的物理顏色。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
COLORREF SetDCBrushColor(
_In_ HDChdc,
_In_ COLORREFcrColor
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
crColor |
指定新的畫刷顏色 |
返回值:
1. 若是函數調用成功,返回值是指定設備環境先前的畫刷顏色值(COLORREF 類型);
2. 若是函數調用失敗,返回值是 CLR_INVALID。
備註:
1. 當在一個設備環境中選擇系統預設的 DC_BRUSH 時,之後全部的繪圖操做將使用設備環境中的畫刷顏色,直到系統預設的畫刷被取消選擇爲止,默認的 DC_BRUSH 顏色是 WHITE。
2. 該函數將返回先前的 DC_BRUSH 顏色,即便在設備環境中沒有選擇系統預設的畫刷 DC_BRUSH。然而,除非系統預設的 DC_BRUSH 被選擇入設備環境,不然繪圖操做將不使用它。
3. 使用 DC_PEN 或 DC_BRUSH 參數的 GetStockObject 函數能夠與 SetDCPenColor 函數和 SetDCBrushColor 函數互換。
85:SetDCPenColor
函數功能:
SetDCPenColor 函數用於設置指定設備環境中的畫筆對象的顏色值。若是設備不能提供指定的顏色值,那麼就把顏色設置爲最近的物理顏色。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
COLORREF SetDCPenColor(
_In_ HDChdc,
_In_ COLORREFcrColor
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
crColor |
指定新的畫筆顏色 |
返回值:
1. 若是函數調用成功,返回值是指定設備環境先前的畫筆顏色值(COLORREF 類型);
2. 若是函數調用失敗,返回值是 CLR_INVALID。
備註:
1. 該函數將返回先前的 DC_PEN 顏色,即便在設備環境中沒有選擇系統預設的畫筆 DC_PEN。然而,除非系統預設的 DC_PEN 被選擇入設備環境,不然繪圖操做將不使用它。
2. 使用 DC_PEN 或 DC_BRUSH 參數的 GetStockObject 函數能夠與 SetDCPenColor 函數和 SetDCBrushColor 函數互換。
86: GetDCBrushColor
函數功能:
GetDCBrushColor 函數用於得到指定設備環境的當前畫刷顏色。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
COLORREF GetDCBrushColor(
_In_ HDChdc
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
返回值:
1. 若是函數調用成功,返回值是指定設備環境的當前畫刷顏色(COLORREF 類型);
2. 若是函數調用失敗,返回值是 CLR_INVALID。
備註:
1. 有關設置指定設備環境的當前畫刷顏色,請參考:SetDCBrushColor 函數。
ICM:若是ICM可用就執行顏色管理。
87:GetDCPenColor
函數功能:
GetDCPenColor 函數用於得到指定設備環境的當前畫筆顏色。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
COLORREF GetDCPenColor(
_In_ HDChdc
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
返回值:
1. 若是函數調用成功,返回值是指定設備環境的當前畫筆顏色(COLORREF 類型);
2. 若是函數調用失敗,返回值是 CLR_INVALID。
備註:
1. 有關設置指定設備環境的當前畫刷顏色,請參考:SetDCPenColor 函數。
ICM:若是ICM可用就執行顏色管理。
88:SetBkColor
函數功能:
SetBkColor 函數用於設置當前的背景顏色。若是指定的顏色值超出了當前設備的表示範圍,則設置爲最近似的、設備能夠表示的顏色。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
COLORREF SetBkColor(
_In_ HDChdc,
_In_ COLORREFcrColor
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
crColor |
新的背景顏色值(使用 RGB宏得到 COLORREF 類型) |
返回值:
1. 若是函數調用成功,返回值是先前背景的顏色值(COLORREF 類型);
2. 若是函數調用失敗,返回值是 CLR_INVALID。
備註:
1. 該函數填充由 CreatePen 函數建立出來的非實線畫筆之間的空隙(例如點線畫筆,填充的是畫筆間點和線的空隙,不是客戶區的背景顏色哦)。
2. 該函數不會填充由 ExtCreatePen 函數建立出來的畫筆。
3. 該函數也能夠用於填充 TextOut 函數和 ExtTextOut 函數輸出字符的背景顏色。
4. 若是背景顏色設置爲不透明(OPAQUE)時,背景顏色用來填充非實線畫筆風格的間隙、陰影畫刷和字符的背景顏色。
89:SetBkMode
函數功能:
SetBkMode 函數用於設置字符、陰影畫刷和非實線畫筆的背景模式。
API 函數檔案:
註釋:_In_ 說明該參數是輸入的。
int SetBkMode(
_In_ HDChdc,
_In_ intiBkMode
);
參數解析:
參數 |
含義 |
||||
hdc |
指定設備環境句柄 |
||||
iBkMode |
背景模式:
|
返回值:
1. 若是函數調用成功,返回值是先前的背景模式;
2. 若是函數調用失敗,返回值是 0。
備註:
1. 該函數將影響到由 CreatePen 函數建立的非實線畫筆。
2. 該函數並不會影響到由 ExtCreatePen 函數建立的畫筆。
90:SetROP2
函數功能:
SetROP2 函數用於設置當前的前景色混合模式(繪圖模式)。GDI 使用前景色混合模式,將畫筆的顏色和畫線顯示區域的顏色混合後顯示出來。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
int SetROP2(
_In_ HDChdc,
_In_ intfnDrawMode
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
fnDrawMode |
繪圖模式,即混合模式,具體請看下邊。 |
fnDrawMode 參數指定的混合模式能夠是如下值之一:
混合模式 |
含義 |
R2_BLACK |
顯示的顏色老是黑色 |
R2_COPYPEN |
顯示當前畫筆的顏色 |
R2_MASKNOTPEN |
顯示的顏色是畫筆顏色的取反值和屏幕顏色的交集,即:R2_NOTCOPYPEN & 屏幕顏色 |
R2_MASKPEN |
顯示的顏色是畫筆顏色和屏幕顏色的交集,即:R2_COPYPEN & 屏幕顏色 |
R2_MASKPENNOT |
顯示的顏色是畫筆顏色和屏幕顏色的取反值的交集,即:R2_COPYPEN & R2_NOT |
R2_MERGENOTPEN |
顯示的顏色是畫筆顏色的取反值和屏幕顏色的並集,即:R2_NOTCOPYPEN | 屏幕顏色 |
R2_MERGEPEN |
顯示的顏色是畫筆顏色和屏幕顏色的並集,即:R2_COPYPEN | 屏幕顏色 |
R2_MERGEPENNOT |
顯示的顏色是畫筆顏色和屏幕顏色的取反值的並集,即:R2_COPYPEN | R2_NOT |
R2_NOP |
不操做,顏色保持不變 |
R2_NOT |
顯示的顏色是屏幕顏色的取反值 |
R2_NOTCOPYPEN |
顯示的顏色是當前畫筆顏色的取反值 |
R2_NOTMASKPEN |
顯示的顏色是畫筆顏色和屏幕顏色的交集的取反值,即:~R2_MASKPEN |
R2_NOTMERGEPEN |
顯示的顏色是畫筆顏色和屏幕顏色的並集的取反值,即:~R2_MERGEPEN |
R2_NOTXORPEN |
顯示的顏色是畫筆顏色和屏幕顏色的異或結果的取反值,即:~R2_XORPEN |
R2_WHITE |
顯示的顏色老是白色 |
R2_XORPEN |
顯示的顏色是畫筆顏色和屏幕顏色的異或結果,即:R2_COPYPEN ^ 屏幕顏色 |
返回值:
1. 若是函數調用成功,返回值是先前的混合模式(繪圖模式);
2. 若是函數調用失敗,返回值是 0。
備註:
1. 當使用一個畫筆進行繪製時,其實是在將畫筆的像素顏色和目標顯示錶面的像素顏色按位進行布爾運算。
2. 對像素顏色執行一個按位布爾運算稱爲「光柵操做」(Raster Operation, ROP),簡稱「ROP」,由於只涉及兩種像素顏色(即畫筆和屏幕),因此這裏的布爾運算就被稱爲「二元光柵操做」,或者「ROP2」。
3. 混合模式(繪圖模式)僅支持光柵設備,並不支持矢量設備。
91:GetROP2
函數功能:
GetROP2 函數用於獲取指定設備環境的前景色混合模式(繪圖模式)。GDI 使用前景色混合模式,將畫筆的顏色和畫線顯示區域的顏色混合後顯示出來。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
int GetROP2(
_In_ HDChdc
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
返回值:
1. 若是函數調用成功,返回值是指定設備環境的前景色混合模式;
2. 若是函數調用失敗,返回值是 0。
備註:
前景色混合模式能夠是如下值:
混合模式 |
含義 |
R2_BLACK |
顯示的顏色老是黑色 |
R2_COPYPEN |
顯示當前畫筆的顏色 |
R2_MASKNOTPEN |
顯示的顏色是畫筆顏色的取反值和屏幕顏色的交集,即:R2_NOTCOPYPEN & 屏幕顏色 |
R2_MASKPEN |
顯示的顏色是畫筆顏色和屏幕顏色的交集,即:R2_COPYPEN & 屏幕顏色 |
R2_MASKPENNOT |
顯示的顏色是畫筆顏色和屏幕顏色的取反值的交集,即:R2_COPYPEN & R2_NOT |
R2_MERGENOTPEN |
顯示的顏色是畫筆顏色的取反值和屏幕顏色的並集,即:R2_NOTCOPYPEN | 屏幕顏色 |
R2_MERGEPEN |
顯示的顏色是畫筆顏色和屏幕顏色的並集,即:R2_COPYPEN | 屏幕顏色 |
R2_MERGEPENNOT |
顯示的顏色是畫筆顏色和屏幕顏色的取反值的並集,即:R2_COPYPEN | R2_NOT |
R2_NOP |
不操做,顏色保持不變 |
R2_NOT |
顯示的顏色是屏幕顏色的取反值 |
R2_NOTCOPYPEN |
顯示的顏色是當前畫筆顏色的取反值 |
R2_NOTMASKPEN |
顯示的顏色是畫筆顏色和屏幕顏色的交集的取反值,即:~R2_MASKPEN |
R2_NOTMERGEPEN |
顯示的顏色是畫筆顏色和屏幕顏色的並集的取反值,即:~R2_MERGEPEN |
R2_NOTXORPEN |
顯示的顏色是畫筆顏色和屏幕顏色的異或結果的取反值,即:~R2_XORPEN |
R2_WHITE |
顯示的顏色老是白色 |
R2_XORPEN |
顯示的顏色是畫筆顏色和屏幕顏色的異或結果,即:R2_COPYPEN ^ 屏幕顏色 |
92:Polygon
函數功能:
Polygon 函數用於繪製一個由直線相連的兩個以上頂點組成的多邊形。該函數用當前畫筆繪製多邊形的輪廓,用當前畫刷和多邊形填充模式填充多邊形。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL Polygon(
_In_ HDChdc,
_In_ constPOINT *lpPoints,
_In_ intnCount
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
lpPoints |
指向用於指定多邊形頂點的 POINT結構數組的指針 |
nCount |
指定數組中頂點的個數,此值必須大於等於 2 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
1. 該函數會自動鏈接最後一個頂點和第一個頂點,構成一個閉合的多邊形(Polyline 函數不會這麼作)。
2. 該函數並不會使用和改變當前位置。
93:PolyPolygon
函數功能:
PolyPolygon 函數用於一系列多邊形。該函數用當前畫筆繪製多邊形的輪廓,用當前畫刷和多邊形填充模式填充多邊形。
該函數繪製的多邊形能夠重疊。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
BOOL PolyPolygon(
_In_ HDChdc,
_In_ constPOINT *lpPoints,
_In_ constINT *lpPolyCounts,
_In_ intnCount
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
lpPoints |
指向用於指定全部多邊形頂點的 POINT結構數組的指針 |
lpPolyCounts |
1. 一個指向數組的指針,數組中每一個元素用於指定相應多邊形的頂點的數量 |
nCount |
總共繪製多邊形的數量 |
返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。
備註:
1. 該函數並不會使用和改變當前位置。
94:SetPolyFillMode
函數功能:
SetPolyFillMode 函數設置多邊形的填充模式,用於填充多邊形。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
int SetPolyFillMode(
_In_ HDChdc,
_In_ intiPolyFillMode
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
iPolyFillMode |
指定新的填充模式 |
iPolyFillMode 參數指定的填充模式能夠是如下值之一:
值 |
含義 |
ALTERNATE |
交替模式(GDI 填充每條掃描線從多邊形的奇數邊到偶數邊之間的區域) |
WINDING |
螺旋模式(GDI 填充全部可以一筆完成的多邊形) |
返回值:
1. 若是函數調用成功,返回值是先前的填充模式;
2. 若是函數調用失敗,返回值是 0。
備註:
1. 在一般狀況下,兩種模式僅在繪製複雜、重疊的多邊形纔會有不一樣的顯示(例如五角星)。
2. 當填充模式爲 ALTERNATE,GDI 填充每條掃描線從多邊形的奇數邊到偶數邊之間的區域。也就是說,GDI 依次填充多邊形的第1、第二條邊之間的區域,接着填充第3、第四條邊之間的區域(第2、第三條邊之間的區域留空),以此類推。
3. 當填充模式爲 WINDING,GDI 填充全部可以一筆完成的多邊形。
95:GetBkMode
函數功能:
GetBkMode 函數用於得到字符、陰影畫刷和非實線畫筆的背景模式。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
int GetBkMode(
_In_ HDChdc
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
返回值:
1. 若是函數調用成功,返回值是指定設備環境當前的背景模式(OPAQUE 或 TRANSPARENT);
2. 若是函數調用失敗,返回值是 0。
96: GetPolyFillMode
函數功能:
GetPolyFillMode 函數用於得到當前的多邊形填充模式。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
int GetPolyFillMode(
_In_ HDChdc
);
參數解析:
參數 |
含義 |
hdc |
指定設備環境句柄 |
返回值:
1. 若是函數調用成功,返回值是指定設備環境的多邊形填充模式;
2. 若是函數調用失敗,返回值是 0。
備註:
1. 多邊形的填充模式能夠是如下值之一:
值 |
含義 |
ALTERNATE |
交替模式(GDI 填充每條掃描線從多邊形的奇數邊到偶數邊之間的區域) |
WINDING |
選擇螺旋模式(GDI 填充全部可以一筆完成的多邊形) |
2. 關於兩種填充模式的區別,請看 SetPolyFillMode 函數。
97:CreateSolidBrush
函數功能:
CreateSolidBrush 函數用於建立一個指定顏色的邏輯畫刷。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
HBRUSH CreateSolidBrush(
_In_ COLORREFcrColor
);
參數解析:
參數 |
含義 |
crColor |
1. 指定畫刷的 RGB 顏色 |
返回值:
1. 若是函數調用成功,返回值是新畫刷的句柄;
2. 若是函數調用失敗,返回值是 NULL。
備註:
1. 若是你不再須要該畫刷,可使用 DeleteObject 函數將其刪除。
2. 實心畫刷實際上就是指系統用來繪製要填充圖形的內部區域的位圖。
3. 調用該函數建立新畫刷以後,可使用 SelectObject 函數將新畫刷選入設備環境中。
4. 當要使用系統畫刷的時候,應用程序應該使用 GetSysColorBrush(iIndex) 代替CreateSolidBrush(GetSysColor(nIndex))。由於GetSysColorBrush 函數會使用緩存好的畫刷而不用從新建立一個新的。
ICM:在建立刷子時沒有顏色操做。然而,當把該刷子選入ICM許可的設備環境中時,將進行顏色管理。
98:LOGBRUSH 結構
LOGBRUSH 結構定義了邏輯畫刷的樣式,顏色和圖案。CreateBrushIndirect 函數和 ExtCreatePen 函數須要使用到該結構。
結構原型:
typedef struct tagLOGBRUSH {
UINT lbStyle;
COLORREF lbColor;
ULONG_PTR lbHatch;
} LOGBRUSH, *PLOGBRUSH;
成員解析:
成員 |
含義 |
||||||||||||||||||||
lbStyle |
指定畫刷的樣式,該成員決定着 Windows 如何解釋另外的兩個成員:
|
||||||||||||||||||||
lbColor |
1. 指定畫刷的顏色
4. 若是 lbStyle 成員的值是 BS_HATCHED 或 BS_SOLID,該值是一個 COLORREF 類型的顏色值(使用 RGB宏建立 COLORREF 類型) |
||||||||||||||||||||
lbHatch |
1. 指定畫刷的陰影樣式
5. 若是 lbStyle 成員的值是 BS_PATTERN,該值是一個定義圖案位圖的句柄(該位圖不能是 CreateDIBSection 函數建立的 DIB 位圖) |
備註:
1. DIB(設備無關位圖文件格式)包含 BITMAPINFO 結構以及緊跟着的存儲像素陣列的數組。
2. 儘管 lbColor 成員指定了陰影畫刷的前景色,但調用 SetBkMode 函數和 SetBkColor 函數能夠控制背景顏色。
99:CreateHatchBrush
函數功能:
CreateHatchBrush 函數用於建立一個具備指定陰影樣式和顏色的邏輯刷子。
API 函數原型:
註釋:_In_ 說明該參數是輸入的。
HBRUSH CreateHatchBrush(
_In_ intfnStyle,
_In_ COLORREFclrref
);
參數解析:
參數 |
含義 |
fnStyle |
指定畫刷的陰影樣式(具體請看下方) |
clrref |
1. 指定用於畫刷陰影的前景色 |
fnStyle 參數指定畫刷的陰影樣式以下:
值 |
含義 |
HS_BDIAGONAL |
45 度向上,從左至右的陰影 |
HS_CROSS |
水平和垂直交叉陰影 |
HS_DIAGCROSS |
45 度交叉陰影 |
HS_FDIAGONAL |
45 度向下,自左至右陰影 |
HS_HORIZONTAL |
水平陰影 |
HS_VERTICAL |
垂直陰影 |
返回值:
1. 若是函數調用成功,返回值是新畫刷的句柄;
2. 若是函數調用失敗,返回值是 NULL。
備註:
1. 陰影畫刷實際上就是指系統用來繪製要填充圖形的內部區域的位圖。
2. 調用該函數建立新畫刷以後,可使用 SelectObject函數將新畫刷選入設備環境中。
3. 調用 SetBkColor 函數能夠修改畫刷圖案的背景色。
4. 調用 SetBkMode 函數能夠影響搞該陰影畫刷的渲染效果(若是是 OPAQUE 模式,背景顏色被用來填充線與線之間的空隙;若是是 TRANSPARENT模式,Windows 就只畫出陰影線,不填充它們之間的空隙)。
5. 若是應用程序使用帶陰影的刷子,用合適的顏色填充父窗口和子窗口的背景,那麼在繪刷子窗口的背景以前,有可能須要設置刷子的起始點。要作到這一點,能夠在應用程序中調用 SetBrushOrgEx 函數。
6. 若是你不再須要該畫刷,可使用 DeleteObject 函數將其刪除。 ICM:在建立刷子時沒有顏色,然而在把該刷子選入到ICM許可的設備環境中時,將會完成顏色管理。