MFC自定义消息
以最简单的代码,实现最直接的功能:
1.自定义消息:
在resource.h文件中定义:
#define Send 1234
注意消息本身要避免一些系统的消息ID。
撰写发送函数
你需要在合适的响应地点,发送你的消息。比如,一个socket在接收到消息后马上由PosMessage函数对外发送消息的过程:
void CMFCMSGDlg::OnBnClickedsend()
{
// TODO: 在此添加控件通知处理程序代码
MessageBox(_T("SendMsg"));
::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), Send, (WPARAM)Send, (LPARAM)0);
}
这里的PostMessage就是发送消息的函数。
撰写消息映射
在准备好你的发送消息后,你还需要将消息映射到回调函数上去,具体的方法是去message_map里添加对应的关系绑定:
BEGIN_MESSAGE_MAP(CMFCMSGDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(send, &CMFCMSGDlg::OnBnClickedsend)
ON_BN_CLICKED(change, &CMFCMSGDlg::OnBnClickedchange)
ON_MESSAGE(Send, OnMyCommand)//这里把自定义新消息与新响应回调函数绑定
END_MESSAGE_MAP()
注意的是,使用ON_MESSAGE这一类宏所绑定的回调函数需要满足以下格式:
afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM)
回调函数的定义在你的主窗口类中,是附属于你主窗口类的函数。回调函数必须由WPARAM, LPARAM这两个参数。用户定义消息是不属于标准 Windows WM_MESSAGE 消息的任何消息。 选择消息 ID 时,必须使用 WM_USER (0x0400) 到 0x7FFF 或 WM_APP (0x8000) 到 0xBFFF 范围内的值。
撰写回调函数
在回调函数中,你可以通过this->GetCurrentMessage()函数来获得你所接收到的消息。所接收到的消息一般使用static const MSG*格式用于保存。你可以针对不同的消息进行switch–case判断。
你的回调函数由于上文所述的格式限制,必须返回一个值:
LRESULT CMFCMSGDlg::OnMyCommand(WPARAM wParam, LPARAM lParam)
{
// CCreateContext *pContext = new CCreateContext;
STATE_T.SetWindowTextW(_T("RecMessage"));
MessageBox(_T("RecMessage"));
return LRESULT();
}
当然,你定义了新的消息,新的回调函数,是要去框架类里面注册登记的。
// CMFCMSGDlg 对话框
class CMFCMSGDlg : public CDialogEx
{
// 构造
public:
CMFCMSGDlg(CWnd* pParent = nullptr); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MFC_MSG_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
afx_msg LRESULT OnMyCommand(WPARAM wParam, LPARAM lParam);//你注册登记的函数
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CStatic STATE_T;
CButton SEND_B;
CButton CHANGE_B;
afx_msg void OnBnClickedsend();
afx_msg void OnBnClickedchange();
};