VC MFC 自定义消息

MFC中自定义消息 【转】MFC中用户自定义类响应自定义消息   2009-08-13 17:15:11|  分类: MFC学习 |  标签: |字号大中小 订阅 这篇技术文章不是讨论经典的MFC中的消息工作机理的,讨论消息工作原理、方式和路径的文章在网上和书本中 随处可见。网上众多 阅读详情

这篇技术文章不是讨论经典的MFC中的消息工作机理的,讨论消息工作原理、方式和路径的文章在网上和书本中

随处可见。网上众多的讨论都是关于如何响应并进行用户自定义消息映射的;网上还有一些文章介绍如何在自定

义类中响应Windows消息,在本文中都简略叙述。但是,网上大部分的文章没用透彻阐述如何在用户自定义类中

响应自定义消息这一通用方法。 
问题定义如下:用户自定义一个类,这个类不一定要有界面(完全可以是不可视的),要求自定义的类可以响应

某个自定义消息。

首先能够响应消息的类必须都从CCmdTarget类中派生,因为只有以这个类中提供了消息的框架和处理机制,而

CWnd类也派生与此类。CWinApp类、CDocument类、CDocTemplate类等都是CCmdTarget的派生类,即子类;而

CFrameWnd类、CView类、CDialog类等都是从CWnd中派生的,其实也是CCmdTarget的子孙,所以都能够响应消息

,但是响应消息的种类不太相同。

那么,如果自己定义的类要求响应命令消息(就是WM_COMMAND,也就是一些菜单、工具栏中的消息,包括快捷键

,这类消息处理的机制与其他以WM_开头的消息处理机制不同,它具有一条层次明确的消息流动路径),那么自

定义的类可以从CCmdTarget中派生。由于CWnd窗体类派生于CCmdTarget父类,那么从CWnd中派生的类也可以理所

应当的响应命令消息。这种命令消息无论是往已有的一些诸如CWinApp类中还是自定义的类中添加都是一件非常

容易的事情,只需用向导即可,在此不再叙述。

如果用户自定义的类要求响应普通的Windows消息(也就是以WM_开头,除了WM_COMMAND以外的消息,这类消息在

WM_USER以下的是系统消息,WM_USER以上的可以由用户自己定义),那就要求自定义的类必须从CWnd中派生。这

是由于此类消息的处理机制决定的,这类消息没有命令消息那条繁琐的流动路径,而是消息发出者直接发给对应

CWnd的窗体句柄,由CWnd负责消息的响应。所以这类消息必须同一个CWnd类对应,更精确的说必须与一个HWND类

型的窗体句柄相对应。这样得出一个重要的结论,就是从CCmdTarget中派生而没有从CWnd派生的类没有处理此类

消息的能力。

综上所述,就是为什么命令消息可以放到大部分类中处理,包括CWinThread、CWinApp、CDocument、CView、

CFrameWnd或是自定义的类中,而普通Windows消息和用户自定义的消息只能放到CFrameWnd和CView等派生与CWnd

中的类中处理。

由此可见,我们自定义的类要想响应自定义消息就只能从CWnd中派生(当然不响应任何消息的类可以从CObject

中派生)。先来看看如何自定义消息:

在.h中做的工作:

第一步要声明消息:

#define WM_MYMSG WM_USER+8

第二步要在类声明中声明消息映射:

DECLARE_MESSAGE_MAP()

第三步要在类声明中定义消息处理函数:

afx_msg LRESULT MyMsgHandler(WPARAM,LPARAM);

在.cpp中做的工作:

第四步要实现消息映射:

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
ON_MESSAGE(WM_MYMSG,OnMyMsgHandler)
END_MESSAGE_MAP()

第五步要实现消息处理函数(当然可以不实现):

LRESULT CMainFrame::OnMyMsgHandler(WPARAM w,LPARAM l)
{
AfxMessageBox("Hello,World!");
return 0; 
}

在引发或发出消息的地方只用写上:

::SendMessge(::AfxGetMainWnd()->m_hWnd,WM_MYMSG,0,0);

到此,自定义消息完毕,这是好多网上文章都写的东西。大家会发现上面代码是在CMainFrame类中实现的,但是

如果要用自定义类,就没有那么简单了。显然把第四步与第五步的CMainFrame换成自定义的类名(这里我用

CMyTestObject来代表自定义类)是不能正常工作的。原因在于在发送消息的SendMessage函数中的第一个参数是

要响应消息对应的HWND类型的窗体句柄,而CMyTestObject类中的m_hWnd中在没有调用CWnd::Create之前是没有

任何意义的,也就是没有调用CWnd::Create或CWnd::CreateEx函数时,CWnd不对应任何窗体,消息处理不能正常

运作。

所以,又一个重要的结论,在自定义类能够处理任何消息之前一定要确保m_hWnd关联到一个窗体,即便这个窗体

是不可见的。那么有人说,在自定义类的构造函数中调用Create函数就行了,不错,当然也可以在别处调用,只

要确保在消息发送之前。但是,Create的调用很有说法,要注意两个地方,第一个参数是类的名称,我建议最好

设为NULL;第五个参数是父窗体对象的指针,这个函数指定的对象一定要存在,我建议最好为整个程序的主窗体

。还有很多人问第六个参数的意义,这个参数关系不大,是子窗体ID,用于传给父窗体记录以便识别。如下是我

的自定义类的构造函数:

CMyTestObject::CMyTestObject()
{
CWnd::Create(NULL,"MyTestObject",WS_CHILD,CRect(0,0,0,0),::AfxGetMainWnd(),1234);
}    //一定要在生成主窗体后使用,在主窗体完成OnCreate消息的处理后

CMyTestObject::CMyTestObject(CWnd *pParent)
{
CWnd::Create(NULL,"MyTestObject",WS_CHILD,CRect(0,0,0,0),pParent,1234);
}

不能如下调用Create,因为此时CMyTestObject不关联任何窗体,所以this中的m_hWnd无效:

CWnd::Create(NULL,"MyTestObject",WS_CHILD,CRect(0,0,0,0),this,1234);

这时上面四、五两步修改成:

BEGIN_MESSAGE_MAP(CMyTestObject, CWnd)
ON_MESSAGE(WM_MYMSG,OnMyMsgHandler)
END_MESSAGE_MAP()

LRESULT CMyTestObject::OnMyMsgHandler(WPARAM w,LPARAM l)
{
AfxMessageBox("My Messge Handler in My Self-Custom Class!");
return 0; 
}

在类外部发出消息:

CMyTestObject *test=new CMyTestObject();
::SendMessage(test->m_hWnd,WM_MYMSG,0,0);

在类内部某个成员函数(方法)中发出消息:

::SendMessage(m_hWnd,WM_MYMSG,0,0);

最后一个问题便是容易产生警告错误的窗体回收,自定义的类要显式调用窗体销毁,析构函数如下:

CMyTestObject::~CMyTestObject()
{
CWnd::DestroyWindow();
}

在MFC中如何自定义消息及相应事件(VC6.0及VS2005) 首先是VS2005这个开发环境: 自定义消息的步骤如下:(1)建立Single Document的MFC Application,工程名为:MyMessage(2)自定义消息:第一步:定义消息在Resource.h中添加如下代码: //推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。#define WM_MY_MESSAGE (WM_USER+1 阅读详情

相关推荐

MFC实现自定义消息(附完整源码)

MFC实现自定义消息(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 805

MFC自定义消息

1、在.h声明自定义的消息 //WM_USER 是用户自定义消息的一个起始值 //WM_USER+100 是为了区分系统消息和用户消息,避免冲突 #define WU_A WM_USER+100 #define WU_B WM_USER+101 #define WU_C WM_USER+102 #define WU_D WM_USER+103 #define WU_E WM_USER...

sinat_31608641的博客 3436

MFC 自定义消息实现

参看http://blog.youkuaiyun.com/wangshiqilin_fjy/article/details/14458843

MFC开发,自定义消息

基于MFC消息机制实现自定义消息

LWD的博客 1399

深度强化学习研究笔记(1)——入门(马尔科夫决策过程,贝尔曼方程,价值迭代和策略迭代)

1. 强化学习(Reinforcement learning)概述 强化学习(Reinforcement learning)的基本内涵是将问题用代理和环境进行建模。其中代理能够对环境执行一些特定的动作a∈Aa \in Aa∈A,从而到达某个状态s∈Ss \in Ss∈S,然后我们就可以根据该状态为代理赋予特定的奖励rrr。强化学习的基本思想如下图所示: 代理的目标是最大化未来的奖励总和,它通过将...

越野者的博客 5280

上机笔试题目:取出指定条件二维数组的子数组

取出指定条件二维数组的子数组: 1)传入参数为: 参数一:String[][]sArray2字符串二维数组 参数二:Stringkey字符串 参数三:StringkeyFormat含匹配符的字符串,如下:%0-%1,其中%x含义如为:一维数据列序号为x的值。 keyFormat 可以为 %0-%1-%2,%0-%3-%8-%x...... 例子如下...

91奔跑的蜗牛 636

VC/MFC中如何自定义消息

VC/MFC中如何自定义消息 定义一个自定义消息号:const UINT WM_MYMESSAGE = WM_USER + n; // 自定义消息一般大于WM_USER,然后就可以为该消息添加映射了。   afx_msg LRESULT OnMyMessage ( WPARAM wParam, LPARAM lParam );   ON_MESSAGE ( WM_MYMESS

soman的博客 638

CMOS锁相环核心:四种鉴频鉴相器(PFD)结构深度剖析与选型指南

本文深入剖析了CMOS锁相环中四种鉴频鉴相器(PFD)的结构与性能,包括传统RS触发器型、非时钟型、预充电型和边沿触发型PFD。通过详细的电路分析、实测数据和工程案例,提供了PFD选型的实用指南,帮助工程师根据速度、功耗和精度需求选择最优方案,提升锁相环设计效率。

weixin_42530458的博客 588

MFC基于VC6.0自定义消息

自定义一个消息 在头文件中声明消息的处理函数 为消息添加宏映射 添加消息的实现部分 添加消息的触发事件:通过message()发送消息

weixin_40721097的博客 307

卷积神经网络中的边缘检测:从Canny算法到深度学习(PyTorch实现)

本文系统梳理了边缘检测从经典Canny算法到深度学习方法的演进,重点解析了Canny算法的数学原理及其对卷积神经网络设计的深远影响。通过PyTorch实战,详细演示了如何构建并训练一个基于HED架构的深度学习边缘检测模型,并探讨了模型优化、评估及与传统方法融合的高级技巧。

jenkins8butler的博客 152

OpenOCD入门到精通:第20章 Target 子系统源码分析

摘要:本章深入分析OpenOCD Target子系统的核心实现机制。重点包括:1) 通过target_type虚函数表实现多架构抽象,支持ARM、RISC-V等30+种目标;2) ARM ADIv5协议栈实现,包含DAP/AP核心数据结构和访问机制;3) 分层架构设计,从调试接口层到传输层的完整调用链路。系统采用面向对象思想,统一管理目标状态、寄存器缓存、断点/观察点等调试要素,为上层提供标准化的调试操作接口。

从事嵌入式linux android驱动开发,拥有全栈能力 178

VC++/MFC中自定义消息及其PostMessage消息函数使用

VC++/MFC中自定义消息及其PostMessage消息函数使用

懒人一个 1563

华为MetaERP Oracle EBS OM(订单管理)模块详解作为ERP财务解决方案架构师,理解OM模块的业务全景和数据模型至关重要。OM是EBS分销链路的核心引擎,贯穿“订单到收款“(Orde

Oracle EBS OM模块是管理销售订单全生命周期的核心模块,涵盖客户管理、订单执行、发运开票、定价及信用控制等功能。其标准流程包括订单录入、预订、发放、发运确认和自动开票等环节,核心数据表涉及订单、客户、发运和定价等业务对象。OM模块与库存、应收、发运等模块深度集成,架构师需重点设计订单类型、信用控制策略和自动开票接口等关键环节,确保业务流程高效流转。

金牌架构师 361

VC++(MFC) 中的自定义消息

VC++ 中的自定义消息 (作者: 2000年07月12日 16:45)在VC++中想加入自定义消息,以下方法可供参考 …… 1 首先定义消息:例如 define WM_MYMESSAGE (WM_USER+100) 2 在.H文件中,加入消息响应函数,如:         LONG OnMyMessage(WPARAM w,LPARAM l);     该函数有规定的格式:         LO

一粒沙的专栏 705

【WRF安装(2025)】服务器移植 WRF 安装环境

【WRF安装(2025)】服务器移植 WRF 安装环境

WW、forever的博客 106

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Vc/MFC中自定义消息及其PostMessage触发使用

Vc中自定义消息及其触发使用 如何在VC++中加入自定义消息,我的做法:这里我以一个对话框为例子,环境:VS 2008,新建一个工程,选择对话框:以编译器给出的对话框为蓝本,自己新建一个按钮如图:把名字改成如图的,其他比如ID什么的都不改了,默认。1 首先在ownermessageDlg.h中定义消息:例如define WM_MYMESSAGE (WM_USER+100) 2 在.H文件中,加入消

大周辞寒的专栏 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MFC在VC6.0 和 VS2008自定义消息

这段时间看vc++深入详解.看到添加自定义消息那一节,按照书上的方法就是编译不通过.vc6.0和vs2008中添加消息的方法不同.现在就把添加自定义消息的方法记录下来 红色标记的地方为不同之处. 1.定义消息 #define UM_PROGRESS WM_USER+1 2.类头文件中声明消息响应函数(OnProgress) vc6.0声明如下 afx_msg voi

bible521125的专栏 1012

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC学习一日一练(2)---MFC中自定义消息

 消息映射、循环机制是Windows程序运行的基本方式。VC++ MFC 中有许多现成的消息句柄,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困难。在MFC ClassWizard中不允许添加用户自定义消息,所以我们必须手动在程序中添加相应代码,以便可以象处理其它消息一样处理自定义消息。自定义消息的步骤如下:(1)建立Single Document的MFC Application,

lxu的专栏 1543

VC 6.0 PostMeessage错误

最近在帮老师写一个MFC程序,用VC6开发,前几天在运行的时候,发现一个错误,特此记录一次。         程序中有个按钮,点击按钮会给调用PostMessage给主窗口发送自定义消息,在Release模式下,连续点击就会出现异常,查看了PostMessage函数的介绍,其中也并没有说明类似的问题,后来在Bing上找到了一个解决方法。点击打开链接         因为我在声明自定义消息处理函

Developing Questions & Discoveries 814

创建用户控件自定义用户消息及调用(vc,mfc,消息影射)

首先创建一个用户控件类,比如扩展的Button类,Tab卡片类1 在头文件定义用户消息#define WM_TAB_SELECT WM_USER+101(后面加多少自己决定,最好与其他不冲突)2 因为Tab按钮需要区分用户鼠标点击的是哪个按钮所以要在OnLButtonDown中处理3 在OnLButtonDown中向父窗体发送用户消息  GetParent()->PostMessage(WM_TA

darkduck9989的专栏 1580

MFC学习之五:自定义消息

<br />      发消息一般有两种方式:SendMessage 和 PostMessage 。其中SendMessage指发送消息并且等待结果返回后,主进程才继续运行;PostMessage指发送消息后不等待结果返回,主进程直接继续运行。<br />下面举例:如何在VC/MFC机制下发SendMessage消息,其实发PostMessage消息的方式和这是一样的。<br />    //下面为发送用户自定义消息的方式:<br />第一步: 定义消息ID<br />    //可以在头文件stdafx.

597
上一篇: 三星 c3322 uc 浏览器 8.2 版 java错误解决。
下一篇: linux path 修改 立即生效
七十二_72
博客等级 码龄16年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值