SendMessage 自定义消息函数

本文介绍了一个简单的自定义消息处理机制,在MFC框架下通过在.h文件中定义自定义消息及处理函数声明,并在.cpp文件中实现消息处理逻辑,展示了如何发送自定义消息并更新界面元素。

http://www.cnblogs.com/wqj1212/archive/2008/03/03/1089298.html


在.h文件里
#define WM_MYMSG  WM_USER + 1 // 自定义一个消息
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); // 自定义消息的处理函数声明

在.cpp文件里
ON_MESSAGE(WM_MYMSG, OnMyMessage) // 在 MESSAGE_MAP 中间添加, 利用 ON_MESSAGE() 宏在自定义消息与其处理函数间建立映射关系

LRESULT CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam) {
    CString *str;
    str=(CString *)lParam;
    SetDlgItemText(IDC_EDIT,*str);
    return 0;
}

void CModelessDlg::OnMsgBTN() {
    CString str= "自定义消息被触发了!";
    SendMessage(WM_MYMSG, 0, (LPARAM) &str); // 给ModelessDlg自己发一个自定义的消息

}


在C++中,`SendMessage`函数可用于发送自定义消息。以下详细介绍其方法和示例: ### `SendMessage`函数原型 ```cpp LRESULT WINAPI SendMessage( _In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam ); ``` 参数说明: - `hWnd`:窗口句柄,指明要发送的消息进入哪个窗口的消息队列。 - `Msg`:消息的编号,自定义消息可使用`WM_USER` 加上一个正整数来定义。 - `wParam`:消息附加信息1。 - `lParam`:消息附加信息2。 返回值为消息处理结果。 ### 自定义消息发送步骤及示例 #### 1. 定义自定义消息 在头文件中定义自定义消息,通常使用`WM_USER`作为基值: ```cpp // 在头文件中定义自定义消息 #define WM_MY_CUSTOM_MESSAGE (WM_USER + 1) ``` #### 2. 绑定消息处理函数 在类实现文件的消息映射中绑定消息: ```cpp // MyDialog.cpp BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx) ON_MESSAGE(WM_MY_CUSTOM_MESSAGE, &CMyDialog::OnMyCustomMessage) END_MESSAGE_MAP() ``` 关键宏`ON_MESSAGE`用于预定义消息(如`WM_USER + 1`)。 #### 3. 实现消息处理函数 ```cpp LRESULT CMyDialog::OnMyCustomMessage(WPARAM wParam, LPARAM lParam) { CString strData = (LPCTSTR)lParam; // 假设传递字符串 AfxMessageBox(strData); return 0; } ``` #### 4. 发送自定义消息 在需要发送消息的地方调用`SendMessage`函数: ```cpp // 发送自定义消息 HWND hWnd = GetDlgItem(IDC_TARGET_WINDOW)->GetSafeHwnd(); CString messageText = _T("This is a custom message!"); SendMessage(hWnd, WM_MY_CUSTOM_MESSAGE, 0, (LPARAM)(LPCTSTR)messageText); ``` ### 完整示例代码 ```cpp // 在头文件中定义自定义消息 #define WM_MY_CUSTOM_MESSAGE (WM_USER + 1) // MyDialog.h class CMyDialog : public CDialogEx { DECLARE_DYNAMIC(CMyDialog) public: CMyDialog(CWnd* pParent = nullptr); virtual ~CMyDialog(); // 消息处理函数声明 afx_msg LRESULT OnMyCustomMessage(WPARAM wParam, LPARAM lParam); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MY_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP() }; // MyDialog.cpp IMPLEMENT_DYNAMIC(CMyDialog, CDialogEx) CMyDialog::CMyDialog(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_MY_DIALOG, pParent) { } CMyDialog::~CMyDialog() { } void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx) ON_MESSAGE(WM_MY_CUSTOM_MESSAGE, &CMyDialog::OnMyCustomMessage) END_MESSAGE_MAP() LRESULT CMyDialog::OnMyCustomMessage(WPARAM wParam, LPARAM lParam) { CString strData = (LPCTSTR)lParam; // 假设传递字符串 AfxMessageBox(strData); return 0; } // 在某个按钮点击事件中发送消息 void CMyDialog::OnBnClickedSendMessage() { // 发送自定义消息 HWND hWnd = GetDlgItem(IDC_TARGET_WINDOW)->GetSafeHwnd(); CString messageText = _T("This is a custom message!"); SendMessage(hWnd, WM_MY_CUSTOM_MESSAGE, 0, (LPARAM)(LPCTSTR)messageText); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值