标题：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 "SCROLLBAR" or "STATIC"） 
要用这些窗体，直接用CreateWindow创建相应对象就是了。 
要得到某一窗口的窗口类，可以用GetClassName(); 
WNDCLASS中的回调函数是窗体的消息处理函数： 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
lParam)
窗口属性定义
基本方法结构WNDCLASS包含一个窗口类的全部信息，也是Windows编程中使用的基本数据结构之一，应用程序通过定义一个窗口类确定窗口的属性，定义如下： 
typedef struct _WNDCLASS { 
UINT style; 
WNDPROC lpfnWndProc; 
int cbClsExtra; 
int cbWndExtra; 
HINSTANCE hInstance; 
HICON hIcon; 
HCURSOR hCursor; 
HBRUSH hbrBackground; 
LPCTSTR lpszMenuName; 
LPCTSTR lpszClassName; 
} WNDCLASS, *LPWNDCLASS;
举例说明#include <windows.h>
//包含应用程序中数据类型和数据结构的定义 
long CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); 
//窗口说明 
//WinMain函数是所有Windows应用程序的入口，类似c语言中的main函数 其功能是完成//一系列的定义和初始化，并产生消息循环
/* WinMain函数实现以下功能：注册窗口类，建立窗口及执行其他必要的初始化工作；进入消息循环，根据从应用程序消息队列接受的消息，调用相应的处理过程；当消息循环检 
测到WM_QUIT消息时终止程序运行 
WinMain函数有三个基本部分组成：函数说明、初始化和消息循环*/ 
//函数说明 
int WINAPI WinMain( 
HINSTANCE hInstance, // handle to current instance 
HINSTANCE hPrevInstance, // handle to previous instance 
LPSTR lpCmdLine, // command line 
int nCmdShow // show state 
) 
//初始化 
//初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分 
{ 
HWND hwnd; 
MSG Msg; 
WNDCLASS wndclass; 
char lpszClassName[]="窗口";//窗口类名 
char lpszTitle[]="徐新坡"; //窗口标题名
//窗口类定义 
//窗口类定义了窗口的形式与功能 窗口类定义通过给窗口类数据结构WNDCLASS赋值完成 
//该数据结构中包含窗口类的各种属性 
wndclass.style =0; // 窗口类型为缺省类型 
wndclass.lpfnWndProc=WndProc; //定义窗口处理函数 
wndclass.cbClsExtra=0; //窗口类无扩展 
wndclass.cbWndExtra=0; //窗口实例无扩展 
wndclass.hInstance=hInstance; //当前实例句柄 
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为缺省图标 
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); // 窗口采用箭头光标
wndclass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); //窗口背景为白色 
wndclass.lpszMenuName=NULL; //窗口无菜单 
wndclass.lpszClassName=lpszClassName; //窗口类名为“窗口” 
//////////////// 以下是窗口类的注册 Windows系统本身提供部分预定义的窗口类，程序员也可以自定义窗口类// 窗口类必须先注册 后使用 
if(!RegisterClass(&wndclass)) //如果注册失败 发出警告 
{MessageBeep(0); return FALSE;} 
///////////////创建窗口 创建一个窗口的实例由函数CreateWindow()实现 
hwnd=CreateWindow( lpszClassName, //窗口类名 
lpszTitle, //窗口标题名
WS_OVERLAPPEDWINDOW, //窗口的风格 
CW_USEDEFAULT, 
CW_USEDEFAULT, //窗口左上角坐标值为缺省值
CW_USEDEFAULT, CW_USEDEFAULT, //窗口的高和宽为缺省值
NULL, //此窗口无父窗口 
NULL, //此窗口无子菜单 
hInstance, //创建此窗口的应用程序的当前句柄 
NULL //不使用该值 
); 
/////////////显示窗口 
ShowWindow(hwnd,nCmdShow); 
//绘制用户区 
UpdateWindow(hwnd); 
/////////////消息循环
while(GetMessage(&Msg,NULL,0,0)) 
{ 
TranslateMessage(&Msg); 
DispatchMessage(&Msg);} 
return Msg.wParam; //消息循环结束 即程序结束时 将信息返回系统 
} 
/////////////窗口函数
//窗口函数定义了应用程序对接收到的不同消息的响应，其中包含了应用程序对各种可能接受到的消息的 
//处理过程，时消息处理分支控制语句的集合 
long CALLBACK WndProc( 
HWND hwnd, 
UINT message, 
WPARAM wParam, 
LPARAM lParam 
) 
{ 
switch(message) 
{ 
case WM_DESTROY: 
PostQuitMessage(0); 
default: //缺省时采用系统消息缺省处理函数 
return DefWindowProc(hwnd,message,wParam,lParam); 
} 
return (0); 
}
数据结构原型
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结束的字符串，或者是一个原型(atom)。若该参数是一个原型，它必须是一个有先前调用RegisterClass或者 RegisterClassEx函数产生的类原型。类原型必须作为lpszClassName的低字，高字必须为0.若lpszClassName是一个字符串，它描述了窗口类名。这个类名可以是由RegisterClass或RegisterClassEx注册的名字，或者是任何预定义的控件类名。