minigui[基础篇][3]——窗口和消息之消息

1.消息的类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5BpTFxfs-1664887855100)(C:\Users\cjy\AppData\Roaming\Typora\typora-user-images\image-20221004141419595.png)]

2.消息的分类

消息分类典型代表
系统消息MSG_IDLE MSG_TIMER MSG_FDEVENT
对话框消息MSG_COMMAND MSG_INITDIALOG MSG_ISDIALOG MSG_GETTEXT MSG_FONTCHANGED
窗口绘制消息MSG_PAINT MSG_ERASEBKGND
窗口创建和销毁消息MSG_CREATE MSG_NCCREATE MSG_DESTROY MSG_CLOSE等等
键盘和鼠标消息MSG_KEYDOWN MSG_CHAR MSG_LBUTTONDOWN MSG_MOUSEMOVE
鼠标/键盘后处理消息MSG_SETCURSOR MSG_SETFOCUS MSG_KILFOCUS MSG_MOUSEMOVEIN
用户自定义消息#define MSG_MYMESSAGE1 (MSG_USER + 1)

3.消息的发送和处理

消息送到消息处理过程的两种方式
1.把消息投递到一个先进先出的消息队列中,它是系统中用于存储消息的一块内存区域,每个消息存储在一个消息结构中。
2.或是把消息直接发送给窗口过程,也就是通过消息发送函数直接调用窗口过程函数

发送和邮寄消息

投递(邮寄): 把一条消息就是把消息复制到消息队列
发送消息:直接把消息发送到窗口过程函数
消息处理函数消息投放地方用途常用
PostMessage窗口消息队列发送消息
消息队列满会丢失 异步(发送消息立即返回 像发短信)
不重要的消息,键盘和鼠标消息
SendMessage窗口的消息处理过程发送消息
同步(等待消息完成 像打电话)
SendNotifyMessage窗口消息队列发送消息
消息队列满不会丢失(链表) 异步(发送消息立即返回 像发短信)
从控件向其父窗口发送通知消息
PostQuitMessage窗口消息队列发送QS_QUIT消息
GetMessage这样的消息 返回值为false 就会终止循环
退出程序
BroadCastMessage窗口的消息处理过程向所有窗口广播
ThrowAwayMessage函数丢弃和指定窗口相关的消息队列中的所有消息
WaitMessage该函数等待主窗口消息队列中的消息,消息队列中一有消息就返回,并不从消息队列里取消息

4.常用消息

类型消息的产生原因注意事项
MSG_NCCREATECreateWindow
非客户区创建消息
1.窗口对象未建立,不能使用GetDC获取设备上下文 2.不能在该消息中建立子窗口3.对于输入法窗口来说,必须进行输入法的注册工作
MSG_SIZECHANGING1.窗口大小发生变化时(即将发生改变) 2.窗口创建(无到有)wparam:预期值(想要变化的大小)
lparam:最终变化结果值(实际显示变化的大小)
MSG_SIZECHANGED窗口发生变化后wparam:窗口大小信息lparam:窗口客户区的RECT指针
MSG_CSIZECHANGED窗口客户区的尺寸发生变化wparam:新客户区高度lparam:新客户区宽度
MSG_CREATE窗口成功创建后发送(说明窗口已经创建)可以在里面创建子窗口
MSG_FONTCHANGINGSetWindowFont窗口字体发生改变时
MSG_FONTCHANGEDSetWindowFont窗口字体发生改变后
MSG_ERASEBKGNDInvalidateRect 或者 UpdateWindow 等函
数并为 bErase 参数传递 TRUE 时
清楚窗口背景
MSG_PAINT1.初始显示
2.隐藏-》显示或显示-》隐藏
3.部分不可见-》可见
4.InvalidateRect
这个消息应直接返回 不应传给默认处理程序
MSG_CLOSE点击关闭按钮需要做DestroyMainWindow 销毁主窗口的处理
MSG_DESTROYDestroyMainWindow
DestroyWindow
销毁某个主窗口时(特别是模态对话框),一定要保证被托管的主窗口存在
MainWindowCleanup (hWnd);
DestroyIcon (icon1);
DestroyAllControls (hWnd);

4.消息的处理流程

在这里插入图片描述
注:只有托管窗口是HWND_DESKTOP 才会创建新的消息队列 大家都共用主窗口是托管窗口的消息队列
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值