MFC中afx_msg

DECLARE_MESSAGE_MAP() 等消息映射宏以及 afx_msg消息映射函数 DECLARE_MESSAGE_MAP()宏的作用是向类中添加消息bai映射必要的结构体和du函数声明,只需要添加一次,放在什么位置并不重要,就如同类里其他普通函数的声明可以相互交换顺序一样。 函数的修饰符也是可以自己决定的,遵循一般原则。比如你需要在类外部也可以调用该消息响应函数,就可以定义成public的。 但是其实真正的消息映射是在cpp文件里面的 BEGAIN_MESSAGE_MAP() END_MESSAGE_MAP() 这两个宏之间 比如: h: cpp: 如上大体意思就是:只要是CCmdT 阅读详情

应用程序框架产生的消息映射函数
例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体;而在map宏定义中,就有具体消息和此函数的映射定义(可以是自定义,也可以是系统自动完成的)
afx是 application framework
如定义一个Edit的Change处理函数:
一、在类的头文件(*.h)中增加 :

//{{AFX_MSG(CDialogDemo)   
  afx_msg  void OnChangeEdit1();
//{{AFX_MSG   

二、在类的实现文件(*.cpp)中增加:

1.消息定义( ON_EN_CHANGE):

BEGIN_MESSAGE_MAP(CDialogDemo, CDialog)
//{{AFX_MSG_MAP()   
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
 //}}AFX_MSG_MAP   
END_MESSAGE_MAP()   

2.执行函数:

void CDialogDemo::OnChangeEdit1() 
{
 // TODO: Add your control notification handler code here
……
}   

在afxwin.h中afx_msg的解释:

  #ifndef   afx_msg  
  #define   afx_msg    //intentional placeholder  
  #endif  

没什么意思.只是定义了这个符号而已. 这个对编译器来说,相当于什么都没有,对于人来说,我们可以看到这样的符号.
对于类向导来说.这个符号才是有意义的.它是一个消息处理函数的前缀. 类向导生成的消息函数,分发函数,事件响应函数都以这个为前缀. 如果去掉了,向导将不能识别
如何为控件添加消息响应函数呢
MFC为对话框和控件等定义了诸多消息,我们对它们操作时会触发消息,这些消息最终由消息处理函数处理。比如我们点击按钮时就会产生BN_CLICKED消息,修改编辑框内容时会产生EN_CHANGE消息等。一般为了让某种操作达到效果,我们只需要实现某个消息的消息处理函数。

一.添加消息处理函数

鸡啄米仍以前面的加法计算器的程序为例,说明怎样为“计算”按钮控件添加消息处理函数。添加方法列出4种:

1.使用Class Wizard添加消息处理函数

用过的VC++6.0的朋友应该对Class Wizard很熟悉了,添加类、消息处理函数等经常会用到它,可以说是一个很核心的功能。但从VS2002开始就见不到Class Wizard了,大部分功能都集成到对话框和控件等的属性中了,使用很方便。到VS2010,久违的Class Wizard又回来了。但鸡啄米已经习惯了使用属性中的功能了,对于从VC++ 6.0直接转VS2010的朋友可能觉得还是使用Class Wizard比较习惯。

这里写图片描述

大家应该记得,“计算”按钮的ID为IDC_ADD_BUTTON,上图中Commands标签下,Oject IDs列表中有此ID,因为我们是想实现点击按钮后的消息处理函数,所以在Messages列表中选择BN_CLICKED消息,然后点右上方的Add Handler就可以添加BN_CLICKED消息处理函数OnClickedAddButton了。当然你也可以改名,但一般用的默认的就可以。

2.通过“Add Event Handler…”添加消息处理函数

在“计算”按钮上点右键,然后在右键菜单中选择菜单项“Add Event Handler…”,弹出“Event Handler Wizard”对话框,如下图:

这里写图片描述

可见“Message type”中默认选中的就是BN_CLICKED消息,函数名和所在类都已经自动给出,直接点“Add and Edit”就可以了。

3.在按钮的属性视图中添加消息处理函数

上面说过,从VS2002开始就主要从属性视图添加消息处理函数了。我们在“计算”按钮上点右键,在右键菜单中选择“Properties”,右侧面板中会显示按钮的属性视图。

这里写图片描述

我们可以像上图中那样,点属性视图的“Control Events”按钮(类似闪电标志),下面列出了“计算”按钮的所有消息。我们要处理的是BN_CLICKED消息,点其右侧空白列表项,会出现一个带下箭头的按钮,再点此按钮会出现“ OnBnClickedAddButton”选项,最后选中这个选项就会自动添加BN_CLICKED处理函数了。

4.双击按钮添加消息处理函数

最直接最简单的方法就是,双击“计算”按钮,MFC会自动为其在CAdditionDlg类中添加BN_CLICKED消息的处理函数OnBnClickedAddButton()。

二.在消息处理函数中添加自定义功能

在我们使用任意一种方法添加了消息处理函数以后,都只能得到一个空的OnBnClickedAddButton()函数的函数体,要实现我们想要的功能,还需要在函数体中加入自定义功能代码。

在加法计算器程序中,我们想要“计算”按钮实现的功能是,获取被加数和加数的数值,然后计算它们的和并显示到和的编辑框里。那么,OnBnClickedAddButton()的函数体就应修改为:

C++代码

void CAdditionDlg::OnBnClickedAddButton()   
{   
    // TODO: Add your control notification handler code here   
    // 将各控件中的数据保存到相应的变量   
    UpdateData(TRUE);   

    // 将被加数和加数的加和赋值给m_editSum   
    m_editSum = m_editSummand + m_editAddend;   

    // 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值   
    UpdateData(FALSE);   
}  

鸡啄米在上面的代码中已经添加注释,大家应该很容易理解了。对于UpdateData()函数的说明在上一讲中已经介绍过,如果忘了可以再回上一讲了解了解。
接下来我们运行下此应用程序。在运行结果界面中,输入被加数5.1,加数2.3,然后点“计算”:

这里写图片描述
在上图中可以看到,点“计算”按钮后,和的编辑框中显示了正确结果:7.4。

鸡啄米简单分析下运行过程:输入被加数和加数,点“计算”按钮后产生点击消息,从而调用OnBnClickedAddButton()函数。进入此函数后,首先由UpdateData(TRUE)函数将被加数的值5.1和加数的值2.3分别保存到变量m_editSummand和m_editAddend,然后通过语句m_editSum = m_editSummand + m_editAddend;计算出被加数和加数的和为7.4,并把7.4赋值给m_editSum。最后调用UpdateData(FALSE)根据被加数、加数、和的值更新三个编辑框的显示值,就得到了上图中的结果。

==============

如果使用class wizard会自动添加

这里写图片描述

自动添加消息函数映射

引用:https://www.cnblogs.com/linkzijun/p/6196165.html

MFC中的afx_msg和BEGIN_MESSAGE_MAP BEGIN_MESSAGE_MAP 下面是定义:什么事件发生时该执行哪个子程序。 是MFC定义的宏,表示开始一个消息的映射描述。     BEGIN_MESSAGE_MAP(   theClass,   baseClass   )     Parameters     theClass     Specifies   the   name   of   the   class   whose   message   map   this   is.     baseClass     Specifies  阅读详情

相关推荐

MFC工作笔记0004---MFCafx_msg是什么,afx_msg void function()是什么意思

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 应用程序框架产生的消息映射函数 例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体;而在map宏定义中,就有具体消息和此函数的映射定义(可以是自定义,也可以是系统自动完成的) afx是 application framework 如定义一个Edit的Change处理函数: 一、在类的头文件(*.h)中增加 : .

添柴程序猿的专栏 1413

C++基础(十五)C++ afx_msg消息处理详细分析:BEGIN_MESSAGE_MAP 、ON_WM_TIMER(&ReduceDB::OnTimer) 、ON_MESSAGE

一、简介        最近用到了获取,串口消息,消息处理主要用到了微软的<afxwin.h>头文件的afx_msg类。先调研一番消息处理函数,然后举例说明。那么我们分为下面几个步骤讨论MFCafx_msg定义的消息。 步骤一:          在头文件KGenDel.h中,用afx_msg定义消息及其格式。 步骤二:         在KGenDel.cpp中,使用 B...

xpj8888的博客 6194

1006. 换个格式输出整数 (15)-PAT乙级真题

1006. 换个格式输出整数 (15)让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。输出格式:每个测试用例的输出占一行,用规定的格式输出n。输入样例1...

柳婼 の blog 2212

AFX_MSG是什么意思

以前一直不知道AFX_MSG是什么意思,只是觉得它应该是个消息映射函数,但是具体代表什么意思,会返回一个什么样的值是一点都不清楚,今天查了下资料,把查到的东西放这,以免以后忘了还得再查。 在头文件(DrawView.h)中声明消息响应函数原型。 //{{AFX_MSG(CDrawView) //注释宏 afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //}}AFX_MSG //注释宏 说明: 在注释...

m0_37135980的博客 1844

MFC(Microsoft Foundation Classes)中 afx_msg和 friend关键字

是两个关键字,用于在类声明中指定函数的属性和访问权限。是一个关键字,在C++中用于声明类的友元关系,允许其他类或函数访问该类的私有成员。是一个宏,在MFC中用于指定成员函数是消息映射机制的一部分,用于响应窗口消息。在MFC(Microsoft Foundation Classes)中,afx_msg`宏来修饰消息处理函数,以便将其与消息映射机制关联起来。friend`关键字,可以授权其他类或函数访问该类的私有成员。

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 707

MFC框架 afx_msg && CComboBox OnDropdown

MFC afx_msg afx是 application framework 应用程序框架产生的消息映射函数 例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体; 而在map宏定义中,就有具体消息和此函数的映射定义(可以是自定义,也可以是系统自动完成的) 如定义一个Edit的Change处理函数: 一、在类的头文件(*.h)中增加 : //{{AFX_MSG(CDialogDemo) afx_msg

qq_40851561的博客 513

C++ MFC中的afx_msg and on_command

1.afx_msg  afx_msg 是一个宏 标识是消息映射函数,增加可读性。        在 MSDN里是这样定义的:              AFX_MSG               remarks               ClassWizard   and   AppWizard   insert   specially   format

u012746763的专栏 2087

MFCafx_msg是什么

应用程序框架产生的消息映射函数 例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体;而在map宏定义中,就有具体消息和此函数的映射定义(可以是自定义,也可以是系统自动完成的) afx是 application framework 如定义一个Edit的Change处理函数: 一、在类的头文件(*.h)中增加...

三余丨无梦生 8808

MFC中的#ifndef afx_msg #define afx_msg // intentional placeholder #endif

#ifndef afx_msg #define afx_msg         // intentional placeholder #endif 如果没有定义afx_msg就定义它,相当于一个标识符 这个定义来自afxwin.h 目前来说他只是个占位符,没什么意义,以后可能会赋予其实际意义,对编译器来说,相当于什么都没有,对于人来说,我们可以看到这样的符号. 对于类向导来说.这个符号才

woniu199166的博客 1123

MFCafx_msg是什么,afx_msg void function()是什么意思

应用程序框架产生的消息映射函数例如:afx_msg void OnBnClickedButton1(); 其中 afx_msg为消息标志,它向系统声明:有消息映射到函数实现体;而在map宏定义中,就有具体消息和此函数的映射定义(可以是自定义,也可以是系统自动完成的)afx是 application framework如定义一个Edit的Change处理函数:一、在类的头文件(*.h)中增加 :

NCTU_to_prove_safety的博客 1679

//{{AFX_MSG、//{{AFX_VIRTUAL、//{{AFX_MSG_MAP、//{{AFX_DATA_INIT用途

说明:这篇日志我不知道怎么命名好,虽然内容很少,但是讲的关键字很多,如果你有幸打开这篇日志,不妨往下看看 背景:我们使用 VC++6.0 开发MFC应用程序,初学者一定会为那么多行的注释代码感到头痛,下面就说说这些有益无意义的注释 //{{AFX_MSG、//{{AFX_VIRTUAL、//{{AFX_MSG_MAP、//{{AFX_DATA_INIT 我们看到很多这样打头的代码,其中典型的一个,在你应用程序的 CApp 头文件中 // Implementation //{{AFX_MSG..

thanklife的专栏 900

AFX_msg 的使用,消息响应

Afx前缀是微软MFC一个小组的名称简写,并没有别的意义。 MFC的很多代码,包括全局函数名、宏、头文件名都使用了"Afx"。 Afx*.h是一组MFC的核心头文件, 比如: afxwin.h 定义MFC的核心和标准组件 afxext.h 定义MFC的扩展 afxdisp.h 是MFC自动化支持的类定义头文件 afxdb.h 是MFC的ODBC类封装 AFX_msg   在头文件(DrawVi

berry666的专栏 1401

MFC添加afx_msg点击事件

在头文件中最下方protected中先定义消息事件: 我这里定义了一个左键双击shi'jian

Raynond的博客 602

afx_msg作用与afx_前缀说明

Afx前缀是微软MFC一个小组的名称简写,并没有别的意义。 MFC的很多代码,包括全局函数名、宏、头文件名都使用了"Afx"。 Afx*.h是一组MFC的核心头文件, 比如: afxwin.h 定义MFC的核心和标准组件 afxext.h 定义MFC的扩展 afxdisp.h 是MFC自动化支持的类定义头文件 afxdb.h 是MFC的ODBC类封装 AFX_msg   在

LL-Studio的专栏 7359
上一篇: MFC-给窗口添加滚动条
下一篇: MFC-客户区与非客户区
godqiao
博客等级 码龄10年 35粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值