MFC中的几个虚函数
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虚函数。
MFC中的几个虚函数的更多相关文章
- 【转载】 C++多继承中重写不同基类中相同原型的虚函数
本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...
- 转 C++中不能声明为虚函数的有哪些函数
传送门 C++中不能声明为虚函数的有哪些函数 常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函数 ...
- C++中的继承与虚函数各种概念
虚继承与一般继承 虚继承和一般的继承不同,一般的继承,在目前大多数的C++编译器实现的对象模型中,派生类对象会直接包含基类对象的字段.而虚继承的情况,派生类对象不会直接包含基类对象的字段,而是通过一个 ...
- MFC浅析(7) CWnd类虚函数的调用时机、缺省实现
CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...
- MFC 消息映射表和虚函数实现消息映射到底谁的效率高
深入浅出MFC对于虚函数实现方式的缺点,它指出:虚函数耗费大量内存,系统最终将被这些额外负担拖垮. 但是现在对于容量巨大的白菜价格的内存来说,这种额外负担是否已经过时了呢~? 书中提到,虚函数表 ...
- C++中的多态与虚函数的内部实现
1.什么是多态 多态性可以简单概括为“一个接口,多种行为”. 也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可 ...
- C++中不能声明为虚函数的有哪些函数
常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能被overload,不能被o ...
- C++中为什么要用虚函数、指针或引用才能实现多态?
原文链接:http://blog.csdn.net/zoopang/article/details/14071779 学过C++的都知道,要实现C++的多态性必须要用到虚函数,并且还要使用引用或者指针 ...
- C++中构造函数能调用虚函数吗?(答案是语法可以,输出错误),但Java里居然可以
环境:XPSP3 VS2005 今天黑总给应聘者出了一个在C++的构造函数中调用虚函数的问题,具体的题目要比标题复杂,大体情况可以看如下的代码: class Base { public: Base() ...
随机推荐
- jQuery跳转到页面指定位置
@参考博客 var t = $("#id").offset().top;// 获取需要跳转到标签的top值 //$(window).scrollTop(t);// 跳转到指定位置 ...
- linux详解sudoers
sudo使用 Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个.出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限 ...
- spyder在编辑过程中被自己弄乱了,想要恢复成安装时默认的格式或者重置页面格式的解决办法
打开spyder,tools-->Reset Spyder to factory defaults,按照如上操作即可恢复成安装时的默认格式.
- EF利用重写SaveChanges()方法实现 审计日志记录
先上一段最近项目中的代码,此代码可以放到自己项目中的dbContext中 public override Task<int> SaveChangesAsync() { List<Au ...
- jupyter notebook 初步使用配置调整
jupyter notebook 官方说明 初始部分: 如何打开特定的笔记本? 以下代码应在当前运行的笔记本服务器中打开给定的笔记本,必要时启动一个. jupyter notebook noteboo ...
- c#异步等待
1:一直等待 2方法 现实等待 3:方法 带返回值得 begin -endinvoke 4: func 带返回值
- CORBA简介
使用.NET开发corba应用 一. 什么是IIOP.NET IIOP.NET 是通过使用基于corba的IIOP支持.NET.javaEE和corba组件实现无缝互操作的技术.如图1.1所示,这种解 ...
- essential c++ 第一章 array及vector相关使用
将对象初始化: 1.用等号(=)赋值运算符初始化,针对对象是内置类型或者对象可以单一值初始化 2.构造函数初始化,针对对象需要多个初始值的情况 单括号括住的字符表示字符常量(‘ ’): 第一个反斜线表 ...
- PAT 1087 有多少不同的值(20)(STL—set)
1087 有多少不同的值(20 分) 当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然数 ...
- 设置漂亮的eclipse主题(Theme)风格
看看这些主题: Eclipse Color Themes 设置步骤: 1.点击help --> Eclipse Marketplace... 2.搜索Color Eclipse Themes 3 ...