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() ...
随机推荐
- robotium—只有apk文件的测试
把ppt的内容总结一下,并把问题说明一下: 把基本步骤搞出来,用notepad的程序吧,直接安装apk,就当做是不知道源码就好啦! 直接用自己的手机上就行啦!! 一.重签名: 步骤: 1.直接运行re ...
- [LeetCode_98]Validate Binary Search Tree
题目链接 https://leetcode.com/problems/validate-binary-search-tree/ 题意 判断给定树是否是BST 思路 根据定义判断.递归. 代码 clas ...
- 《centos系列》ubuntu终端链接centos服务器
首先你得知道centos的账户密码:如果你不知道可以直接在centos下使用root用户: passwd 用户名 直接更新用户的密码. 然后在ubuntu终端(前提是已经安装了ssh): ssh ad ...
- IntelliJ IDEA 运行 Maven 项目
1.官方文档说IntelliJ IDEA已经自身集成了maven,则不用劳心去下载maven 2.导入一个程序,看是否是maven程序的关键在于工程之中有没有pom.xml这个文件,比如这里 3. ...
- 关于MYSQL字符集问题(一)
MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation). 对于字符集的支持细化到四个层次: 服务器(se ...
- PHP守护进程化
什么是守护进程? 一个守护进程通常补认为是一个不对终端进行控制的后台任务.它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端.常用的实现方式是fork() -> setsid() ...
- threejs指定对象旋转中心
指定对象旋转中心 默认情况下,对象的旋转中心都是自身的中心.对于组对象而言,也是如此.因此,可以利用这个特点,实现对象绕任何点旋转,也就是指定旋转中心.比如我们想要下图的对象绕A点旋转 我们可以添加 ...
- sql建立一种,自定义的执行作业
USE [chongwu] GO /****** Object: StoredProcedure [dbo].[p_createjob] Script Date: 01/21/2016 14:32:0 ...
- andorid 进度条和图片的透明度
layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...
- poj 2828(线段树 逆向思考) 插队是不好的行为
http://poj.org/problem?id=2828 插队问题,n个人,下面n行每行a,b表示这个人插在第a个人的后面和这个人的编号为b,最后输出队伍的情况 涉及到节点的问题可以用到线段树,这 ...