文章目录
前言
Windows程序设计14:Win32窗口程序的创建流程。
一、Win32窗口程序的创建流程
1.创建流程
第一步:注册窗口类,指定窗口类的名称与窗口回调函数。
第二步:创建窗口,指定注册窗口类、窗口标题、窗口的大小。
第三步:显示窗口。
第四步:开始消息循环。
第五步:窗口函数中处理窗口消息。
需要说明的是,这里新建一个Win32桌面应用程序的空项目,从头开始进行Win32窗口程序的创建流程。如果不新建空项目,则编译器生成的项目模板中会包含很多冗余的文件,有的我们用不到,而且编译器自动生成不利于我们理解原理。因此这里从空项目开始进行介绍。空项目中仅添加一个.cpp源文件即可。
2.API函数CreateWindow
要用到的API函数为CreateWindow.
用于创建一个重叠窗口、弹出窗口或子窗口,它指定窗口类、窗口标题、窗口样式、窗口的初始位置和大小等。该函数还指定窗口的父级或所有者以及窗口的菜单。函数原型如下
HWND CreateWindow(
LPCTSTR lpClassName, // 窗口类名
LPCTSTR lpWindowName, // 窗口标题
DWORD dwStyle, // 窗口样式
int x, // 窗口的初始 x 坐标
int y, // 窗口的初始 y 坐标
int nWidth, // 窗口的宽度
int nHeight, // 窗口的高度
HWND hWndParent, // 父窗口句柄
HMENU hMenu, // 菜单句柄或控件 ID
HINSTANCE hInstance, // 应用程序实例句柄
LPVOID lpParam // 附加数据
);
参数LPCTSTR lpClassName为窗口类名(必须是注册过的),指定窗口的类别。可以是预定义的类名(如 “BUTTON”、“EDIT”)或自定义的类名。
参数LPCTSTR lpWindowName为窗口的标题(显示在标题栏中)。对于控件,可以是控件的文本内容。
参数DWORD dwStyle为窗口样式,控制窗口的外观和行为。常用样式:WS_OVERLAPPEDWINDOW:标准窗口样式。WS_CHILD:子窗口样式。WS_VISIBLE:窗口创建后立即显示。。。等等
参数int x和y为窗口的初始位置(左上角坐标)。对于子窗口,坐标相对于父窗口的客户区。
参数int nWidth和nHeight为窗口的宽度和高度。
参数HWND hWndParent为父窗口句柄。如果为 NULL,表示没有父窗口(顶级窗口)。
参数HMENU hMenu为菜单句柄或控件 ID。对于顶级窗口,指定菜单句柄。对于子窗口,指定控件 ID。
参数HINSTANCE hInstance为应用程序实例句柄,通常从 WinMain 的参数中获取。
参数LPVOID lpParam为附加数据,通常为 NULL。
返回值:如果成功,返回创建的窗口句柄(HWND)。如果失败,返回 NULL。可以通过 GetLastError 获取错误码。
3. API函数RegisterClassEx
为后续在调用CreateWindow或CreateWindowEx中使用的窗口注册一个窗口类。函数原型为
ATOM RegisterClassEx(
const WNDCLASSEX *lpwcx // 指向 WNDCLASSEX 结构的指针
);
参数const WNDCLASSEX *lpwcx是一个指向 WNDCLASSEX 结构的指针,该结构定义如下:
typedef struct tagWNDCLASSEX {
UINT cbSize; // 结构体大小(必须设置为 sizeof(WNDCLASSEX))
UINT style; // 窗口类样式(如 CS_HREDRAW | CS_VREDRAW)
WNDPROC lpfnWndProc; // 窗口过程函数指针
int cbClsExtra; // 类