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