CDialog的派生类中OnOK()函数和virtual的关系

原创 2004年06月26日 21:18:00

CDialog的派生类中OnOK()函数和virtual的关系

  • 插入一个对话框后,建立一个名为CMyDialog的类,从CDialog派生;
  • 由于添加对话框资源时,会自动产生一个ID为IDOK的按钮,我们可以给它添加一个默认为OnOK()的处理函数;
  • OnOK()在MyDialog.h中的声明为 virtual void OnOK();
  • 如果我们在对话框上增加一个按钮,默认ID为IDC_BUTTON1,我们可以给它添加一个默认为OnButton1()的处理函数;
  • OnButton1()在MyDialog.h中的声明为 afx_msg void OnButton1()
  • 并且在MyDialog.cpp中有一个消息映射宏:ON_BN_CLICKED(IDC_BUTTON1,OnButton1)

为什么同样是按钮的消息映射函数,OnButton1()和OnOK()的实现方式有这么大的区别?因为对于ID为IDOK的按钮,CDialog是作为一个特殊的按钮使用的,特殊之处在于要在其中实现数据的交换,即要调用DoDataExchange()。(这是另外一个有趣的话题,根据我的经验,不少人对于DoDataExchange()是知其然,不知其所以然,在以后的帖子中有时间的话另外讨论)。

但是实际上,对于IDOK的按钮的消息映射还是遵循了和普通按钮IDC_BUTTON1一样的处理途径:

  • 如果跟踪CDialog::OnOK(),我们进入了DlgCore.cpp,这是CDialog的实现文件,可以在其中发现CDialog的消息映射表中就有ON_COMMAND(IDOK, OnOK),实际上ON_BN_CLICKED消息映射宏也是处理了WM_COMMAND的消息,所以两者的作用是一样的;
  • 再进入AfxWin.h,这是CDialog的声明文件,在其中可以发现CDialog中声明了virtual void OnOK();

啊哈!我们终于知道了OnOK()的来龙去脉!即在基类中使用普通消息映射的方式实现,只是基类中声明其为virtual函数,所以可以调用CMyDialog中的OnOK()函数!

小Tips:

  1. 如何进入进入AfxWin.h?在VC程序中输入CDialog,鼠标右键点击,选择弹出菜单中的Go To Definition of CDialog,或者键盘光标定位在CDialog的任何位置,按下<F12>;
  2. 为什么 afx_msg void OnButton1()的声明有afx_msg,而OnOK()没有??请大家使用F12的方法跟踪afx_msg这个奇怪的函数修饰符的声明:
    #ifndef afx_msg
    #define afx_msg // intentional placeholder
    #endif
    啊,原来它什么都不是?!在所有的消息映射函数的声明前添加这个东东,据说是为了以后的扩展,可能以后这个东东就是一个特别的表示消息映射函数的符号了。但是C#既出,.Net Framework Library替代MFC的趋势似乎不可避免……,以后我们的afx_msg还会有更新的一天吗?

MFC中解决回车和ESC关闭的问题,重载OnOk(),OnCancel()函数的正确做法

本文参考了如下文章: http://msdn.microsoft.com/en-us/library/66b3y2ab(VS.71).aspx http://topic.csdn.net/u/2010...
  • phenixyf
  • phenixyf
  • 2014年12月12日 17:42
  • 1734

关于C++类成员函数的重载、覆盖、隐藏与virtual关键字

1. 重载、覆盖与隐藏1).重载:成员函数具有以下的特征时发生”重载”A.相同的范围(同一个类中)B.函数的名字相同C.参数类型不同(不能进行隐式类型转换)D.Virtual关键字可有可无2).覆盖(...
  • yuhaiyang457288
  • yuhaiyang457288
  • 2015年05月29日 23:48
  • 1211

[MFC]CDialog类简介、创建模态对话框

1. CDialog类的基本使用方法:      1) 在创建自己的对话框之前必须先从CDialog类派生出自己的类,并在派生类中定义一些自己的数据域以及其它新的函数;      2) CDialog...
  • Lirx_Tech
  • Lirx_Tech
  • 2015年09月02日 16:27
  • 1296

C++语言笔记系列之十五——派生类、基类、子对象的构造和析构函数调用关系

例子 example 1 注:若一个基类同时派生出两个派生类,即两个派生类从同一个基类继承,那么系统将为每一个简历副本,每个派生类独立地使用自己的基类副本(比如基类中有属于自己类的静态变量等)。 #i...
  • laoniu_c
  • laoniu_c
  • 2014年07月01日 22:41
  • 806

C++ Primer 面向对象编程 15.2 基类和派生类 virtual

写了一个小程序来复习 基类和派生类 知识 1.item_base.h #pragma once #include #include using namespace std; class item...
  • big_bit
  • big_bit
  • 2016年06月04日 16:03
  • 335

C++ 派生类和virtual

本文原地址:http://www.educity.cn/develop/479093.html Virtual是C++ OO(面向对象机制)机制中很重要的一个关键字。虚函数就是因为成员函数加了关键字...
  • Maxiao1204
  • Maxiao1204
  • 2016年05月19日 08:53
  • 299

基类中virtual与派生类中的override、new

using System; using System.Collections.Generic; using System.Text; namespace Virtual与派生类中的Overrid...
  • hongyanjava
  • hongyanjava
  • 2011年11月09日 16:00
  • 722

在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数。下面就是一个例子:

  • 2008年09月06日 16:15
  • 4KB
  • 下载

EndDialog和CDialog::OnOK()

转自:http://hi.baidu.com/asd4790007/item/8a1a71e01ba12b15595dd8da 第一,OnOK()和OnCancel()是CDialog基类的成员函数...
  • hnu_zxc
  • hnu_zxc
  • 2012年07月09日 16:47
  • 4250

构造函数和析构函数在派生类中执行顺序须知

  • 2013年10月21日 09:29
  • 33KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CDialog的派生类中OnOK()函数和virtual的关系
举报原因:
原因补充:

(最多只允许输入30个字)