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