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() ...
随机推荐
- React学习札记一
I’m in a hurry! 我在赶时间! It’s her field. 这是她的本行. It’s up to you. 由你决定. You owe me one.你欠我一个人情. 1.React ...
- 洛谷 P1342 请柬(SPFA)
题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被雇来分发这些请 ...
- jsp页面\n换行替换
1,js替换 var text= $(this).text(); var reg = new RegExp("\\n","g");//g,表示全部替换. tex ...
- css重要知识点
1.float:left;表示靠左显示.它是相对于距离最近的且以relative作为position的父元素而言的. 2.块级元素和行内元素 块级元素:占据了一个矩形框的元素,display属性的值为 ...
- Python数据分析--Pandas知识点(一)
本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘 1. 重复值的处理 利用drop_duplicates()函数删除数据表中重复多余的记录, 比如删除重复多余的ID. im ...
- xss测试用例
alert(1)// 'alert(1)// '>alert(1)// >alert(1)// "alert(1)// ">alert(1)// alert(1) ...
- django分页的东西, 不详细, 但是也足够了。
视图函数中的代码 from django.shortcuts import render, HttpResponse, redirect import json from django.core.pa ...
- Python.Books
Flask 1. Flask Web Development Miguel Grinberg April 2014 2. Flask Framework Cookbook Shalabh Aggarw ...
- 探索未知种族之osg类生物---器官初始化三
当判断到viewer中没有一个graphicContext可用时,osg就会默认的进行一次对viewer的实现操作,这样可以保证osg以后可以安心的在屏幕上进行作画.那我们就来看看这个osgViewe ...
- git分支切换时的时间戳问题
1.为什么git仓库没有保留文件修改时的时间戳? 摘自:https://git.wiki.kernel.org/index.php/Git_FAQ#Why_isn.27t_Git_preservin ...