1、PreTranslateMessage()和WindowProc()

PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,通过函数名也可以猜出来。绝大多数窗口的消息都要通过这里,比较常用,当你需要在MFC之前处理某些消息时,常常要在这里添加代码。通过重载这个函数,我们可以控制窗口的消息控制流程。不经过PreTranslateMessage()的消息是采用SendMessage()或其他类似的向窗口直接发送而不经过消息队列的消息,故切记SendMessage()发送的消息是不能用PreTranslate来截取的,应该重载WindowProc窗口过程来响应消息!

因为PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,所以PreTranslateMessage()肯定是在窗口过程WindowProc()之前调用,而且对话框的WindowProc()里不能响应WM_KEYDOWN和WM_CHAR消息(因为他们被WINDOWS内部的对话框过程处理了,即在基类中完成了处理,或者被发送给子控件进行处理),所以我们都是重载PreTranslateMessage()而不是WindowProc()。

2、PreSubclassWindow()

PreSubclassWindow通过名字就知道是SubclassWindow之前调用的,那什么是SubclassWindow呢,SubclassWindow被称为子类化窗口。子类化窗口(控件)就是将窗口(控件)原有的、标准的消息处理函数替换成对应的MFC消息处理函数。
通过ddx/ddv机制绑定的控件不用调用Create(),其创建的时候也不会触发OnCreate(),因为它走的是子类化机制,而动态创建的控件是Create()完成的而不走子类化机制。所以,如果你定义了一个控件(如CButton派生类CMyButton),然后使用对话框数据交换(ddx/ddv)将一个按钮与自己的派生类对象关联,这时候你如果想要在Button建立之前做一些操作就应该写在"PreSubclassWindow()"中。而如果你用的不是对话框数据关联ddx/ddv,而是自己通过Create()动态创建的Button窗口,这时候,一些建立前的操作就应该写在PreInitDialog()或PreCreateWindow()中,而一些建立后的操作可以放在OnCreate()中。

控件的Create()函数可以设置控件的风格,而通过在资源视图创建(ddx/ddv机制绑定)的控件不用调用Create(),这时候可以在资源视图下右击按钮->属性来设置控件风格。

3、OnInitDialog()
    OnInitDialog()函数是对WM_INITDIALOG消息作出的反应,这条消息是在对话框即将显示之前,在Create,CreateIndirect或DoModal调用期间发出的。

4、OnOK()、OnCancel()、DestroyWindow()
    如果要处理用户点击MFC对话框自动生成的“确认”按钮事件则重载OnOK();
    如果要处理用户点击MFC对话框自动生成的“取消”按钮事件或右上角“关闭”选项则重载OnCancel();
    OnOK()和OnCancel()最终都会调用DestroyWindow();
    如果想关闭对话框则直接调用OnOK()函数,OnOK()是CDialog类的protected虚函数。

转载于:https://www.cnblogs.com/milanleon/p/5784357.html

MFC中的几个虚函数相关推荐

  1. C++中的继承与虚函数各种概念

    虚继承与一般继承 虚继承和一般的继承不同,一般的继承,在目前大多数的C++编译器实现的对象模型中,派生类对象会直接包含基类对象的字段.而虚继承的情况,派生类对象不会直接包含基类对象的字段,而是通过一个 ...

  2. C++多继承中重写不同基类中相同原型的虚函数

    在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA  {  public:  virtual void TestA();  };  class ...

  3. C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中

    C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中 测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中. 派生类有多少个拥有虚函数的基类,派生类对象就有多少 ...

  4. 为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数?

    为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数 构造函数中为什么不能调用虚函数? 第一个理由是概念上的 第二个理由是机械上的. 构造函数不能声明为虚函数的原因是 1 构造 ...

  5. MFC中定义全局变量和全局函数的方法

    使用Visual C++6.0 中的MFC 基本应用时, 由于 MFC 制作的工程由很多文件构成, 它不能象一般C++程序那样随意在类外定义全局变量, 那样有时会在运行程序时出现问. 在软件开发过程中 ...

  6. C++中为何析构函数总是虚函数?

    问题: 为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值? 答案: 编译器总是根据类型来调用类成员函数.但是一个派生类的指针可以安全地转化为一个基类的指针.这样删 ...

  7. 构造函数中不应调用虚函数

    今天调试程序,遇到一个很费解的问题,现在做个记录: class CS3Adapter : public CBaseAdapter 类CS3Adapter继承于CBaseAdapter,其中 CBase ...

  8. C++中不能声明为虚函数的有哪些函数

    常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能被overload,不能被o ...

  9. MFC中的AssertValid和Dump函数

    本文转载自:VC调试中,AssertValid和Dump函数的应用 -----------------------------------------AssertValid()函数---------- ...

  10. C++ 中的Virtual Function (虚函数)

    1.C++ Virtual 用法 这里只讲语法,因为讲原理比较难.还没有涉及到构造函数.那么就直接上代码了: // VitualFunction.cpp : Defines the entry poi ...

最新文章

  1. day1 工资条的制作
  2. 改变ie浏览器的收藏夹位置
  3. 360加固逆向脱壳之过反调试
  4. html边框自动变颜色,css怎么设置边框颜色?
  5. mysql where range_MYSQL explain详解之range
  6. ep100can程序
  7. 有哪些好用的游戏加速器推荐?
  8. h3c交换机重启_h3c交换机常用命令
  9. 331. 验证二叉树的前序序列化
  10. sessionStorage 、localStorage 和 cookie
  11. 对比分析冯诺依曼结构和哈佛结构。
  12. ubuntu下载神器---xdm
  13. C语言LCD1602液晶实验报告,LCD1602液晶显示实验报告.doc
  14. 【读一本书】《昇腾AI处理器架构与编程》--神经网络基本知识学习(1)
  15. 面试题-ARP防御方法
  16. java速度出现obd_将多个OBD命令一起发送并同时获得响应
  17. 计算机游戏攻略70,70亿人攻略大全 七十亿人全关卡双星代码通关攻略
  18. 如何安装、设置采集卡,如何使用采集卡工具检查采集信号
  19. 小白上班摸鱼学python
  20. WPF最新的电子书整理打包下载

热门文章

  1. 区块链 智能合约 虚拟机 EVM 资料总结
  2. springboot+vue+websocket 消息推送
  3. 基于SSM的猫头鹰在线视频网站
  4. multism中ui和uo应该怎么表示_第310 这四个常考英语单词,到底表示时间还是地点?...
  5. 十八、Oracle学习笔记:PLSQL操作(含游标的操作)
  6. 1.5.PHP7.1 狐教程-(PHP开发工具 PHPStorm 配置)
  7. 阶段3 2.Spring_06.Spring的新注解_2 spring的新注解-Bean
  8. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第1节 网络通信概述_3_网络通信协议分类...
  9. flask gunicorn gevent部署
  10. java之struts2之类型转换