窗口类
窗口类包含了窗口的各种参数信息的数据结构。每个窗口都具有窗口类,基于窗口类创建窗口。每个窗口类都具有一个名称,使用前必须注册到系统。
窗口类的分类
-系统窗口类
系统已经定义好的窗口类,所有应用程序都可以直接使用
-应用程序全局窗口类
由用户自己定义,当前应用程序的所有模块都可以使用 容易产生冗余
-应用程序局部窗口类
由用户自己定义,当前应用程序中本模块可以使用 建议使用这个,局部窗口类可以代替全局窗口类
系统窗口类的注册
不需要注册,直接使用窗口类即可。系统已经定义好相应名称,例如
按纽-BUTTON
编辑框-EDIT
Windows下只要有形状的东西都是窗口 大到全屏界面小到按纽编辑框等。。。
应用程序窗口类的注册
RegisterClass/RegisterClassEx
ATOM RegisterClass(
CONST WNDCLASS *lpWndClass //窗口类的类型
); 注册成功后,返回一个数字标识。
ATOM RegisterClassEx(
CONST WNDCLASSEX *lpwcx//窗口类的类型
)
typedef struct {
UINT cbSize; //结构体大小
UINT style;//窗口类的风格
WNDPROC lpfnWndProc; //窗口处理函数
int cbClsExtra;//窗口类的附加数据buffer的大小
int cbWndExtra;//窗口的附加数据buffer的大小
HINSTANCE hInstance; //当前模块的实例句柄
HICON hIcon;//窗口图标句柄
HCURSOR hCursor;//鼠标的句柄
HBRUSH hbrBackground;//绘制窗口背景的画刷句柄
LPCTSTR lpszMenuName;//窗口菜单的资源ID字符串
LPCTSTR lpszClassName;//窗口类的名称
HICON hIconSm;//窗口的小图标句柄
} WNDCLASSEX, *PWNDCLASSEX
应用程序全局窗口类的注册,需要在窗口类的风格中增加CS_GLOBALCLASS 例如WNDCLASSEXwce{0};
wce.style = ...|CS_GLOBALCLASS;
应用程序局部窗口类
在注册窗口类时,不要添加CS_GLOBALCLASS风格
Style所有成员
CS_GLOBALCLASS 应用程序全局窗口类
CS_BYTEALIGNCLIENT 窗口客户区水平位置8倍数对齐
CS_BYTEALIGNWINDOW 窗口的水平位置8倍对齐
CS_HREDRAW 当窗口水平变化时,窗口重新绘制
CS_VREDRAW 当窗口垂直变化时,窗口重新绘制
CS_CLASSDC 该类型的窗口,都是有同一个绘图(DC)设备
CS_PARENTDC 该类型的窗口,每个窗口都是用自己的绘图(DC)设备
CS_SAVEBITS 允许窗口保存成图(位图),提高窗口的绘图效率,但是耗费内存资源
CS_DBLCLKS 允许窗口接收鼠标双击消息
CS_NOCLOSE 窗口没有关闭按钮
窗口类的创建
CreateWindow
HWND CreateWindow( LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);
1 系统根据传入的窗口类名称,在应用程序局部窗口类中查找,如果找到执行2,如果未找到执行3
2 比较局部窗口类与创建窗口时传入的HINSTANCE变量。如果发现相等,创建和注册窗口类中同一个模块,创建窗口返回。如果不相等,继续执行3。/*局部窗口类只能自己的进程使用,HINSTANCE相同则为同一进程创建,此步骤对比窗口类和HINSANCE*/
3 在应用程序全局窗口类,如果找到,执行4,如果未找到执行5
4 使用找到的窗口类的信息,创建窗口返回
5 在系统窗口类中查找,如果找到创建窗口返回,否则创建窗口失败
CreateWindowEx
CreateWindowEx是CreateWindow的升级版
HWND CreateWindowEx( DWORD dwExStyle,
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle, //窗口的扩展风格,比CreateWindow多的参数
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);