描述
WNDCLASSEX 中最重要的成員莫過於lpfnWndProc了。前綴 lpfn 表示該成員是一個指向函式的長指針。在 Win32中由於記憶體模式是 FLAT 型,所以沒有 near 或 far 的區別。每一個視窗類必須有一個視窗過程,當 Windows 把屬於特定視窗的訊息傳送給該視窗時,該視窗的視窗類負責處理所有的訊息,如鍵盤訊息或滑鼠訊息。由於視窗過程差不多智慧型地處理了所有的視窗訊息循環,所以您只要在其中加入訊息處理過程即可。
結構體原型:
typedef struct WNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
說明
WNDCLASSEX 結構用於註冊視窗類
註冊實例:
ATOM MyRegisterClass( HINSTANCE hInstance )
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof( WNDCLASSEX );
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC) WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
wcex.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH );
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "My Class";
wcex.hIconSm = LoadIcon( NULL, IDI_WINLOGO );
return RegisterClassEx( &wcex );
}
參數
1.cbSize:
WNDCLASSEX 的大小。我們可以用sizeof(WNDCLASSEX)來獲得準確的值。
2.style:
從這個視窗類派生的視窗具有的風格。您可以用“or”操作符來把幾個風格或到一起。
3.lpfnWndProc:
視窗處理函式的指針。
4.cbClsExtra:
指定緊跟在視窗類結構後的附加位元組數。
5.cbWndExtra:
指定緊跟在視窗實例的附加位元組數。如果一個應用程式在資源中用CLASS偽指令註冊一個對話框類時,則必須把這個成員設成DLGWINDOWEXTRA。
6.hInstance:
本模組的實例句柄。
7.hIcon:
圖示的句柄。
8.hCursor:
游標的句柄。
9.hbrBackground:
背景畫刷的句柄。
10.lpszMenuName:
指向選單的指針。
11.lpszClassName:
指向類名稱的指針。
12.hIconSm:
和視窗類關聯的小圖示。如果該值為NULL。則把hIcon中的圖示轉換成大小合適的小圖示。
例子
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX; create local variables on stack
LOCAL msg:MSG
LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX ; fill values in members of wc
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL=1
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr w ; register our window class
invoke CreateWindowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL
mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow ; display our window on desktop
invoke UpdateWindow, hwnd ; refresh the client area
在FirstWindow程式中,註冊視窗類的代碼是:
local @stWndClass:WNDCLASSEX ;定義一個WNDCLASSEX結構
…
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass