windows窗口的創建有以下幾個步驟:
1、創建注冊窗口類
2、創建窗口句柄
3、顯示更新窗口
4、消息循環
1、創建注冊窗口類
關於WNDCLASS的定義如下:
typedef struct {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS, *pWNDCLASS;
成員:
style
描述類風格。該成員可以是“Class Styles”的任意組合,styly可以取的值如下所示:
CS_VREDRAW 垂直重畫
CS_HREDRAW 水平重畫
CS_OWNDC 獨占設備描述表
CS_SAVEBITS 保存窗口覆蓋區
CS_DBCLKS 允許兩次連續按動
CS_BYTEALLGNCLIENT 鼠標用戶區域按字節對齊顯示
CS_BYTEALLGNWINDOW 鼠標用戶窗口按字節對齊顯示
CS_NOCLOSE 系統菜單中沒有CLOSE菜單項
lpfnWndProc
指向窗口過程的函數指針。必須使用CallWindowProc函數調用窗口過程。
cbClsExtra
表示窗口類結構之后分配的額外的字節數。系統將該值初始化為0。
cbWndExtra
表示窗口實例之后分配的額外的字節數。系統將該值初始化為0。如果使用資源文件里的CLASS指令創建對話框,並用WNDCLASS注冊該對話框時,cbWndExtra必須設置成DLGWNDOWEXTRA。
hInstance
包含該類實例的句柄,該實例包含了窗口過程。一般直接賦上WinMain()的hInstance參數值即可。
hIcon
類圖標的句柄。該成員必須為一個圖標資源的句柄。可以使用LoadIcon()函數加載圖標。如果hIcon為NULL,系統將提供默認圖標。
hCursor
鼠標指針的句柄。改成員必須為一個指針資源的句柄。可以使用LoadCursor()去加載光標。如果hCursor為NULL,應用程序必須在指針移入應用程序窗口時顯式設置指針類型。
hbrBackground
背景畫刷的句柄。該成員或者是用於繪制背景的物理畫刷的句柄,或者是一個顏色值。顏色值必須為如下“標准系統顏色值”(值1必須加到選定顏色中):
BLACK_BRUSH
DKGRAY_BRUSH
GRAY_BRUSH
HOLLOW_BRUSH 空畫刷(相當於NULL_BRUSH)
LTGRAY_BRUSH
NULL_BRUSH 等同於HOLLOW_BRUSH
WHITE_BRUSH
BLACK_PEN
WHITE_PEN
NULL_PEN
SYSTEM_FONT 默認情況下,系統使用系統字體去繪制菜單、控制對話框和文本等。
DEFAULT_PALETTE 默認的調色板,這個調色板由系統調色板中的靜態顏色組成。
如果顏色值給定后,必須將該值轉換成如下HBRUSH類型:
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTNSHADOW
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT
當調用UnregisterClass時,系統自動刪除背景畫刷。應用程序不應刪除這些畫刷。
當hbrBackground為NULL時,應用程序必須在繪制客戶區域時繪制它自己的背景。為了確定背景是否一定要繪制,應用程序或者可以處理 WM_ERASEBKGND消息,或者測試PAINTSTRUCT的fErase成員。PAINTSTRUCT是由BeginPaint函數填充的。
lpszMenuName
指向NULL結束的字符串,該字符串描述菜單的資源名,如同在資源文件里顯示的名字一樣。若使用一個整數標識菜單,可以使用MAKEINTRESOURCE宏。如果lpszMenuName為NULL,那么該窗口類的窗口將沒有默認菜單。
lpszClassName
指 向NULL結束的字符串,或者是一個原型(atom)。若該參數是一個原型,它必須是一個有先前調用RegisterClass或者RegisterClassEx函數產生的類原型。類原型必須作為lpszClassName的低字,高字必須為0.若lpszClassName是一個 字符串,它描述了窗口類名。這個類名可以是由RegisterClass或者RegisterClassEx注冊的名字,或者是任何預定義的控件類名。
結構信息。
2、創建窗口句柄
HWND hWnd ;
hWnd = CreateWindowEx(WS_EX_TOPMOST ,
"CreateWindows" ,
"測試" ,
WS_POPUP ,
0 ,
0 ,
1024 ,
768 ,
NULL ,
NULL ,
hInstance ,
NULL) ;
if(!hWnd)
{
return FALSE ;
}
3、顯示更新窗口
ShowWindow(hWnd , nCmdShow) ;
UpdateWindow(hWnd) ;
4、消息循環
MSG msg ;while(true)
{
if(PeekMessage(&msg , NULL , 0U , 0U , PM_REMOVE))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
}
}