每个MFC程序都有一个the全局对象,此对象代表了这个应用程序,程序从这里诞生。
1、因theApp是全局对象,所以比winmain更早初始化。
2、theApp的初始化,先引发了其构造函数。因theApp派生于CWinApp,则也引发了CWinApp的构造函数
3、CWinApp中的几条重要的初始化代码:
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
pThreadState->m_pCurrentWinThread
pModuleState->m_pCurrentWinApp
可以看到m_pCurrentWinThread与m_pCurrentWinApp现在都指向theApp。
4、CWinApp初始化后,进入winmain。winmain中进行了如下调用:
return
5、AfxWinMain中的重要代码:
CWinThread* pThread = AfxGetThread();//AfxGetThread其实就是取得了theApp的指针
CWinApp* pApp = AfxGetApp();//AfxGetApp其实就是取的了theApp的指针
AfxGetThread的定义:
CWinThread* AFXAPI AfxGetThread()
{
}
AfxGetApp的定义:
_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()
#define afxCurrentWinApp
AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow);//内部的初始化操作
节选其中的一些重要代码:
// fill in the initial state for the application
CWinApp* pApp = AfxGetApp();
if (pApp != NULL)
pApp->InitApplication();
这里相当于调用了theApp的InitApplication,但因大多数情况下无需改写此虚函数,所以实际调用的是CWinApp::InitApplication.其中的操作是为MFC内部管理而做,与Document Template有关。
pThread->InitInstance();
这里相当于调用了theApp的InitInstance,因theApp中改写了这个虚函数,所以直接调用即可。节选其中的重要代码:
//new一个CMultiDocTemplate对象并初始化,用来管理Doccument/view/Frame三者之间的关系
CMultiDocTemplate* pDocTemplate;
//主框架窗口的初始化
CMainFrame* pMainFrame = new CMainFrame;
//LoadFrame会触发WM_CREATE消息(中间一系列调用不详述了)
CMainFrame::OnCreate中,主要实现工具栏、状态栏的初始化。
//显示主框架窗口,并发出更新窗口
pThread->Run();
这里相当于调用了theApp的Run,但是theApp通常不会改写这个虚函数,所以实际调用的是CWinApp的Run。节选一些代码:
int CWinApp::Run()
int CWinThread::Run()
{
}
BOOL CWinThread::PumpMessage()
{