MFC程序的初始化过程

MFC应用程序初始化过程   一个MFC应用程序的生命周期(一)程序的进入点        MFC作为Win32 API的一种封装,它的程序进入点自然是WinMain。但是,这个WinMain也被封装起来,用户是看不到的,只是在编译器进行连接时会被自动连接。        下面我们就来寻找一下MFC程序被隐藏了的WinMain。搜索MFC的源文件,可以发现MFC的WinMain定义在 appmodul. 阅读详情
 
 MFC程序是一个Windows程序,它的内部也有窗口注册操作,窗口产生操作,消息循环操作和窗口函数。
 MFCCwinApp类的两个虚函数InitApplicationInitInstance,前者负责“每一个程序只做一次”的操作,后者负责“每一个例程都得做一次”的操作。通常,系统会(并且有能力)为我们注册一些标准的窗口类(当然也准备了一些标准的窗口函数)。程序设计者在自己的CmyWinApp中改写InitInstance,并在其中把窗口产生出来这样才有机会在标准的窗口类中指定自己的窗口标题和菜单。下面即使我们新的main函数:
//MY.CPP
CmyWinApp the App;
Void main()
{
    CwinApp *pApp = AfxGetApp(); // pApp指向theApp全局对象
    pApp->InitApplication(); //调用CwinApp::InitApplication
    pApp->InitInstance(); //调用CmyWinApp::InitInstance(因为CmyWinApp改写了它)
    pApp->Run(); //调用CwinApp::Run
}
请注意CMyWinAPP::InitInstance()的操作,以及它所引发的行为:
BOOL CMyWinAPP::InitInstance()
{
    cout<<CmyWinApp::InitInstance/n;
    m_pMainWnd = new CmyFrameWnd;//引发CmyFrameWnd:: CmyFrameWnd构造函数
    return TRUE;
}
CmyFrameWnd:: CmyFrameWnd()
{
    Create();//Create()是虚函数,但CmyFrameWnd未改写它,
//所以引发父类的CmyFrameWnd::Create
}
BOOL CmyFrameWnd::Create()
{
    cout<<CframeWnd::Create/n;
    CreateEx();//CreateEx不是虚函数,它继承自CWnd,
//CframeWnd之中又没有重新定义,故调用CWnd::CreateEx
return TRUE;
}
BOOL CWnd::CrateEx()
{
    cout<<CWnd::CreateEx/n;
    PreCteateWindow();//这是个虚函数,CWnd中有定义,CframeWnd也改写了它
Return TRUE;
}
BOOL CframeWnd::PreCreateWindow()
{
    cout<<CframeWnd::PreCreateWindow/n;
    return TRUE;
}
 
范例程序
MFC.H
#define BOOL int
#define TRUE 1
#define FALSE 0
#include <iostream.h>
class CObject
{
 public:
    CObject::CObject() { }
    CObject::~CObject() { }
};
class CcmdTarget : public CObject
{
 public:
    CCmdTarget:: CCmdTarget () { }
    CCmdTarget::~CCmdTarget () { }
};
class CwinThread : public CCmdTarget
{
 public:
    CwinThread:: CwinThread () { }
    CwinThread::~ CwinThread () { }
    Virtual BOOL InitInstance(){
Cout<<CwinThread::InitInstance/n;
Return TRUE;
}
virtual int Run(){
cout<<CwinThread::Run/n;
return 1;
}
};
class CWnd;
class CWinApp : public CwinThread
{
 public:
    CWinApp * m_pCurrentWinApp;
    CWnd * m_pMainWnd;
 Public:
    CWinApp::CWinApp() { pCurrentWinApp = this ;}
    CWinApp::~CWinApp() { }
    virtual BOOl InitApplication () {
        Cout<<CWinApp::InitApplication/n;
        Return TRUE;
    }
virtual BOOL InitInstance () {
    cout<<CWinApp::InitInstance()/n;
    return TRUE;
}
virtual int Run () {
    cout<<CWinApp::Run()/n;
    return CWinThread::Run();
}
};
Class CDocument : public CCmdTarget
{
 public:
    Cdocument:: Cdocument() { }
    Cdocument::~ Cdocument() { }
};
Class CWnd : public CCmdTarget
{
 public:
    CWnd:: CWnd () { }
    CWnd::~CWnd () { }
};
Class CFrameWnd : public CWnd
{
 public:
    CFrameWnd:: CFrameWnd () { }
    CFrameWnd::~CFrameWnd () { }
    BOOL Create ();
    Virtual BOOL PreCreateWindow();
};
Class CView : public CWnd
{
 public:
    CView:: CView () { }
    CView::~ CView () { }
};
//global function
CWinApp *AfxGetApp();
 
 
MFC.CPP
#include my.h //本该包含mfc.h,但为了CmyWinapp的定义
extern CmyWinApp theApp ; //external global object
BOOL CWnd::Create()
{
    cout<<CWnd::Create/n;
    return TRUE;
}
BOOL CWnd::CreateEx()
{
cout<<CWnd::CreateEx/n;
    PreCreateWindow();
return TRUE;
}
BOOL CWnd::PreCreateWindow()
{
    cout<<CWnd::PreCreateWindow /n;
    return TRUE;
}
BOOL CframeWnd::Create()
{
    cout<<CframeWnd::Create/n;
    CreateEx();
return TRUE;
}
BOOL CframeWnd::PreCreateWindow()
{
    cout<<CframeWnd::PreCrateWindow/n;
    return TRUE;
}
CWinApp * AfxApp()
{
 return theApp.m_pCurrentWinApp;
}
 
MY.H
#include <iostream.h>
#include mfc.h
class CmyWinApp : public CWinApp
{
 public:
    CmyWinApp:: CmyWinApp() { }
    CmyWinApp::~ CmyWinApp() { }
    virtual BOOL InitInstance();
};
class CmyFrameWnd : public CframeWnd
{
 public:
    CmyFrameWnd();
    ~CmyFrameWnd() {}
};
 
 
MFC.CPP
#include my.h
CmyWinApp theApp; //global object
BOOL CMyWinAPP::InitInstance()
{
    cout<<CmyWinApp::InitInstance/n;
    m_pMainWnd = new CmyFrameWnd;
    return TRUE;
}
CmyFrameWnd::CmyFrameWnd()
{
    cout<<CmyFrameWnd::CmyFrame/n;
    Create();
}
//main()
void main()
{
    CwinApp *pApp = AfxGetApp();
    pApp->InitApplication();
    pApp->InitInstance();
    pApp->Run();
}
程序的输出结果是:
CWinApp::InitApplication
CmyWinApp::InitInstance
CmyFrameWnd:: CmyFrameWnd
CframeWnd::Create
CWnd::CreateEx
CframeWnd::PreCreateWindow
CwinApp::Run
CwinThread::Run
 
VC MFC下 的初始化 与结束 顺序过程,是mFC的基础 VC MFc下 的初始化 与结束 顺序过程,是mFC的基础 立即下载

相关推荐

C++ MFC 初始化

 在头文件中加入: virtual BOOL OnInitDialog(); 在实现文件之中: BOOL MyLog::OnInitDialog() { CDialogEx::OnInitDialog(); CWnd *pnd = GetDlgItem(IDC_VSFLEXGRIDN1); }

yimengchenxi的专栏 822

MFC程序初始化

MFC中,InitApplication负责程序初始化,InitInstance负责实例的初始化,它们两个都是虚函数。下面是一个控制台应用程序Frame2,具体代码如下。 //mfc.h #define BOOL int #define TRUE 1 #define FALSE 0 #include class CObject { public: CObject::CObject(

sanqima的专栏 1306

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

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

qq_30168505的博客 4024

MFC 六大机制 (1) MFC程序初始化

MFC六大机制之一(也成为MFC六大关键技术) MFC程序初始化 本章将先介绍 MFC 的文档/视图结构,讲解实现该结构的数据结构,然后编写一个控制台应用程序来模拟 MFC初始化,理清 MFC 初始化的顺序,然后说明如何创建一个最基本的 MFC 应用程序

?.?的专栏 6278

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程序初始化过程仿真(参考了侯俊杰的《深入浅出MFC》)

下面的Windows Console程序MFC程序初始化过程的仿真,如下: #include using namespace std; // MFCclass CObject{}; class CCmdTarget : public CObject{}; class CWinThread : public CCmdTarget { public: virtual void In

认知 行动 坚持 8888

深入浅出MFC学习笔记:MFC六大关键技术仿真之MFC程序初始化过程

MFC程序初始化过程 参考文献:深入浅出MFC-侯捷 下面交代主要的类: 下面列出主要的类和一些重要的函数: 程序的流程如下: 总结起来如下:

newner的专栏 1054

深入浅出MFC 6大关键技术之仿真 mfc程序初始化过程

1.c++规定,全局对象的建构将比程序进入点(即main或者winmain)更早,所以theapp的构造函数将更早于mian或winmain. 2.

baidu_16370559的博客 309

MFC学习笔记三——MFC程序初始化过程

//------------------------------------------------------// MFC.H //------------------------------------------------------#define BOOL int #define TRUE 1 #define FALSE 0 #include using

667

MFC基于对话框的应用程序类型的入口函数以及初始化过程

入口函数大家都知道,就是程序一开始运行时的第一个函数。当我们写一个C语言程序时,大家都知道入口函数是main()函数。但是基于对话框的应用程序类型的MFC程序的入口函数是什么呢? 1.基于对话框的应用程序其实是一个WINDOWS程序,并且每个WINDOWS程序都要有一个WinMain 函数。基于对话框的应用程序的WinMain 函数其实是叫AfxWinMain,AfxWinMain函数是在appm...

GL3_24的博客 1560

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

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

SimKon的专栏 658

Windows编程 第三讲 MFC框架程序剖析

文章目录什么是MFC框架程序MFC框架程序如何新建一个MFC程序MFC单文档界面程序初探MFC框架程序剖析(运行脉络)程序剖析 什么是MFC框架程序MFC框架程序 MFC框架程序是利用MFC AppWizard 生成的Windows应用程序MFC AppWizard是一个辅助我们生成源代码的向导工具,它可以帮助我们自动生成基于MFC框架的源代码。该向导的每一个步骤中,我们都可以根据需要...

Kni9hT's Blog 597

MFC六大核心机制之一:MFC程序初始化

 http://www.jizhuomi.com/software/267.html 很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下可以简单的写程序。本文开始就跟大家分享一位同行前辈写的MFC核心机制分析(稍作整理),语言朴实易懂

CSDNMicrosoftCSDN的专栏 629

追根究底,剖析MFC六大关键技术(一)

追根究底,剖析MFC六大关键技术(一)追根究底,剖析MFC六大关键技术(第一部分) 题外话:我并不认为MFC减轻了程序员们的负担,MFC出现的目的虽然似乎是为了让程序员不用懂得太多就可以进行视窗编程,但本人在MFC里徘徊了很久很久(因为那时没有书本详细介绍MFC的原理),毫无收获。可能朋友们会说,怎么一定要了解MFC的具体呢,“黑箱”作业不行吗?这不是微软的初衷吗?不行!!!如果这

beitcoder的专栏 953

MFC启动过程&单文档MFC程序的启动详细过程

MFC启动过程 1. 首先说一下MFC程序的启动过程. 每个MFC程序都有一个全局的应用程序类的对象, 在面向对象程度非常好的MFC程序中, 应该只有这一个全局的对象. MFC应用程序启动时, 首先创建这个应用程序对象, 比如对象名为theApp, 这时将调用这个对象的构造函数来初始化theApp.然后由应用程序框架调用MFC提供的AfxWinMain主函数. 在这个主函数中, 首先获

limingmcu的专栏 950

MFC六大核心机制【MFC程序初始化

我们选择了C++,主要是因为它够艺术、够自由,使用它我们可以实现各种想法,而MFC将多种可灵活使用的功能封装起来,我们岂能忍受这种“黑盒”操作?于是研究分析MFC的核心机制成为必然。 首先,列出要讲的MFC六大核心机制: 1、MFC程序初始化。 2、运行时类型识别(RTTI)。 3、动态创建。 4、永久保存。 5、...

平凡 830
上一篇: MFC深入浅出-Win32程序开发流程
下一篇: MFC深入浅出之RTTI
armman
博客等级 码龄21年 81粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值