(转)对各种初始化函数的理解:OnInitDialog、InitInstance、InitApplication函数的理解
InitInstance和InitApplication 是 APP 类的初始化。而 OnInitDialog 是在 Dialog 类初始化时调用的函数。
★ 应用程序相关配置,一般在InitInstance()调用。InitInstance()是初始化实例,是WinThread的线程初始化函数,完成WinApp线程初始化。
★ 基于对话框的应用程序中,由于主窗体就是一个Dialog,所以看上去似乎OnInitDialog中也可以放置一些初始化应用程序的代码。但实际上,OnInitDialog是一个消息处理函数,只是在Dialog显示之前、初始化时调用,响应WM_INITDIALOG消息。Dialog相关子窗口就可以放在这里初始化。
BOOL InitInstance() 为什么说它是程序的进入点?还有,那个 WinMain 函数又有什么作用,这两个函数之间有什么关系吗?
BOOL InitInstance()是MFC的CWinApp类的成员函数,而WinMain才是真正的入口点,但是MFC不允许程序中有WinMain这个函数,因为MFC自己编写了WinMain函数,如果程序中再定义就重复定义了,而 MFC编写的WinMain函数则调用了CWinApp::InitInstance函数,所以InitInstance看起来似乎就是MFC程序的入口点。
InitInstance是虚函数,继承类必须提供其实现代码,完成整个消息链的启动。
在CWinApp这个类中除了有一般类都有的构造函数,一个重要的成员函数就是InitInstance,我们知道,在WINDOWS环境下面可以运行同一程序的多个实例(非模态),函数InitInstance的作用就是:在生成一个新的实例的时候,完成一些初始化工作。
Windows允许在同一时刻运行程序的几份拷贝。在概念上,应用程序的 初始化 可以被分为两个部分(由MFC中CWinApp的两个虚函数负责完成):
1、一次性的应用程序初始化工作,这些在应用程序第一次运行时完成(InitApplication:“每一个程序只做一次”);
2、实例的初始化工作,每次运行程序的一个拷贝时都会执行这些操作,包括第一次运行时(InitInstance:“每一个例程都得做一次”)。框架中WinMain实现调用这个函数,重载InitInstance以初始化在Windows下运行的应用程序的每个新实例(通常,重载InitInstance以构造主窗口对象并设置CWinThread::m_pMainWnd数据成员,使其指向这个窗口)。
注: “每一个程序”指的是进程的概念,“每一个例程”指的是线程的概念。InitInstance是每一个线程都具有的函数,只不过很多情况下,你自己开的线程没有重载该函数。其实在基于CWinApp的程序中InitApplication和InitInstance都只执行一次。InitApplication是MFC的较老的入口函数,现在一般不重载InitApplication而直接重载InitInstance。不过如果使用CWinThread或者AfxBeginThread创建线程,新的线程会执行新建CWinThread对象的InitInsatnce函数一次。不过这和CWinApp没有关系。
(转)对各种初始化函数的理解:OnInitDialog、InitInstance、InitApplication函数的理解的更多相关文章
- 深入理解javascript:揭秘命名函数表达式
这是一篇转自汤姆大叔的文章:http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 前言 网上还没用发现有人对命名函数表达式进去重复深 ...
- 转·带你用实例理解C语言回调函数
原文出处:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 前言: 如不懂函数指针,请先查阅关于函数指针内容的资料(h ...
- 深入理解PHP内核(十一)函数-函数的内部结构
原文链接:http://www.orlion.ga/330/ php的函数包括用户定义的函数.内部函数(print_r count…).匿名函数.变量函数($func = 'print_r'; $fu ...
- 深入理解PHP内核(五)函数的内部结构
php的函数包括用户定义的函数.内部函数(print_r count...).匿名函数.变量函数($func = 'print_r'; $func(array('a','b'));) PHP内核源码中 ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- 我所理解的javascript中函数的作用域和作用域链
本文为原创,转载请注明出处: cnzt 文章:cnzt-p 写在前面 一周木有更新了,今天终于攻克了自行车难关,非常开心,特意来一更~ (那些捂嘴偷笑的人我看到你们了快把嘴闭上我会假装没看 ...
- c++中函数的参数传递,内联函数和默认实参的理解
1.参数传递 1)函数调用时,c++中有三种传递方法:值传递.指针传递.引用传递. 给函数传递参数,遵循变量初始化规则.非引用类型的形参一相应的实参的副本初始化.对(非引用)形参的任何修改仅作用域局部 ...
- 深入理解 JavaScript 中的函数
JavaScript函数也具有这些特性,但它们不仅仅是常规函数.JavaScript函数是对象.你可以查看我曾经写的关于JavaScript对象的文章,里面我提到几乎JavaScript中的所有一切都 ...
- 深入理解JavaScript中的函数操作——《JavaScript忍者秘籍》总结
匿名函数 对于什么是匿名函数,这里就不做过多介绍了.我们需要知道的是,对于JavaScript而言,匿名函数是一个很重要且具有逻辑性的特性.通常,匿名函数的使用情况是:创建一个供以后使用的函数.简单的 ...
随机推荐
- Servlet-Jsp
Jsp实际就是Servlet. 我们访问Http://localhost:8080/Web/index.jsp的流程: 1 [jsp文件名].jsp转义为[jsp文件名_jsp].java,文件存储在 ...
- Hibernate中的一级缓存、二级缓存和懒加载(转)
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
- RadioButton 自定义控件
在res/drawable新建radiobutton.xml(本案例为video——evaluate.xml)如下 <?xml version="1.0" encoding= ...
- winform(容器、打印、对话框)
一.布局:2个属性:Anchor:锁定位置Dock:填充位置一般Dock是与容器控件配合使用 二.容器控件:Panel:就是一个区域,类似于DIV,可以独立布局,还可以让其它控件及容器在它的内部再次布 ...
- touch触摸事件
事件对象 事件对象是用来记录一些事件发生时的相关信息的对象.事件对象只有事件发生时才会产生,并且只能是事件处理函数内部访问,在所有事件处理函数运行结束后,事件对象就被销毁! W3C DOM把事件对象作 ...
- 转:Web应用程序项目XX已配置为使用IIS
转:http://www.cnblogs.com/Joetao/articles/2392526.html 今天在看开源项目Umbraco是,出现一个项目加载不了,并报如下错误: Web应用程序项目U ...
- VC连接mysql数据库错误:libmysql.lib : fatal error LNK1113: invalid machine 解决方法
VC连接MySQL的配置过程在上一篇博文中,不过当你设置好,以为万事大吉的时候,运行却出现这个错误:libmysql.lib : fatal error LNK1113: invalid machin ...
- 卸载openfire
首先,确保你已经关掉了openfire打开终端 (在应用程序-->实用工具-->)输入以下命令sudo rm -rf /Library/PreferencePanes/Openfire.p ...
- Oracle行列转换
一.建表与插入数据 1.1.建表 create table kecheng ( id NUMBER, name ), course ), score NUMBER ); insert into kec ...
- JAVA基础学习day25--Socket基础二-多线程
一.上传图片 1.1.示例 /* 上传图片 */ import java.net.*; import java.io.*; import java.util.*; import java.text.* ...