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() 该 ...
随机推荐
- python 爬虫 目录
爬虫 介绍 python 爬虫 urllib模块 python 爬虫 requests模块
- 多线程--CreateThread与_beginthreadex本质区别
转载 MoreWindows: 秒杀多线程第二篇 本文将带领你与多线程作第一次亲密接触,并深入分析 CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程 ...
- Oracle密码过期(the password has expired)
1.进入sqlplus模式--sqlplus / as sysdba; 2.查看用户密码的有效期设置(一般默认的配置文件是DEFAULT) SELECT * FROM dba_profiles WHE ...
- 如何获取字符串中某个具体的数值--通过json.load转化成字典形式获取
r=requests.get('http://httpbin.org/get').text print(r) # print(type(r)) # 如果要获取User-Agent的详细数值,需要做JS ...
- 2019中山纪念中学夏令营-Day19 数论初步【GCD(最大公约数),素数相关】
关于GCD的一些定理或运用的学习: 1. 2.二进制算法求GCD 思想:使得最后的GCD没有2(提前把2提出来) 代码实现: #include <cstdio> #define int l ...
- USBIP源码分析
简介 在普通的电脑上,想使用USB设备,必须将插入到主机.USBIP却可以通过网络,让主机访问其他主机上的外部设备,而用户程序完全感知不到区别. usbip的文章在这里:https://pdfs.se ...
- JavaSSM框架精选50道面试题
JavaSSM框架精选50道面试题 2019年02月13日 19:04:43 EerhtSedah 阅读数 7760更多 分类专栏: 面试题 版权声明:本文为博主原创文章,遵循CC 4.0 BY- ...
- Action注入错误
2016-07-13 13:52:09,584 [ERROR]-[com.opensymphony.xwork2.util.logging.commons.CommonsLogger:38] Exce ...
- vue--支付宝支付
1.支付宝支付:前端发起一个请求,后台返回一个页面,直接将返回的页面(一个表单),再执行表单提交 okFryOtherPayHandler(){ let reqBody = {}; reqBody.o ...
- 用js方式取得接口里面json数据的key和value值
大家在实际操作中难免遇到对接口的问题,想必对一些小白来说取得里面想要是数据也是很是头疼,那么接下来我会结合接口实际情况教大家怎么取得里面相应的数据 接口数据例如:(数据为 模拟数据,json格式) { ...