编译器:VS2015 语言C++
在工作中有时会碰到添加自定义消息,比如通信时接收数据线程在接到数据后需要发送消息给主界面,进行刷新数据。下面开始实现此过程:
1.建立一个MFC工程,名称随意,比如Test(基于对话框,相信你会建立MFC工程,这个如果不会,你还是先别玩了)
2.在CTestDlg.h文件中(在#pragma once下)添加两个自定义消息:
#define WM_MY_MSG WM_USER+100
#define WM_READ_MSG 11
3.同样在CTestDlg.h中添加自定义消息类成员函数:
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);//自定义消息函数
4.CTestDlg.cpp中添加函数体
LRESULT CTestDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
}
5.添加消息映射
BEGIN_MESSAGE_MAP(CTestDlg, CDialogEx)
......
ON_MESSAGE(WM_MY_MSG, OnMyMessage)
......
END_MESSAGE_MAP()
6.为工程新建类CMyMsg
7.在CMyMsg.cpp中添加自定义消息,include底下就行(这个要和第二步中定义的一致)
#define WM_READ_MSG 11
8.在CMyMsg.h添加类成员变量和函数作为接口
private:
HWND m_myhwnd; //接收传值句柄
UINT m_myMsg; //接收传值消息
public:
void SetConn(HWND hwnd, UINT Msg);
9 .在CMyMsg.cpp添加函数体
void CMyMsg::SetConn(HWND hwnd, UINT Msg)
{
m_myhwnd=hwnd;
m_myMsg=Msg;
}
10.在CMyMsg.cpp中,需要触发消息的地方添加:
::PostMessage(m_myhwnd, m_myMsg, WM_READ_MSG, 0);
测试时可以这么来:新定义一个函数,在此函数中添加上面代码,然后在主窗口中添加一按钮,点击按钮的时候让调用这个函数就行
11.回到CTestDlg.cpp中,在OnInitDialog()的return前,将主窗口句柄和自定义消息类型传到
CMyMsg中:
CMyMsg m_msg;
m_msg.SetConn(m_hWnd,WM_MY_MSG);
注意别忘了添加#include "MyMsg.h"
12.在第四步中自定义消息中添加:
switch (wParam)
{
case WM_READ_MSG:
MessageBox(_T("自定义消息来了"));
break;
default:
break;
}
这样自定义消息就添加完成了,大家可以试试