一 窗口注册和窗口创建的过程
1 Win32窗口程序创建步骤
1.1 WinMain入口函数的定义
1.2 WindowsProc 函数的定义
1.3注册窗口
RegisterClass/RegisterClassEx
1.4创建窗口
CreateWindow /CreateWindowEx
1.5 显示刷新窗口
ShowWindow/UpdateWindow
1.6 消息处理
GetMessage /DisptchMessage
1.7 窗口退出
WM_DESTROY:PostQuitMessage
2 窗口的注册
2.1 窗口的分类
2.1.1 系统全局类按钮 文本框 工具栏
2.1.2 应用程序全局窗口类,可以在EXE和DLL中使用的窗口。
2.1.3 局部窗口类。只能在本模块中使用的窗口类。
2.2 实现窗口的注册
2.2.1 系统全局的窗口类,无需注册直接使用。使用CreateWindow函数,在CLASSNAME中指定系统已经定义好的窗口类型名称即可
2.2.2 应用程序的全局窗口类,需要用代码实现,在注册时需要增加CS_GLOBALCLASS定义实现方式:
WNDCLASS wc = { 0 };
wc.style = CS_GLOBALCLASS;
.....
RegisterClass( &wc );
2.2.3 局部窗口类,不能增加CS_GLOBALCLASS定义
使用RegisterClass/RegisterClassEx注册
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;
2.2.4 窗口类的风格
CS_HREDRAW 窗口水平变化,重新绘制窗口
CS_VREDRAW 窗口垂直变化,重新绘制窗口
CS_GLOBALCLASS 创建应程序全局窗口类
CS_DBCLICK 可以接受鼠标双击消息
CS_BYTEALIGNCLIENT 客户区对齐方式 以8的倍数对齐
CS_BYTEALIGNWINDOW 窗口对齐方式
CS_CLASSDC 所有这种类型的窗口使用容一个DC(设备描述表 绘图使用)CS_OWNDC 每个窗口拥有自己的DCCS_PARENTDC 使用父窗口的DC
CS_SAVEBITS 是用位图保存窗口,可以提高窗口界面的刷新性能CS_NOCLOSE 禁止关闭命令2.2.5 窗口类的附加数据 cbClsExtra 在窗口类的数据信息中添加自己的信息
cbClsExtra 用于添加信息的内存的大小, 一般是4的倍数
SetClassLong 将信息保存到内存中
GetClassLong 将信息从内存中取出
DWORD GetClassLong( HWND hWnd, // handle to window int nIndex // offset of value to retrieve );2.2.6 窗口附加数据在窗口的数据信息中添加自己的信息
cbWndExtra 用于添加信息的内存大小
SetWindowLong
LONG SetWindowLong( HWND hWnd, // handle to window int nIndex, // offset of value to set LONG dwNewLong // new value );GetWindowLong
LONG GetWindowLong( HWND hWnd, // handle to window int nIndex // offset of value to retrieve );
2.3 窗口类相关函数
RegisterClass/RegisterClassEx 注册
UnregisterClass 注销
GetClassInfo/GetClassInfoEx 获取信息
GetClassName 获取窗口类的名称
GetClassLong/SetClassLong 附加数据的设置和获取
GetWindowLong/SetWindowLong 附加数据的设置和获取
2.4 创建窗口时如何定位窗口类
2.4.1 查找应用程序的局部窗口类。如果找到执行2.4.2,否则执行2.4.3
2.4.2 如果找到名称一致的窗口类,比较HINSTANCE的句柄,如果一致,就使用找到的窗口类信息创建窗口,如果不同,继续查找
2.4.3 如果未找到名称一致的窗口类,会继续在应用程序全局窗口类中查找,如果找到执行2.4.4,否则执行2.4.5
2.4.4 全局窗口找到一致的,使用找到窗口类信息创建窗口
2.4.5 如果未找到,就去系统全局窗口类中查找,如果找到,创建窗口,否则返回失败
3 .窗口创建
3.1 窗口创建函数
CreateWindow/CreateWindowEx
HWND CreateWindowEx( DWORD dwExStyle, // extended window style 窗口的扩展样式 LPCTSTR lpClassName, // registered class name LPCTSTR lpWindowName, // window name DWORD dwStyle, // window style int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height HWND hWndParent, // handle to parent or owner window HMENU hMenu, // menu handle or child identifier HINSTANCE hInstance, // handle to application instance LPVOID lpParam // window-creation data );
3.2 窗口风格和扩展风格
窗口风格:WS_XXXX定义的风格,是窗口的基本风格
扩展风格:WS_EX_XXXX定义的风格 是窗口的扩展风格
扩展风格需要使用CreareWindowEx
WS_OVERLAPPEDWINDOW 层叠式窗口
WS_POPUP 弹出式窗口
WS_CHILD 窗口子窗口
3.3 父窗口和子窗口
3.3.1 CreateWindow时指定父窗口
3,3.2 将窗口的风格增加WS_CHILD
3.3.3 可以使用SetParent 和 GetParent 函数设置和获取指定的父窗
CreateWindow时可以指定父窗口
WS_CHILD
SetParent
GetParent
其他: MoveWindow 移动窗口
3.4 MDI窗口的创建
3.4.1 主窗口
3.4.2 创建一个MDICLINET窗口
3.4.3 创建一个MDI的子窗口