书接上回:
我们在简单的创建一个窗口后,需要对窗口进行交互。然后我们在消息处理函数进行处理。例如,(窗口刚创建时的状态,绘图函数消息,窗口销毁时的消息,窗口的顶层菜单......)。然后,我们进入正文:
目录
1.接受消息
1.1整体接收消息流程
(1) 用户/系统触发某个交互功能 //触发事件
(2)MSG结构体存储消息信息(MSG msg) //消息储存
HWND : 窗口句柄
message: 在windows中消息常用数值来记录,但由于数值不好记录,所以常记 录为后宏定义
wparam 和 lparam 同为对信息的进一步描述
time 为消息创建的时间
pt 为point 类型 为记录消息创建时鼠标的坐标位置
(3)消息进入到消息队列中等待 //消息队列
(4)
GetMessage()用于接收消息
TranslateMessage()用于翻译消息
DispatchMessage()用于分发消息,将加工后的消息传给操作系统
(5)最后,系统调用窗口信息处理函数
2.各种消息信息
2.1 窗口创建消息(WM_CREATE)![](https://i-blog.csdnimg.cn/blog_migrate/7ff081b20190f4c0b4d526d42925c02e.png)
当窗口创建时,系统发送一个创建消息,弹出窗口,然后创造出窗口。
2.2窗口毁坏消息(WM_DESTROY)![](https://i-blog.csdnimg.cn/blog_migrate/d6a4026c5754de1107f741469c136bd5.png)
当系统发送销毁窗口的消息时,系统调用销毁消息来结束窗口。(注:窗口的毁坏不代表进程的结束,我们需要确保其不再接收消息,才能结束进程。PostQuitMessage 函数将WM_QUIT消息发布到线程的消息队列,并立即返回;该函数只是向系统指示线程在将来某个时间请求退出。)
2.3窗口菜单消息(WM_COMMAND)![](https://i-blog.csdnimg.cn/blog_migrate/8ffbc1056d4634a75c28f497ec91ef60.png)
此消息的作用是为窗口提供菜单项。例如:此为vs2019的菜单项
2.4控制台消息
如何在窗口应用程序中调用工作台呢?
handle 变量是为了接受GetStdHandle创建的控制台
在此我在前面设置了鼠标的双击消息,然后双击鼠标会在控制台中输出消息和双击时鼠标的位置
2.5定时器消息
在说定时器消息之前,首先对轮询和中断进行了解
轮询:CPU通过不断访问各种设备的状态,当设备到达就绪状态时,向该设备发送消息。然后返回,等待一段时间后,进行下一次发访问。
中断:程序中断通常简称中断,是指CPU在正常运行程序的过程中,由于预先安排或发生了各种随机的内部或外部事件,使CPU中断正在运行的程序,而转到为响应的服务程序去处理。
然后我们来看定时器消息
SetTimer()第一个参数为调用窗口的句柄,第二个参数为定时器的标识,第三个参数为定时器调用间隔的秒数,第四个参数为null 就是轮询调用
wparam 和 lparam 在不同的消息中代表的意义不同 ,在这里 wparam 代表 定时器的标识 ,lparam 代表的是定时器中断函数指针
WriteConsoleA()函数的意义为将内容写到控制台上
2.6 鼠标消息
鼠标消息有很多
- WM_LBUTTONDOWN 鼠标左键按下
- WM_LBUTTONUP 鼠标左键抬起
- WM_RBUTTONDOWN 鼠标右键按下
- WM_RBUTTONUP 鼠标右键抬起
- WM_MOUSEMOVE 鼠标移动消息
- ......
当然还有鼠标中键消息等等 ,基本原理差不多,所以在这里我就单说一个鼠标移动消息(WM_MOUSEMOVE)其中,wParam:表示鼠标移动时某些键是否被按下;lParam:鼠标实时的位置。LOWORD(lparam)表示X坐标,HIWORD(lparam)表示Y坐标 。
3.总结
在这里我只列举了常用的一些消息,其中, 菜单消息 和 绘图消息 在后面单开一篇。到此,此篇文章结束,本文记录本人学习的经历,如果那里有问题,欢迎各位指出。