创建窗口程序
Win32
的窗口程序的创建,总体来说也遵循最简单的流程:创建窗口
->显示窗口
。与Java
不同的是,需要对窗口进行显示的事件处理。官方称之为绑定窗口过程
进程必须先注册窗口类,然后才能创建该类的窗口。 注册窗口类会将窗口过程、类样式和其他类属性与类名相关联。 当进程在 CreateWindow 或 CreateWindowEx 函数中指定类名时,系统将创建一个窗口,其中包含与该类名关联的窗口过程、样式和其他属性。
1. 创建窗口类
使用官方提供的RegisterClass
方法进行窗口类的创建。
RegisterClassW
需要一个WNDCLASSA
窗口类对象。
style
窗口样式,按位设置的预定义值,可以控制如:禁用右上角最大化/最小化按钮、响应式重绘等。https://learn.microsoft.com/en-us/windows/win32/winmsg/window-class-styles#constants
lpfnWndProc
窗口过程函数指针。
cbClsExtra
在窗口类结构之后分配的额外字节数。系统将字节初始化为零。
cbWndExtra
在窗口实例之后分配的额外字节数。系统将字节初始化为零。
hInstance
包含该类的窗口过程的实例的句柄。
hIcon
类图标的句柄。该成员必须是图标资源的句柄。如果该成员为NULL,则系统提供默认图标。
hCursor
类光标的句柄。该成员必须是游标资源的句柄。如果该成员为 NULL,则每当鼠标移入应用程序窗口时,应用程序都必须显式设置光标形状。
hbrBackground
类背景画笔的句柄。该成员可以是用于绘制背景的物理画笔的句柄,也可以是颜色值。颜色值必须是以下标准系统颜色之一(必须将值 1 添加到所选颜色)。
lpszMenuName
类菜单的资源名称,该名称出现在资源文件中。如果使用整数来标识菜单,请使用 MAKEINTRESOURCE
宏。如果该成员为NULL,则属于该类的窗口没有默认菜单。
lpszClassName
指向空终止字符串的指针或者是一个原子。如果此参数是原子,则它必须是先前调用 RegisterClass
或 RegisterClassEx
函数创建的类原子。原子必须位于 lpszClassName
的低位字中;高位字必须为零。
我们创建一个最小的类模板
2. 创建窗口对象
使用官方提供的CreateWindow
函数进行创建窗口。
3/4. 显示窗口&更新窗口
5. 设置消息循环
6. 定义过程函数,并绑定
完整代码
作业1
左键按下创建新窗口,点击X,关闭窗口,当只剩最后一个窗口的时候,退出进程。
核心思路是,通过一个set
容器来管理所有创建的窗口,当处理关闭窗口事件时,通过判断容器中是否存在窗口,来决定是否发送关闭进程的事件消息。
作业2
左键按下创建新窗口,点击X,关闭窗口,当点击第一个窗口的时候,退出进程
核心思路是通过保存第一个窗口的句柄。当关闭窗口事件发生时,判断发生事件的窗口是否为第一个窗口句柄,如果是,则发送关闭进程的事件来退出程序。