MFC程序的初始化过程

MFC程序的初始化涉及CwinApp类的InitApplication和InitInstance函数。InitApplication用于一次性操作,而InitInstance则用于每次实例化时的操作。窗口类注册、窗口创建和消息循环等关键步骤在此过程中完成。通过CmyWinApp的InitInstance创建CmyFrameWnd对象,并调用窗口创建函数,最终由CWinApp::Run启动消息循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
 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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值