MFC初始化过程

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

MFC应用程序不但具有一般的Win32程序的主要入口WinMain函数,还有一个CWinApp派生类的全局实例 theApp

Mfc程序(EXE)的程序运行过程如下:

首先是全局构造

CObject构造函数à CCmdTarget àCWinThreadàCWinAppà theApp构造函数

然后进入WinMain函数

WinMainàAfxWinMainàAfxWinInitàtheApp.InitApplicationàtheApp.InitInstance

接着执行线程过程。

theApp.Run()

最后清理

AfxWinTerm

在各种初始化函数中,反复调用了AfxGetAppAfxGetThread函数。在WinMain过程中,这两个函数实际上返回同一实例指针theApp。在其它线程中,AfxGetThread返回当前线程对象,这也就是为什么在MFC中新建线程不能使用CreateThreadbeginthread(ex),而要使用AfxBeginThread。后者会创建一个CWinThread的实例。

AfxGetAppAfxGetThread这两个全局函数是如何得知当前应用程序对象(theApp)和当前线程对象呢?在MFC中,有一个AFX_MODULE_STATE全局实例_afxBaseModuleState

(实际代码中_afxBaseModuleState_AFX_BASE_MODULE_STATE的实例,而_AFX_BASE_MODULE_STAT只是前者的一个包装,直接继承AFX_MODULE_STATE类,为了简化关系,这里把它们等同起来)。它以下划线开始,所以被认为是内部使用,不能直接操作。直接操作它的是函数AfxGetAppModuleState

AFX_MODULE_STATE的定义相当复杂,很多是为其它部件保留的与模块(EXE)相关状态参数(所以命名为MODULE_STATE)。下面只列出与初始化过程相关的部分:

   1|.  class AFX_MODULE_STATE : public CNoTrackObject

   2|.  {

   3|.  public:

   4|.  #ifdef _AFXDLL

   5|.       AFX_MODULE_STATE(BOOL bDLL, WNDPROC pfnAfxWndProc, DWORD dwVersion,

   6|.            BOOL bSystem =

MFC六大核心机制之一:MFC程序的初始化流程 1,手动编写MFC 下面就是我们要手写MFC的代码, class CMyApp:public CWinApp { public: virtual BOOL InitInstance(); }; class CMainWnd:public CFrameWnd { public: CMainWnd(); }; CMyApp theApp; BOOL CMyApp::InitInstance() {... 阅读详情

相关推荐

MFC 执行顺序总结

源代码: CMyTest1App();//首先执行构造函数 virtual BOOL InitInstance();//第二步执行初始化函数 CMyTest1Dlg dlg;//执行 CMyTest1Dlg 的构造函数 // CMyTest1Dlg 消息处理程序 //zy 当CDiaog子类调用DoModal()函数时,就会触发一系列函数调用,最终调用OnInitDialog() //zy MF...

c+c++的博客 2280

探索MFC读书笔记——MFC初始化

MFC初始化过程: 一、首先看一下基本的类图: 1、从图中可以看出,最原始的基类是CObject;而常见的MFC类CWinThread、CDocument、CWnd都是从CObject的子类CCmdTraget派生而来,CWinApp是从CWinThread派生而来, CFrameWnd、CView从CWnd派生而来。 2、注意CWinApp是一个线程类(作为独立线程运行),有自己的...

xiaoxiaoyusheng2012的专栏 902

MFCMFC初始化过程

当你创建好一个MFC程序时,你可能要去找程序的入口,然后各种编辑,各种搞。若你是第一次接触MFC,则会发现怎么也找不到WinMain函数或main函数,一个程序不可能没有程序入口的,这就是接下来要讲的MFC初始化过程MFC将WinMain函数封装起来了,还做了一系列的初始化过程MFC的组成(MFC初始化过程): 1.必须有一个CwinApp的派生类 2.必须用派生类在全局定义一个

XGamer 6221

MFC中对话框初始化问题

MFC中,大体上,对话框的初始化有两种方式,一种是在构造函数中,一种是在OnInitDialog()函数中。        但是需要注意的是,构造函数是在构造对话框的过程中定义的,此时对话框还未生成,所以只能对对话框类的成员变量赋值,无法使用句柄。而OnInitDialog()是在DoModol()函数或Create()函数调用之前调用的,此时对话框的所有控件已经建立完全,可以使用句柄资源。

northstar087的专栏 2947

深入浅出MFCMFC的程序的初始化过程

对于一个标准的MFC的程序,弃去细枝末节,其主要的初始化流程主要如下: 首先是基本类的内容的声明与实现: 这些通常由VS内部自动生成,包含了一些MFC类的基本结构: //MFC.h #pragma once //最基础的基本类型的定义 #define BOOL int #define TRUE 1 #define FALSE 0 #include using namespace std;

qq_30168505的博客 4025

MFC应用程序的初始化过程

  一个MFC应用程序的生命周期(一)程序的进入点        MFC作为Win32 API的一种封装,它的程序进入点自然是WinMain。但是,这个WinMain也被封装起来,用户是看不到的,只是在编译器进行连接时会被自动连接。        下面我们就来寻找一下MFC程序被隐藏了的WinMain。搜索MFC的源文件,可以发现MFC的WinMain定义在 appmodul.

lesky的专栏 5823

MFC中通用控件初始化过程

摘要:介绍了MFC中通用控件初始化过程.关键字:通用控件 初始化 comctl32.dll这是我在阅读某源代码时无意中想到的一个问题,进行了一番研究,现在把结果贴出来,希望对感兴趣的人能有所帮助。InitCommonControls和InitCommonControlsEx从Win95开始,Windows提供了一些新的Win32控件,称为通用控件. 如:Toolbar,Status b

Buddy 's Workstation 2358

MFC六大关键技术之初始化过程

MFC六大关键技术之初始化过程 我并不认为MFC减轻了程序员们的负担,MFC出现的目的虽然似乎是为了让程序员不用懂得太多就可以进行视窗编程,但本人在MFC里徘徊了很久很久(因为那时没有书本详细介绍MFC的原理),毫无收获。可能朋友们会说,怎么一定要了解MFC的具体呢,“黑箱”作业不行吗?这不是微软的初衷吗?   不行!!!如果这样,我宁愿永远不选择MFC!在学电脑之前,本人学习的东西大

SimKon的专栏 658

MFC程序的初始化过程

  MFC程序是一个Windows程序,它的内部也有窗口注册操作,窗口产生操作,消息循环操作和窗口函数。 MFC中CwinApp类的两个虚函数InitApplication和InitInstance,前者负责“每一个程序只做一次”的操作,后者负责“每一个例程都得做一次”的操作。通常,系统会(并且有能力)为我们注册一些标准的窗口类(当然也准备了一些标准的窗口函数)。程序设计者在自己的CmyW

armman的专栏 1193

技术资料-【剖析MFC六大关键技术之初始化过程

我并不认为MFC减轻了程序员们的负担,MFC出现的目的虽然似乎是为了让程序员不用懂得太多就可以进行视窗编程,但本人在MFC里徘徊了很久很久(因为那时没有书本详细介绍MFC的原理),毫无收获。可能朋友们会说,怎么一定要了解MFC的具体呢,“黑箱”作业不行吗?这不是微软的初衷吗?  不行!!!如果这样,我宁愿永远不选择MFC!在学电脑之前,本人学习的东西大都与艺术不无关系,小学时参加过全国书画比赛获银

Gary·hou专栏 1407

MFC六大关键技术之(一)—— 初始化过程

题外话:我并不认为MFC减轻了程序员们的负担,MFC出现的目的虽然似乎是为了让程序员不用懂得太多就可以进行视窗编程,但本人在MFC里徘徊了很久很久(因为那时没有书本详细介绍MFC的原理),毫无收获。可能朋友们会说,怎么一定要了解MFC的具体呢,“黑箱”作业不行吗?这不是微软的初衷吗?不行!!!如果这样,我宁愿永远不选择MFC!在学电脑之前,本人学习的东西大都与艺术不无关系,小学时参加过全国书画比赛

sunjd2001的专栏 3499

MFC初始化过程

  设计一个简单完整MFC程序,产生一个窗口。当然这不能让AppWizard自动生成。我们可以在Win32 Application工程下面这样写:#include class MyApp : public CWinApp{public: BOOL InitInstance()                         //②程序入点 {  CFrameWnd *Frame=new CFr

armman的专栏 3488

MFC程序初始化过程

//MFC.h #define BOOL int #define TRUE 1 #define FALSE 0 #include <iostream> using namespace std; class CObject { public: CObject(){}; ~CObject(){}; }; class CCmdTarget ...

weixin_33908217的博客 148

MFC 解密(1) 窗口初始化过程

解密 MFC 窗体 创建过程 以及windows消息机制在MFC中的体现

小胖子吃辣肉面的专栏 2918

MFC 控件初始化过程

  之前为了学习MFC下浏览器的用法,参考博文:http://www.cnblogs.com/firefly_liu/archive/2009/05/18/1459514.html,虽然按照作者的方法实现了浏览器的功能,但是作者在ON_SIZE消息中调整浏览器控件大小的方法出现断言错误,主要错误如下:   在进入到下面函数段时,SetWindowPos()出现错误。 void CNetHttp...

weixin_30363817的博客 481
上一篇: 汉诺塔解法(C/C++)
下一篇: 如何在C++中实现Deprecated API
solotony
博客等级 码龄24年 6粉丝 28原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值