消息机制
消息数据结构
typedef struct tagMSG{
HWND hwnd ; //消息所指窗口句柄
UINT message; //消息的名称
WPARAM wParam; // 32位消息的特定附加信息
LPARAM lParam ; //32位消息的特定附加信息
DWORD time ; //消息创建时的时间
POINT pt; //消息创建时的鼠标位置
}MSG;
从Windows应用程序的角度来看,Windows程序的进行依靠外部发生的事件来驱动,就是说,程序不断的等待操作系统发来的属于自己的消息通知,然后进行程序的消息处理,完成相应的功能。这就是消息机制,Windows就靠这种机制来运行。
常用的Windows消息
消息 对应的事件
WM_CHAR 从键盘输入字符
WM_XOMMAND 用户选择菜单内的某项,或是控件给父类发送一个通知
WM_CREATE 生成窗口
WM_DESTROY 撤销窗口
WM_LBUTTONDOWN 按下鼠标左键
WM_LBUTTONUP 彩旗鼠标左键
WM_MOUSEMOVE 移动鼠标指针
WM_PAINT 窗口需要重新绘制
WM_QUIT 应用程序结束
WM_SIZE 窗口尺寸被调整
在Windows系统中, 消息都是系统来捕获的, 并放在系统队列中, 等待用户应用程序来获取。
对应用程序可以获取的各种程序分类,,
可分由硬件装置所产生的消息(鼠标,键盘。。。),这些消息放在系统队列中。
以及Windows系统或其他Windows程序传送过来 的消息,放在程序队列中。
消息中的窗口句柄指定了消息所属的应用程序窗口
应用程序可以调用系统的API函数GetMessage来从两大队列中获取属于自己的消息,并通过API函数TranslateMessage和DispatchMessage将获取的消息传递给自己的窗口过程函数(一般是WinProc)处理。
每个Windows程序都应该有一个如下的循环:
MSG msg;
While ( GetMessage(&msg , NULL , NULL , NULL )) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
同时每一个Windows程序也都应该有一个窗口过程函数
WndProc()
{
switch(msg){
case WM_CREATE:
case WM_CLOSE:
default: return DefWindowProc();
}
return 0 ;
}
消息的种类:
(1)输入消息
(2)控制消息
(3)系统消息
(4)用户消息
消息映射
消息映射是一张将消息和成员函数相互关联的表,或者是地图。
它诉应用程序和Windows系统每一个消息由哪一个处理函数来处理。
可能通过如下步骤将MFC的消息映射机制添加到类中:
(1)将DECLARE_MESSAGE_MAP()添加到类的声明文件中,声明消息映射。
(2)在程序的实现文件中放置标志消息的宏来执行消息映射。
BEGIN_MESSAGE_MAP(CHelloWorldDlg, CDialog) //消息映射宏开始
END_MESSAGE_MAP() 消息映射宏结束
(3)在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加成员函数来处理消息。例 如ON_WM_PAINT()宏来为WM_PAINT消息作映射
消息映射宏
(1)AFX_MSGMAP 数据结构
struct AFX_MSGMAP
{
AFX_MSGMAP* pBaseMessageMap ; //指向基类消息映射表的指针
AFX_MSGMAP_ENTRY* lpEntries; //自己消息映射表的首地址
}
(2)AFX_MSGMAP_ENTRY 数据结构
struct AFX_MSGMAP_ENTRY //消息映射表项结构体
{
UINT nMessage;
UINT nCode ;
UINT nID;
UINT nLastID;
UINT nSig;
AFX_PMSG pfn;
}
AFX_PMSG 定义为函数指针:
typedef void (ccmdTarget::*AFX_PMSG) (void ) ;