一.简介
Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口.这些窗口通过窗口过程来接收和处理消息,然后把控制权还给Windows
二.消息的分类
1.队列消息和非队列消息
从消息的发送途径上看,消息分两种:队列消息和非队列消息
队列消息送到系统消息队列,然后到线程消息队列,最后送给目的窗口过程
非队列消息直接送给目的窗口过程
Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)
除了键盘 鼠标消息 WM_PAINT WM_TIMER WM_QUIT消息以外,其他消息大多数都是非队列消息
2.系统消息和应用程序消息
从消息来源来看,可以分为系统定义的消息和应用程序定义的消息
三.消息结构
typedef struct tagMSG{
HWND hwnd, // 接收消息的窗口句柄
UINT messag, // 消息标识(ID)
WPARAM wParam, // 第一个消息参数
LPARAM lParam, // 第二个消息参数
DWORD time, // 消息产生的时间
POINT pt // 消息产生时鼠标的位置
}MSG;
四.接收消息
while (GetMessage(&msg, NULL, NULL, NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam.
五.处理消息
应用程序通过窗口过程来处理消息
LRESULT CALLBACK MainWndProc{
HWND hwnd, // 窗口句柄
UINT msg, // 消息表示
WPARAM wParam, // 消息参数
LPARAM lParam // 消息参数
}
六.MFC消息映射
MFC主要处理三类消息:
(1) Windows消息 : 以 WM_ 开头的消息,除了 WM_COMMAND 消息例外
(2) 控制通知消息 : 是控制子窗口送给父窗口的 WM_COMMAND 通知消息
(3) 命令消息 : 这是来自菜单 工具条按钮 加速键等用户接口对象的 WM_COMMAND 通知消息
在类的头文件里面,增加消息处理函数的声明之外,添加一行声明消息映射的宏定义 DECLARE_MESSAGE_MAP
在类的源文件里面,实现消息处理函数之外,添加 BEGIN_MESSAGE_MAP() ... END_MESSAGE_MAP()
来源:https://www.cnblogs.com/k5bg/p/11214592.html