MFC添加自定义消息
由于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 ;
}
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 = ;
while (i < )
{
Sleep();
i += ;
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 ;
}
如果用户需要一个定义整个系统唯一的消息,可以调用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可以通过,但是无法响应消息。
相关内容可查看:线程调用UpdateData函数出错
MFC添加自定义消息的更多相关文章
- MFC中 自定义消息
		
想在对话框显示出来后立即执行一段代码. 方法之一是自定义消息,即添加一个自定义的消息在消息队列中等待对话框初始化之后从消息队列中读取消息执行代码. 在OnInitDialog返回之前post一个自定义 ...
 - MFC发送自定义消息-PostMessage和SendMessage
		
PostMessage:把消息投放到线程的消息队列,不能消息被处理就立即返回SendMessage:消息被处理完后才返回 几种发送消息的写法: ::PostMessage(GetSafeHwnd( ...
 - [pixhawk笔记]7-MAVLink添加自定义消息
		
前一篇学习了uORB,用于px4中各个模块的进程间通信,下来学习MAVLink,用于飞控和地面站之间的通信.教程中主要给出了使用MAVLink的发送和接收消息的方法.完整的MAVLink消息列表见该网 ...
 - MFC 添加C++类,别的类不通过C++类的定义的对象就可以直接调用C++类里面的成员函数;
		
MFC 添加C++类,不用定义C++类的对象,别的类不通过C++类的定义的对象就可以直接调用C++类里面的成员函数: 1先在mfc程序中添加普通类CProdata,然后删除头文件Prodata.h里面 ...
 - MFC开发中添加自定义消息和消息响应函数
		
(1)在.h或.cpp文件定义一个消息 #define CLICK_MESSAGE_BOX WM_USER+1001 //add by 20180612 给主窗口ctrl.cpp发送消息 //自定义消 ...
 - MFC对话框应用程序添加自定义消息
		
1. 定义自定义消息 /** * \brief 消息测试 */ #define E6100_MSG_TEST ( WM_USER + 1001 ) 2. 声明自定义消息处理函数 /* ...
 - MFC用户自定义消息
		
之前做过佳能相机和位移平台的额二次开发,当时遇到一个棘手的问题,就是位移平台如何知道相机已经拍完照了,或者相机如何知道位移平台已经运行到指定位置,当时为了方便采用了定时器来定时检测位移平台的位置,结果 ...
 - MFC消息-自定义消息
		
转:http://blog.csdn.net/penpenandtongtong/article/details/18598907 像MFC的窗口发送消息,可以进行自定义的动作行为,因此很多时候非常有 ...
 - MFC的自定义消息的定义与使用
		
自定义消息的响应和资源消息的响应有很多类似之处:资源消息的响应是以资源的ID号作为标识的:自定义的消息要自己声明消息ID. 一. 定义: 第一步要声明消息: #define WM_ ...
 
随机推荐
- PetaPoco 存储过程
			
1 执行不带参数的存储过程 public List<dynamic> ceshiProc() { string sql = @"EXEC [dbo].[p_ceshi1]&quo ...
 - WPF 媒体播放器(MediaElement)实例,实现进度和音量控制
			
WPF 视频音频播放控件MediaElement实现进度控制,音量控制实例 说明: 1.Volume控制音量的大小,double类型,并且实现了属性依赖,可以用来双向绑定:在 0 和 1. 之间的线性 ...
 - Android端上传图片到后台,存储到数据库中 详细代码
			
首先点击头像弹出popwindow,点击相册,相机,调用手机自带的裁剪功能,然后异步任务类访问服务器,上传头像,保存到数据库中, 下面写出popwindow的代码 //设置popwindow publ ...
 - Eclipse 打开时“发现了以元素'd:skin'”开头的无效内容。此处不应含有子元素(转)
			
打开 Eclipse 时,如图所示: 解决办法: 把有问题的 devices.xml 文件删除,再把 sdk 里面 tools\lib 下的这个文件拷贝到你删除的那个文件夹里,重启 eclipse 就 ...
 - 添加Appicon的方法
			
1.将设计好的图片,拖拽到Groups&Files的Resources目录下: 2.修改Resources目录下的“工程名-info.plist”文件 3.修改该文件的Iconfile属性,填 ...
 - jQuery实现页面元素智能定位
			
实现过程 Js侦听滚动事件,当页面滚动的距离(页面滚动的高度)超出了对象(要滚动的层)距离页面顶部的高度,即要滚动的层到达了浏览器窗口上边缘时,立即将对象定位属性position值改成fixed(固定 ...
 - Spring 创建bean的时机
			
默认在启动spring容器的时候,spring容器配置文件中的类就已经创建完成对象了 在<bean>中添加属性lazy-init,默认值为false. true 在c ...
 - hdu 4502吉哥系列故事——临时工计划 (简单DP)
			
Problem Description 俗话说一分钱难倒英雄汉,高中几年下来,吉哥已经深深明白了这个道理,因此,新年开始存储一年的个人资金已经成了习惯,不过自从大学之后他不好意思再向大人要压岁钱了,只 ...
 - window对象细节(转载)
			
Window对象是客户端javascript最高层对象之一,只要打开浏览器窗口,不管该窗口中是否有打开的网页,当遇到BODY.FRAMESET或FRAME元素时,都会自动建立window对象的实例.另 ...
 - php实现返回上一页的功能的3种有效方法
			
php实现返回上一页的功能的3种有效方法 header(location:你的上一页的路径); // 注意这个函数前不能有输出 header(location:.getenv("HT ...