admin管理员组文章数量:1621909
MFC程序的基本框架
3.1 MFC项目的类框架
建立Single document MFC应用程序,向导会为我们自动生成代码,其中有五个重要的类需要注意:
- CAboutDlg(派生自CDialog)
- CMainFrame(派生自CFrameWnd)
- CTestAPP(派生自CWinApp):应用程序类
- CTestDoc(派生自CDocument)
- CTestView(派生自CView)
这五个类中后三个名字中的Test是项目名称,会随着项目名字变化而变化。
这里涉及到的基类的继承关系可以从下图看出:
最终继承自窗口类(CWnd)的类都和窗口实现有关,CAboutDlg负责帮助对话框,CMainFrame负责主框架窗口,CTestView负责视窗口(在主框架窗口之上)。
3.2 应用程序实例
在一个MFC项目中仅有一个类派生自应用程序类(CWinApp),这个类的名字由C+项目名+App构成。
我们知道在Win32应用程序中通过一个实例句柄(hInstance)来唯一标识应用程序本身,MFC中则有所不同,它通过一个**应用程序类的全局对象(theApp)**来标识应用程序本身。
MFC程序运行的第一件事就是创建CTestApp类的实例(theApp):
//Test.CPP
//创建应用程序实例对象
CTestApp theApp;
//CTestApp构造函数
CTestApp::CTestApp()
{
}
创建theApp的同时会调用CTestApp的构造函数,根据C++继承相关的概念,在调用CTestApp的构造函数之前还会先调用基类CWinApp的构造函数,基类构造函数部分代码如下:
//APPCORE.CPP
CWinApp::CWinApp(LPCTSTR lpszAppName)
{
if (lpszAppName != NULL)
m_pszAppName = _tcsdup(lpszAppName);
else
m_pszAppName = NULL;
// initialize CWinThread state
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;//this指向theApp对象
ASSERT(AfxGetThread() == this);
m_hThread = ::GetCurrentThread();
m_nThreadID = ::GetCurrentThreadId();
ASSERT(afxCurrentWinApp == NULL);
pModuleState->m_pCurrentWinApp = this;//this指向theApp对象
ASSERT(AfxGetApp() == this);
......
基类CWinApp构造函数具有一个lpszAppName参数,因此在派生类中应该显式调用。然而由于该构造函数中声明了默认参数,所以实际上并没有显示调用。应用程序类的构造函数完成了应用程序的各种初始化工作。
3.3 WinMain函数
当theApp全局对象成功创建以后就要进入WinMain的环节了,该部分代码如下:
//APPMODUL.CPP
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)//入口函数
{
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
这部分代码和Win32中的WinMain并没有什么太大的区别,_tWinMain前面第一篇文章已经介绍过是一个兼容UNICODE和ASCII两种情况的宏。在WinMain函数中调用了AfxWinMain函数,MFC中以Afx开头的函数是应用程序框架函数,他们都是全局函数,可以在任意一个类中调用,此处AfxWinMain函数负责创建,注册窗口类,创建,显示,更新窗口等等工作。
AfxWinMain中分别调用AfxGetThread函数和AfxGetApp函数取得了两个指针pThread和pApp,然后又通过这两个指向theApp的指针调用了三个成员函数完成了一个Windows应用程序的全部必要步骤,部分代码如下:
//WINMAIN.CPP
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();//指向theApp的指针
CWinApp* pApp = AfxGetApp();//指向theApp的指针
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;
if (pApp != NULL && !pApp->InitApplication())//重要函数1,完成MFC内部管理方面的工作
goto InitFailure;
if (!pThread->InitInstance())//重要函数2,该函数是一个虚函数,因此这里调用的是子类的
版权声明:本文标题:Window应用程序(CC++)(3) MFC程序的基本框架 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728850501a1176614.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论