发消息一般有两种方式:SendMessage 和 PostMessage 。其中SendMessage指发送消息并且等待结果返回后,主进程才继续运行;PostMessage指发送消息后不等待结果返回,主进程直接继续运行。
下面举例:如何在VC/MFC机制下发SendMessage消息,其实发PostMessage消息的方式和这是一样的。
//下面为发送用户自定义消息的方式:
第一步: 定义消息ID
//可以在头文件stdafx.h中定义用户消息
//定义用户消息,不可与系统消息冲突,所以就这样定义
#define WM_MYMESSAGE WM_USER+100 //WM_USER表示用户消息,加100还是加其他值并没多大区别的
第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。
LPESULT C****::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
...
return 0;
}
第三步:建立消息映射
//在头文件.h中
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
//在实现文件.cpp中
BEGIN_MESSAGE_MAP(……)
……
ON_MESSAGE(WM_MYMESSAGE, OnTestMessage)
END_MESSAGE_MAP()
第四步:发送消息。
同一个对象可以直接调用SendMessage(WM_MYMESSAGE,0,0);//这里只是SendMessage最简单的用法
但是如果要在其他对象中发送消息,则先要获得接收接收对象的指针,利用此指针来调用SendMessage。如上一篇文章中提到的,要在
子选择卡窗口中,当按键按下时向父窗口发送消息,可如下做:
CWnd *pParent = GetParent()->GetParent();//第一个是按钮的parent,即子选项卡窗口,第二个才是子选项卡窗口的父窗口。
pParent->SendMessage(WM_MYMESSAGE,0,0);