MFC添加自定义消息

本文详述了在Visual Studio 2008中利用MFC框架进行自定义消息的全过程,包括定义消息、声明及实现消息响应函数、消息映射及发送,特别介绍了如何避免消息冲突和使用注册窗口消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:https://www.cnblogs.com/skywatcher/p/3506158.html

由于MFC中无法通过类向导来自定义消息,所以需要手动添加,主要过程如下:

本文基于vs2008下通过线程实现数据实时更新的对话框运用程序

  1. 定义消息(Resource.h文件中):

由于很多新控件也会用到WM_USER消息,所以定义WM_USER+100或更高,避免冲突

#define WM_UPDATEDATA (WM_USER + 100)

2015-3-18 更新

  1. 定义消息( stdafx.h文件中):

由于很多新控件也会用到WM_USER消息,所以定义WM_USER+100或更高,避免冲突,消息定义到stdafx.h文件中,Resource.h文件由系统维护,经常出现自定义的消息丢失。

#define WM_UPDATEDATA (WM_USER + 100)
2. 声明消息响应函数:

放在消息映射部分,即DECLARE_MESSAGE_MAP()之前

复制代码
// 实现
protected:
HICON m_hIcon;

// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT OnUpdateData(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()

复制代码
3. 实现消息响应函数:

由于在vs2008中未定义ON_MESSAGE_VOID,所以定义的消息响应函数必须有返回值,即LRESULT;而消息参数是WPARAM wParam和LPARAM lParam

LRESULT CEditTestDlg::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
UpdateData(wParam);
return 0;
}
4. 将消息映射到消息处理函数:

放在AFX_MSG_MAP之前,把WM_UPDATEDATA消息映射到消息响应函数OnUpdateData

复制代码
BEGIN_MESSAGE_MAP(CEditTestDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_UPDATEDATA, OnUpdateData)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, &CEditTestDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
复制代码
5. 发送自定义消息:

以下函数是在一个新的线程中调用的,PostMessage,SendMessage,SendMessageTimeout均可用,推荐使用SendMessageTimeout函数

复制代码
static UINT SendMsgThread(LPVOID lpParam)
{
CEditTestDlg dlg = (CEditTestDlg) lpParam;
int i = 0;
while (i < 100)
{
Sleep(20);
i += 1;
dlg->m_value2.Format(_T("%d"), i);
//PostMessage(dlg->m_hWnd,WM_UPDATEDATA,FALSE,NULL);
//SendMessage(dlg->m_hWnd,WM_UPDATEDATA,FALSE,NULL);
SendMessageTimeout(dlg->m_hWnd, WM_UPDATEDATA, FALSE,NULL, SMTO_BLOCK, 1000, NULL);
}
return 0;
}
复制代码

如果用户需要一个定义整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage定义消息:
在Resource.h中将代码

#define WM_UPDATEDATA (WM_USER + 100)
修改为

static UINT WM_UPDATEDATA=RegisterWindowMessage(_T(“User”));
并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。
注:如果仍然使用ON_MESSAGE宏指令,compile可以通过,但是无法响应消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值