windows最重要的三个子系统(三个DLL):Kernel,User,GDI;
Kernel:处理所有在传统上由操作系统内核处理的事务——内存管理,设备IO,多工管理;
User: 是指使用者界面,实现所有窗口运行机制;
GDI: 实现图形设备界面,允许程序在屏幕或打印机上显示文字和图形。
关于WNDCLASS 与WNDCLASSEX
定义:
typedef struct _WNDCLASS
{UINT style; //指定窗口类风格
WNDPROC lpfnWndProc;//指定窗口过程函数
int cbClsExtra;//指定紧随在WNDCLASS数据结构后分配的额外字节数,系统将其初始化为0
int cbWndExtra;//指定紧随窗口实例(instance)之后分配的额外字节数,
HANDLE hInstance;//标识该窗口类的窗口过程所在模块实例的句柄,不能为空。
HICON hIcon;//标识该窗口类的图标,hIcon必须是一个图标的句柄,若hIcon为NULL,系统将提供一个默认的图标
HCURSOR hCursor;//标识该窗口类的光标,hCursor必须为一个光标的句柄,若hCursor为NULL,无论何时光标移到
//应用程序时,应用程序必须显式设置光标形状
HBRUSH hbrBackground;//标识了该窗口的背景画刷,hbrBackground字段必须是用于绘制背景的物理刷子的句柄,或者是一个颜色的值。如果给出一个颜色的值,它必须是下面列出的标准系统颜色之一(系统将对所选颜色加1)。如果给出了颜色值,它必须是转换成对应的HBRUSH类型之一的颜色:当hbrBackground字段为NULL时,每当需要绘制其用户区域时,应用程序必须自己来绘制其背景。应用程序可以通过处理WM_ERASEBKGND 消息或检查由 BeginPaint 函数填写的 PAINTSTRUCT 结构的fErase 字段来确定背景什么时候需要着色
LPCTSTR lpszMenuName;//指向NULL结束的字符串,该字符串描述菜单的资源名,如同在资源文件里显示的名字一样。若使用一个整数标
//识菜单,可以使用MAKEINTRESOURCE宏。如果lpszMenuName为NULL,那么该窗口类的窗口将没有默认菜单。
LPCTSTR lpszClassName;//:指向NULL结束的字符串,或者是一个原型(atom)。若该参数是一个原型,它必须是一个有先前调用
//RegisterClass或者 RegisterClassEx函数产生的类原型。类原型必须作为lpszClassName的低字,高字必须为0.若lpszClassName是一个字符串,它
//描述了窗口类名。这个类名可以是由RegisterClass或RegisterClassEx注册的名字,或者是任何预定义的控件类名。
} WNDCLASS;
注册WNDCLASS类型窗口类别,要使用RegisterClass函数;
注册WNDCLASSEX类型的窗口类别,要使用RegisterClassEx函数。
typedef struct _WINCLASSEX
{
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
hBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;//与窗口类关联的小图标句柄,如果为NULL,系统搜索通过hIcon指定的图标资源的适当大小的图标
、 //作为小图标。
}WNDCLASSEX, *PWNDCLASSEX;
总结:
1、窗口必须依照某一窗口类别建立,窗口类别标识了一个窗口过程函数。
2、不同的窗口可以依照同一窗口类别,窗口类别定义了窗口过程和依照此窗口类别建立的窗口的其他特征,在建立窗口时要定义该窗口独有的特征。
例如:所有的按钮窗口都可以依据同一个窗口类别来建立,与这个窗口类别相关的窗口过程位于windows内部。由窗口类别来负责处理按钮的键盘和鼠标输入,并定义按钮在屏幕上的外观形象。从这一点看,所有的按钮都以同样的方式工作,但是并非所有的按钮都是一样的,它们可以有不同的大小,不同的屏幕位置,以及不同的字串,后面的这些特征是窗口定义的一部分,而不是窗口类别定义的。
3、一个窗口过程可以处理依据同一个窗口类别建立的多个窗口的消息。
4、窗口类别最重要的两个参数:lpfnWndProc(标识窗口过程)和lpszClassName(标识窗口类别的名字)。
5、每种窗口类别只有一个窗口过程函数。