标题：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 结构用于注册窗口类
注册实例：
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 );
}
参数
cbSize：WNDCLASSEX 的大小。我们可以用sizeof（WNDCLASSEX）来获得准确的值。style：从这个窗口类派生的窗口具有的风格。您可以用“or”操作符来把几个风格或到一起。lpfnWndProc：窗口处理函数的指针。cbClsExtra：指定紧跟在窗口类结构后的附加字节数。cbWndExtra：指定紧跟在窗口事例后的附加字节数。如果一个应用程序在资源中用CLASS伪指令注册一个对话框类时，则必须把这个成员设成DLGWINDOWEXTRA。hInstance：本模块的事例句柄。hIcon：图标的句柄。hCursor：光标的句柄。hbrBackground：背景画刷的句柄。lpszMenuName：指向菜单的指针。lpszClassName：指向类名称的指针。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 
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 wc                       ; 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