什麼是WNDCLASS
WNDCLASS是一個由系統支持的結構,用來儲存某一類窗口的信息,如ClassStyle,消息處理函數,Icon,Cursor,背景Brush等。也就是說,CreateWindow只是將某個WNDCLASS定義的窗體變成實例。
要得到某一窗口的WNDCLASS數據,可以用GetClassLong();
RegisterClass()就是在系統註冊某一類型的窗體。也就是將你提供的WNDCLASS數據註冊爲一個窗口類,在WNDCLASS.lpszClassName中定義該WNDCLASS的標識, 無論CreateWindow或CreateWindowEx創建的窗口都必須對應一個WNDCLASS,但一個WNDCLASS可以有多個窗口對象。
有一些系統預定義的窗口類,如:
ClassName=_T("BUTTON" or "COMBOBOX" or "EDIT" or "LISTBOX" or "MDICLIENT" or "SCOLLBAR" or "STATIC")
要用這些窗體,直接用CreateWindow創建相應對象就是了。
要得到某一窗口的窗口類,可以用GetClassName();
WNDCLASS中的回調函數是窗體的消息處理函數:
CALLBACK WinProc(MESSAGE msg,LPARAM lparam,WPARAM wParam)
{
}
數據結構原型:
typedef struct_WNDCLASS{
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
}WNDCLASS;
結構說明:
WNDCLASS 結構包含了RegisterClass函數註冊的類屬性
分量簡介:
style: 指定類風格。這些風格可通過按位或操作組合起來。風格如下:
CS_BYTEALIGNCLIENT: 在字節邊界上(在x方向上)定位窗口的用戶區域的位置
CS_BYTEALIGNWINDOW: 在字節邊界上(在x方向上)定位窗口的位置
CS_CLASSDC: 該窗口類的所有窗口實例都共享一個窗口類DC
CS_DBLCLKS: 允許向窗口發送雙擊鼠標鍵的消息
CS_GLOBALCLASS: 當調用CreateWindow 或 CreateWindowEx 函數來創建窗口時允許它的hInstance參數和註冊窗口類時傳遞給RegisterClass 的 hInstance參數不同。如果不指定該風格,則這兩個 hInstance 必須相同。
CS_HREDRAW: 當水平長度改變或移動窗口時,重畫整個窗口
CS_NOCLOSE: 禁止系統菜單的關閉選項
CS_OWNDC: 給予每個窗口實例它本身的DC。注意,儘管這樣是很方便,但它必須慎重使用,因爲每個DC大約要佔800個字節的內存。
CS_PARENTDC: 將子窗口的裁剪區域設置到父窗口的DC中去,這樣子窗口便可以在父窗口上繪製自身。注意,這是子窗口還是從系統緩存中獲取DC,而不是使用父窗口的DC。使用該風格可以提高系統性能。
CS_SAVEBITS: 以位圖形式保存被該窗口遮擋的屏幕部分,這樣當給窗口移動以後,系統便可以用該保存的位圖恢復屏幕移動的相應部分,從而系統不用向被該窗口遮擋的窗口發送 WM_PAINT 消息。該特性對於菜單類型的窗口比較合適,因爲它通常是簡短的顯示一下之後便消失。設置該特性將增加顯示該窗口的時間,因爲它通常要先分配保存位圖的內存。
CS_VREDRAW: 當垂直長度改變或移動窗口時,重畫整個窗口
lpfnWndProc: 指向窗口過程
cbClsExtra: 指定緊隨在 WNDCLASS 數據結構後分配的字節數。系統將其初始化爲零。
cbWndExtra: 指定緊隨在窗口實例之後分配的字節數,系統將其初始化爲零。如果應用程序正在用WNDCLASS結構註冊一個在RC
資源描述文件中用CLASS指令創建的對話框時,它必須設置這個字段爲 DLGWINDOWEXTRA。
hInstance: 標識了該窗口類的窗口過程所在的模塊實例的句柄,不能爲NULL。
hIcon: 標識了該窗口類的圖標。hIcon字段必須是一個圖標的句柄;若hIcon字段爲NULL,則無論何時用戶把應用程序縮至最小時,應用程序必須畫一個圖標。
hCursor: 標識該窗口類的光標,hCursor必須是一個光標資源的句柄。若hCursor字段爲NULL,則無論何時鼠標移到應用程序窗口時,應用程序必須顯式設置光標形狀。
hbrBackground: 標識了該窗口類的背景畫筆。hbrBackground字段必須是用於繪製背景的物理刷子的句柄,或者是一個顏色的值。如果給出一個顏色的值,它必須是下面列出的標準系統顏色之一(系統將對所選顏色加1)。如果給出了顏色值,它必須是轉換成下列的HBRUSH類型之一的顏色:
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTHSHADOW
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
當hbrBackground字段爲NULL時,每當需要繪製其用戶區域時,應用程序必須自己來繪製其背景。應用程序可以通過處理WM_ERASEBKGND 消息或檢查由 BeginPaint 函數填寫的 PAINTSTRUCT 結構的fErase 字段來確定背景什麼時候需要着色。
lpszMenuName: 指向一個以NULL結尾的字符串。該字符串定義了窗口類菜單的資源名字(作爲在資源文件中出現的名字)。如果用一個整數來標識這個菜單,就可以使用 MAKEINTRESOURCE 宏指令,若lpszMenuName 字段爲NULL,則屬於該窗口類別的窗口沒有缺省菜單。
lpszClassName: 指向一個以NULL結尾的字符串,該字符串定義了窗口類的名字。