WNDCLASSEX

WNDCLASSEX屬於一個窗台類,WNDCLASSEX 中最重要的成員莫過於lpfnWndProc了。前綴 lpfn 表示該成員是一個指向函式的長指針。在 Win32中由於記憶體模式是 FLAT 型,所以沒有 near 或 far 的區別。

描述

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

相關詞條

相關搜尋

熱門詞條

聯絡我們