窗口類(lèi)風(fēng)格
CS_DBLCLKS 鼠標指針在窗口內時(shí),用戶(hù)雙擊鼠標,向響應的窗口類(lèi)的Windows Procedure發(fā)送雙擊消息
CS_CLASSDC 同一窗口類(lèi)的所有窗口共享一個(gè)設備環(huán)境
CS_GLOBALCLASS 允許所有應用程序創(chuàng )建此類(lèi)的窗口,不用考慮傳遞給CreateWindowEx()函數的hInstance參數的值。
CS_HREDRAW 如果客戶(hù)區寬度改變或者移動(dòng)窗口,重繪整個(gè)窗口
CS_VREDRAW 如果客戶(hù)區高度改變或者移動(dòng)窗口,重繪整個(gè)窗口
CS_NOCLOSE 禁用系統菜單中的關(guān)閉命令項
CS_OWNDC 為此類(lèi)窗口中的每個(gè)窗口分配一個(gè)唯一的設備環(huán)境(上下文)
CS_PARENTDC 設置父窗口中的子窗口的剪貼區域,以便在父窗口上繪制子窗口
CS_SAVEBIT 將被窗口覆蓋的屏幕圖像部分作為位圖保存,這種風(fēng)格類(lèi)型對于小的窗口很有用(例如菜單或者對話(huà)框),這類(lèi)窗口在屏幕上只是暫時(shí)顯示,其他的屏幕操作執行之前,它就會(huì )消失。
應用程序創(chuàng )建窗口之前必須先定義和注冊一個(gè)相應的窗口類(lèi),
老的是WNDCLASS,擴展的是WNDCLASSEX
WNDCLASSEX增加兩項內容,1是保存結構大小的變量,2是小圖標的句柄
typedef struct _WNDCLASSEX{
UINT cbSize ; //WNDCLASSEX結構的大小
UINT style ; //窗口風(fēng)格類(lèi)型
WNDPROC lpfnWndProc; //Windows Procedure地址
int cbClsExtra ; //類(lèi)的擴展信息
int cbWndExtra ; //窗口的擴展信息
HANDLE hInstance ; //應用程序實(shí)例句柄
HICON hIcon ; //應用程序大圖標的句柄
HCURSOR hCursor; //鼠標指針句柄
HBRUSH hbrBackground; //窗口背景色
LPCTSTR lpszMenuName; //主菜單名
LPCTSTR lpszClassName; //窗口類(lèi)名
HICON hIconSm; //應用程序小圖標句柄
}WNDCLASSEX
1. 創(chuàng )建窗口類(lèi)
WNDCLASSEX windowClass;
2. 窗口屬性設置
windowClass.cbSize=sizeof(WNDCLASSEX);
窗口風(fēng)格類(lèi)型數據成員用來(lái)描述窗口的一般特性
windowClass.style=CS_VREDRAW|CS_HREDRAW
把Windows Procedure的地址賦給lpfnWndProc,
wndowClass.lpfnWndProc=WndProc;
結構成員cbClsExtra和cbWndExtra應被設置為0。cbClsExtra用來(lái)指定分配給窗口類(lèi)結構的擴展字節的大小,cbWndExtra指定了分配給窗口實(shí)例的擴展字節的大小。
hInstance用于保存當前應用實(shí)例的句柄,可以從WinMain()中得到。
3. 圖標和鼠標指針的加載
應用程序的圖標和鼠標指針也需要在窗口類(lèi)結構中定義。用戶(hù)可以自定義這些資源,也可以使用windows系統提供的內建資源
可以為一個(gè)窗口類(lèi)創(chuàng )建兩個(gè)圖標:一個(gè)大的一個(gè)小的。小圖標用于系統菜單或者當應用程序最小化時(shí)在任務(wù)欄中的顯示。大圖標用于在文件、文件夾中和桌面上表示窗口。
用LoadIcon()加載圖標。
HICON LoadIcon(HINSTANCE hInst,LPCSTR lpszName);
參數lpszName指定圖標資源
參數hInst指定包含此圖標資源的模塊的句柄
函數返回指向此圖標的一個(gè)句柄。
如果使用windows提供的內建圖標資源,只需將參數hInst賦值為NULL,然后lpszName賦值為系統內建圖標資源的圖標宏。
例如:系統默認的應用程序圖標宏是IDI_APPLICATION
windClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
小圖標同樣
windClass.hIconSm = LoadIcon(NULL,IDI_WINLOGO);
IDI_APPLICATION 默認應用程序圖標
IDI_ASTERISK 星狀圖標
IDI_ERROR 手型圖標
IDI_EXCLAMATION 驚嘆號圖標
IDI_HAND 手型圖標
IDI_INFORMATION 星狀圖標
IDI_QUESTION 問(wèn)號圖標
IDI_WARNING 驚嘆號圖標
IDI_WINLOGO Windows標志圖標
用LoadCursor()加載鼠標指針資源。
HCURSOR LoadCursor(HINSTANCE hInst, LPCSTR lpszName)
參數hInst指定包含資源的模塊的句柄
參數lpszName指定資源
返回指向指針的句柄。
如果使用windows提供的內建指針資源,將參數hInst設置為NULL,lpszName設置為內建宏。
例如:默認的箭頭指針宏是IDC_ARROW
windowClass.hCursor = LoadCursor(NULL,IDC_ARROW);
IDC_APPSTARTING 帶小沙漏的標準箭頭指針
IDC_ARROW 標準箭頭指針
IDC_CROSS 十字指針
IDC_HELP 帶問(wèn)號的箭頭指針
IDC_IBEAM 工字梁指針
IDC_NO 禁止符號指針
IDC_SIZEALL 四向箭頭指針
IDC_SIZENS 南北雙向箭頭指針
IDC_SIZEWE 東西雙向箭頭指針
IDC_SIZEWNSE 西北-東南雙向箭頭指針
IDC_SIZENESW 東北-西南雙向箭頭指針
IDC_UPARROW 垂直向上箭頭指針
IDC_WAIT 沙漏指針
4. 完整窗口類(lèi)示例
WNDCLASSEX windowClass;
windowClass.cbSize = sizeof(WNDCLASSEX); //設置窗口類(lèi)數據結構大小
windowClass.style = CS_HREDRAW|CS_VREDRAW //設置窗口類(lèi)風(fēng)格(重繪類(lèi)型)
windowClass.lpfnWndProc = (WNDPROC)WndProc; //函數指針(窗口消息過(guò)程)
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = hInstance; //應用程序實(shí)例
windowClass.hIcon = NULL; //無(wú)圖標
windowClass.hCursor = LoadCursor(NULL,IDC_ARROW); //鼠標
windowClass.hbrBackgroudn = NULL; //無(wú)背景刷
windowClass.lpszMenuName = NULL; //無(wú)菜單
windowClass.lpszClassName = “MyClass”; //窗口類(lèi)名
windowClass.hIconSm = NULL; //無(wú)小圖標
RegisterClassEx(&windowClass) ; //注冊窗口類(lèi)
5. 窗口的創(chuàng )建
窗口創(chuàng )建函數:
CreateWindow()
CreateWindowEx()
HWND CreateWindowEx(
DWORD dwExStyle, //窗口的擴展風(fēng)格類(lèi)型
LPCTSTR lpClassName, //指向已注冊的窗口類(lèi)名字的指針
LPCTSTR lpWindowName, //指向窗口名字的指針
DWORD dwStyle, //窗口風(fēng)格類(lèi)型
int x, //窗口的水平位置
int y, //窗口的垂直位置
int nWidth, //窗口寬度
int nHeight, //窗口高度
HWND hWndParent, //父窗口句柄
HMENU hInstance, //菜單或者子窗口標識的句柄
LPVOID lpParam); //窗口創(chuàng )建數據的指針
lpClassName 窗口類(lèi)名字 此處應為” MyClass”
lpWindowName應用程序窗口頂部的標題欄文本
dwSytle:
WS_BORDER 細線(xiàn)邊界
WS_CAPTION 有標題欄(包括WS_BORDER風(fēng)格)
WS_CHILD 是子窗口,不能和WS_POPUP一同使用
WS_HSCROLL 有水平滾動(dòng)條
WS_ICONIC 初始狀態(tài)是最小化的窗口,等效于WS_MINIMIZE
WS_MAXIMIZE 初始化狀態(tài)是最大化的窗口
WS_MAXIMIZEBOX 具有最大化按鈕,不能與WS_EX_CONTEXTHELP組合使用,必須同時(shí)指定WS_SYSMENU風(fēng)格
WS_MINIMIZE 初始化是最小化的窗口,與WS_ICONIC等效
WS_MINIMIZEBOX 具有最小化按鈕,不能與WS_EX_CONTEXTHELP組合使用,必須同時(shí)指定WS_SYSMENU風(fēng)格
WS_OVERLAPPED 重疊窗口,重疊窗口具有標題欄和邊界,與WS_TILED等效
WS_OVERLAPPENDWINDOW
重疊窗口,同時(shí)具有:WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX,與WS_TILEDWINDOW等效
WS_POPUP 彈出式菜單窗口,不能和WS_CHILD一起使用
WS_POPUPWINDOW 同時(shí)具有WS_BORDER,WS_POPUP,WS_SYSMENU的彈出式菜單窗口,WS_POPUPWINDOW和WS_CAPTION必須一起使用使窗口菜單可見(jiàn)
WS_SIZEBOX 具有膠條邊界,與WS_THICKFRAME風(fēng)格等效
WS_SYSMENU 標題欄上有菜單的窗口,WS_CAPTION必須同時(shí)指定
WS_VISIBLE 初始化狀態(tài)為可見(jiàn)
WS_VSCROLL 具有垂直滾動(dòng)條
6. 創(chuàng )建窗口實(shí)例
hwnd = CreateWindowEx(
NULL, //無(wú)擴展風(fēng)格
“MyClass”, //窗口類(lèi)名
“MY_Window”, //窗口標題
WS_OVERLAPPEDWINDOW //窗口風(fēng)格
|WS_CLIPSIBLINGS,
0,0,200,200, //窗口位置大小
NULL, //無(wú)父窗口
NULL, //無(wú)菜單
hInstance, //應用程序實(shí)例
NULL); //無(wú)擴展窗口創(chuàng )建參數
窗口創(chuàng )建后不是立即可見(jiàn),可以加入WS_VISIBLE風(fēng)格使窗口創(chuàng )建初始狀態(tài)為可見(jiàn)
沒(méi)有加入WS_VISIBLE需調用ShowWindow()顯示窗口
ShowWindow(hwnd,nCmdShow);
nCmdShow來(lái)自程序入口函數WinMain().
要強制刷洗窗口中的內容,向Windows Procedure發(fā)送WM_PAINT消息需要調用
UpdateWindow();
聯(lián)系客服