1、首先定义一个全局应用程序变量(CxxxApp theApp),所以运行程序时先构造该变量,构造该变量又导致调
用了它的父类的构造函数CWinApp::CWinApp(LPCTSTRlpszAppName),该函数定义在APPCORE.CPP。
2、运行到主程序入口点WinMain()函数,该函数是操作系统调用的。该函数定义在APPMODUL.CPP。该函数有一
个宏定义_tWinMain();MFC实际是通过宏来实现WinMain()函数的调用。
3、在WinMain()中又是通过调用AfxWinMain()函数来完成其功能的,而AfxWinMain()是一个全局函数。该函数定
义在WINMAIN.CPP。
4、在AfxWinMain()函数体中我们可以看到,它获得了当前线程CWinThread *pThread=AfxGetThread()和当前应
用实例CWinApp*pApp=AfxGetApp()对象。我们知道CWinApp派生于CWinThread,从AfxGetThread()函数体中我
们可以发现该函数返回的也是AfxGetApp()函数返回的结果,AfxGetThread()定义在THRDCORE.CPP。所以这里
面实际上pThread和pApp都是指向该应用程序的唯一实例即全局变量theApp.
在AfxWinMain()中调用了pApp->InitApplication()、pThread->InitInstance()、pThread->Run()三个函数.
这三个函数实际上就是完成了:设计窗口、注册窗口、创建窗口、显示窗口、更新窗口、消息循环及窗口过
程函数的功能。
pApp->InitApplication()该函数完成了MFC内部管理方面的工作。
pThread->InitInstance()因为pThread是指向pApp的对象,而InitInstance()又是虚函数,根据多态原则,
它实际调用了其子类CxxxApptheApp中的InitInstance()。而InitInstance()函数我们可以在创建的工程应
用程序类中看到。
5、在CxxxApptheApp中的InitInstance()中我们可以看到他调用了文档模板,并将参数传递给模板构造了该模
板对象。
CSingleDocTemplate*pDocTemplate;
pDocTemplate = newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CxxxDoc),
RUNTIME_CLASS(CMainFrame),// main SDI frame window 框架窗口(主窗口)
RUNTIME_CLASS(CxxxView));//视类窗口
AddDocTemplate(pDocTemplate);
在这构造里面完成了窗口的设计,注册,创建工作。
6、从5中我们可以看到,模板实际上注册了两个窗口:框架窗口CMainFrame和视类窗口CxxxView。其中框架窗口
类中有一个函数PreCreateWindow,它是在窗口产生之前被调用的,在工程项目中我们可以清楚的看到它调用
了CFrameWnd::PreCreateWindow(cs)父类的函数。父类的PreCreateWindow函数定义在WINFRM.CPP中。
从父类的该函数体中我们看到它调用了AfxDeferRegisterClass,这个函数实际上是一个宏定义,该宏定义在
AFXIMPL.H文件中.它实际上就是AfxEndDeferRegisterClass()函数。该函数又定义在WINCORE.CPP中。在该函
数中MFC提供了默认的几个标准窗口类(即设计窗口类),根据不同的窗口类型注册窗口,在这里面我们可以
看到它的窗口过程函数是DefWindowProc。但在这个函数中没有直接注册,而是通过调用函数
AfxRegisterClass来完成最后注册的。该函数的定义在WINCORE.CPP中。这样我们就完成了主窗口的注册。
7、窗口注册之后就要创建窗口,CFrameWnd类通过LoadFrame函数调用了Create函数进行窗口的创建,Create函数
定义在AFXWIN.H中,在Create函数中又调用了CreateEx函数,但是CFrameWnd中并没有该函数,它又如何调用
呢?由于继承的关系,可得它调用的是CWnd类的CreateEx函数,该函数声明在AFXWIN.H,定义在WINCORE.CPP
中。从CreateEx函数中我们又看到了,在函数体中又在次调用了PreCreateWindow窗口注册函数。为何?主要
是为了给程序员一个机会,让它在此可以改变窗口外观。而且在CreateEx函数中它还有一个钩子函数:
AfxHookWindowCreate。函数最后调用全局函数::CreateWindowEx进行窗口的最终创建。
8、窗口创建完成之后,就是显示,更新操作了.在pThread->InitInstance()函数体中我们看到了两句
m_pMainWnd->ShowWindow(SW_SHOW); //窗口显示
m_pMainWnd->UpdateWindow(); //窗口更新
m_pMainWnd是CxxxApp中的一个成员变量.继承得来的...
9、以上在pThread->InitInstance()就完成了窗口的各种动作.在这之后我们就要开始消息的循环,那么它又是
在哪完成的呢,其实它是在pThread->Run()中完成的.该函数定义在THRDCORE.CPP中。该函数实际就是一个
for循环,当接收到WM_QUIT消息后退出。
10、经过上面的步骤,一个窗口就创建完成了。