MFC:OnCreate PreCreateWindow PreSubclassWindow
OnCreate PreCreateWindow PreSubclassWindow
PreCreateWindow和PreSubclassWindow是虚函数,而OnCreate是一个消息响应函数。
对比对话框的2种创建方式下,这3个函数的是否调用的状态:
OnCreate | PreCreateWindow | PreSubclassWindow | |
CDialog::Create | 是 | 否 | 是 |
CDialog::DoModal | 是 | 否 | 是 |
对比控件的2种创建方式下,这3个函数的是否调用的状态:
OnCreate | PreCreateWindow | PreSubclassWindow | |
通过CWnd派生类的Create函数 | 是 | 是 | 是 |
通过对话框模版创建 | 否 | 否 | 是 |
由此可以看出:PreSubclassWindow是一个最靠谱的函数,在任何情况下都会得到调用。PreSubclassWindow是一个CWnd类的对象在Attach到一个Windows窗口句柄(也称为子类化,或者Subclass)后所调用的第一个函数。这是个虚函数,一般从MFC的控件类派生出来的子类都会重载这个函数,在内部调用ModifyStyle函数来修改窗口的风格。特别的,如果使用对话框模版来创建窗体的话,一般情况下,对话框上的控件是用动态数据交换的方式来创建的(CDialog::OnInitDialog会调用DoDataExchange函数,继而调用DDX_Control来Subclass控件),此时PreSubclassWindow是在运行时修改控件风格的最佳地方。
PreCreateWindow,顾名思义是在创建窗口之前所调用的函数。通过修改传递给这个函数的类型为CREATESTRUCT的参数,派生类可以修改窗口的风格。但是上面的2个表格说明这个函数得到调用的机会其实只有一个:通过CWnd派生类的Create函数创建窗体的时候。特别的,对话框类的PreCreateWindow永远都不会被调用。
作为一个虚函数,ClassWizard在添加这个函数的时候,会加上对基类函数调用的代码。通常这个代码只是调用下CWnd::PreCreateWindow函数,而这个函数只是用来确保窗口的类名不为NULL,因此对基类函数的调用可以酌情省略。
OnCreate是在窗口创建出来之后对WM_CREATE消息进行响应的函数。不过很不幸的是,通过对话框模版创建出来的控件,它们的OnCreate函数根本不会被调用。
总结:对话框类一般会添加OnCreate消息处理函数,用于在窗口创建之后做一些工作,比如创建Timer什么的;控件类一般会重载PreSubclassWindow函数来修改控件的风格,比如设置为OWNERDRAW。
参考链接:
MFC:OnCreate PreCreateWindow PreSubclassWindow的更多相关文章
- MFC 课程总结
<基于MFC框架开发>马志国 1491989781 MFC课程的组成 1.1 MFC应用程序的组成部分.执行机制和执行流程(10.5天). 1.2 Windows平台上的数据库访问技术(1 ...
- 眼见为实(2):介绍Windows的窗口、消息、子类化和超类化
眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和 ...
- CWnd中PreCreateWindow、PreSubclassWindow、SubclassWindow的区别
http://blog.csdn.net/swimmer2000/archive/2007/10/30/1856213.aspx MFC(VC6.0)的CWnd及其子类中,有如下三个函数: / ...
- CWnd中PreCreateWindow、PreSubclassWindow、SubclassWindow
原文链接:http://blog.chinaunix.net/uid-14607221-id-2794642.html 1. PreCreateWindow: Called by the framew ...
- MFC函数—— CWnd::PreCreateWindow
CWnd::PreCreateWindow virtual BOOL PreCreateWindow( CREATESTRUCT& cs ); 返回值: 如果要继续窗口的创建过程,则返回非零 ...
- MFC函数——CWnd::OnCreate
CWnd::OnCreate afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct ); 返回值: OnCreate必须返回0以继续CWnd对象的创建 ...
- MFC程序中消息以及函数的处理顺序简介[转]
MFC应用程序中处理消息的顺序 1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该 ...
- MFC浅析(7) CWnd类虚函数的调用时机、缺省实现
CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...
- MFC应用程序创建窗口的过程 good
MFC应用程序中处理消息的顺序 1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该 ...
随机推荐
- C语言中typedef,条件编译,结构体的说明
目录 typedef (类型别名) 条件编译 条件编译在头文件包含中的应用 结构体 使用结构体定义新的结构体变量 结构体成员的引用与赋值 结构体指针及其引用 typedef (类型别名) typede ...
- 系统的可用性用平均无故障时间( MTTF)
计算机系统的可用性用平均无故障时间( MTTF)来度量,即计算机系统平均能够正常运行多长时间,才发生一次故障.系统的可用性越高,平均无故障时间越长. 可维护性用平均维修时间(MTTR)来度量,即系统发 ...
- SpringBoot 使用Mybatis操作mysql示例
1.准备数据库 创建数据库 create databases baodanjia; 创建帐号 create user 'baodanjia'@'%' identified by '123456' gr ...
- php 内存原理
1.内存结构: 栈区:保存变量名,对CPU,读写速度很快 堆区:保存复杂的数据结构,想对象,数组,复杂的字符串等. 数据段:数据段分为数据段全局区(简单的数据,整型和布尔类型)和数据段静态区(存储静态 ...
- Hive 教程(三)-DDL基础
DDL,Hive Data Definition Language,数据定义语言: 通俗理解就是数据库与库表相关的操作,本文总结一下基本方法 hive 数据仓库配置 hive 数据仓库默认位置在 hd ...
- nginx配置一般优化参数
#user nobody; worker_processes 2; # CPU亲和力,worker_processes最多开启8个,注意写法 worker_cpu_affinity 01 10; wo ...
- innodb中一颗B+树能存储多少条数据
如图,为B+树组织数据的方式: 实际存储时当然不会每个节点只存3条数据. 以InnoDB引擎为例,简单计算一下一颗B+树可以存放多少行数据. B+树特点:只有叶子节点存储数据,而非叶子节点存放的是用来 ...
- sql--ALTER
ALTER TABLE 语句 ALTER TABLE 语句用于在已有的表中添加.修改或删除列. SQL ALTER TABLE 语法 如需在表中添加列,请使用下列语法: ALTER TABLE tab ...
- session+验证码 学习
分析 LoginServlet类 @WebServlet("/loginServlet") public class LoginServlet extends HttpServle ...
- 06 Python之列表和元组
1. 什么是列表 定义: 能装对象的对象 在python中使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求 列表存在索引和切片. 和字符串是一样的. 2. 相关的增删改查操作 添加: 1 ...