技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152
应用程序框架产生的消息映射函数
例如: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消息,点其右侧空白列表项,会出现一个带下箭头的按钮,再点此按钮会出现“<Add> OnBnClickedAddButton”选项,最后选中这个选项就会自动添加BN_CLICKED处理函数了。

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

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

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

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

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

C++代码

  1. void CAdditionDlg::OnBnClickedAddButton()
  2. {
  3. // TODO: Add your control notification handler code here
  4. // 将各控件中的数据保存到相应的变量
  5. UpdateData(TRUE);
  6. // 将被加数和加数的加和赋值给m_editSum
  7. m_editSum = m_editSummand + m_editAddend;
  8. // 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值
  9. UpdateData(FALSE);
  10. }

鸡啄米在上面的代码中已经添加注释,大家应该很容易理解了。对于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会自动添加

自动添加消息函数映射

MFC工作笔记0004---MFC中afx_msg是什么,afx_msg void function()是什么意思相关推荐

  1. MFC工作笔记0005---::在vc++中是什么意思

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 是C++里的,是"域操作符". 比如声明了一个类A,类A里声明了一个成员函zh ...

  2. MFC进修笔记2——MFC和Win32

    1.MFC Object和Windows Object的关系 MFC中最首要的封装是对Win32 API的封装,是以,懂得Windows Object和MFC Object (C++对象,一个C++类 ...

  3. C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理

    一.MFC概念和作用 1.全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的执行流程 ...

  4. MFC工作笔记0009---VC++中 PostMessage和SendMessage的区别

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 最近利用vc编写UDP通讯程序,对其中的消息机制进行了整理.vc中的消息处理与.net中不同.Ne ...

  5. MFC工作笔记0010---PeekMessage 详解

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 功能说明 WinCE/Win32 :该函数从进程消息队列中检索一个消息,并将该消息(如果存在的话) ...

  6. MFC工作笔记0007---消息映射处理

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 使用消息可以,简单的实现线程间通信,一个线程,发消息给另一个线程,从而实现通信 消息通信的过程: ...

  7. MFC工作笔记0006---#pragma warning(disable:4996)是什么意思

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 代码实现:在.H .CPP文件开头写上:#pragma warning(disable:4996) ...

  8. MFC工作笔记0011---atoi的用法

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换 ...

  9. MFC工作笔记0008---UDP协议通信_sendto 和 recvfrom 浅析与示例

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 UDP(user datagram protocol)用户数据报协议,属于传输层. UDP是面向非 ...

最新文章

  1. Mysql常用词汇_mysql 数据库常用单词
  2. 如何在ARM开发板上从源码编译安装OpenCV和OpenCV contrib
  3. 6.排序算法最优的时间复杂度
  4. FFmpeg 音视频处理总纲
  5. 【bzoj2326】[HNOI2011]数学作业 矩阵乘法
  6. java - 匿名类
  7. mysql8.0.11 zip安装教程
  8. Round Numbers
  9. 环境安装_Python教程 Python环境安装
  10. c语言side输出空心正方形,回溯法--正方形(蛋糕切分)问题
  11. DeepSort轨迹跟踪方法
  12. 数据同步工具ETL-kettle使用
  13. Vue自学之路8-vue模版语法(事件绑定)
  14. origin柱状图坐标标签_origin菜鸟求助。如何做横坐标连续(如下图)的柱状图?...
  15. python里end的用法_python不换行之end=与逗号的意思及用途
  16. ANSYS WORKBENCH基础学习之应力奇异及位移结果对比
  17. Meltdown 论文翻译
  18. mysql 删除重复数据只保留一条记录
  19. IPA进军城市大脑丨实在智能与银江技术达成战略合作
  20. 几组数据的相关性python_几的解釋|几的意思|漢典“几”字的基本解釋

热门文章

  1. Redis万字总结,面试必备
  2. 完美的代价(蓝桥杯)
  3. 2021.5.23 中国高速列车运维技术讲座
  4. DCMTK:wwwapp instalation
  5. 【转】位操作基础篇之位操作全面总结
  6. 架构师Jack专访:全面认识软件测试架构师
  7. .net core在Linux下获取AD域信息
  8. 菜鸟学Linux 第031篇笔记 script,控制,while,function
  9. MYSQL远程登录报错: Error No. 2003
  10. rabbitmq docker