wndclassex

目录导航

描述

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 结构用于注册窗口类

注册实例:

ATOMMyRegisterClass( 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

invokeRegisterClassEx,addr @stWndClass

相关百科
返回顶部
产品求购 求购