一、背景
消息机制是windows程序的典型运行机制,在MFC中有很多已经封装好了的消息,。但是在有些特殊情况下我们需要自定义一些消息去完成一些我们所需要的功能,这时候MFC的向导不能帮助我们做到这一点。对此,我们可以通过添加相应的代码去完成这个功能。
二、实现方法
添加自定义消息操作如下:
1. 建立MFC工程,如基于对话框的应用程序,Test。
2. 在资源中添加要处理的消息的值,即在CTestDlg.h中添加 如下代码。 (因为很多MFC的消息是在WM_USER内的,所以这里用比WM_USER大的消息)
//WM_USER 是用户自定义消息的一个起始值
//WM_USER+100 是为了区分系统消息和用户消息,避免冲突
#define WU_A WM_USER+100
#define WU_B WM_USER+101
#define WU_C WM_USER+102
#define WU_D WM_USER+103
#define WU_E WM_USER+104
3. 声明消息处理函数,在CTestDlg.h中添加如下代码:
class CTestDlg : public CDialog
{
protected:
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); // 消息映射函数
DECLARE_MESSAGE_MAP() // 消息宏
}
4、在接收消息的窗口类中,重写消息响应函数。可以在窗口类的消息映射表中添加消息处理函数。在CTestDlg.cpp中人找到如下部分添加代码:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
//ON_MESSAGE响应的是自定义消息
//产生WU_A消息,自动调用OnMyChange()函数
ON_MESSAGE(WU_A, OnMyChange)
END_MESSAGE_MAP()
5. 实现自己的自定义消息处理:
LRESULT CTestDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
//MessageBox("recv msg success");
//添加自己的消息处理
……
return 0;
}
6. 在需要发送自定义消息的地方,调用CWnd类的SendMessage或PostMessage方法来发送消息。
HWND hWnd = ::FindWindow(NULL, L"Window Title");
if (hWnd != NULL)
{
::SendMessage(hWnd, WM_MY_CUSTOM_MSG, (WPARAM)0, (LPARAM)0);
}
参考:
MFC自定义消息的实现方法 - rainbow70626 - 博客园