MFC的库函数的源代码存放路径为:(用户安装路径)\Microsoft Visual Studio\VC98\MFC\SRC
以单文档程序为例,建立TEST工程。
各类视图:
其中,
CMainFrame公共继承于 CFrameWnd,而CFrameWnd公共继承于CWnd(CWnd派生出来的类都是窗口类),这个窗口称为框架窗口。
CTESTApp公共继承于CWinApp,CWinApp公共继承于CWinThread,CWinThread公共继承于CCmdTarget,CCmdTarget 公共继承于 CObject。
CTESTDoc公共继承于CDocument,CDocument公共继承于 CCmdTarget ,用于数据的存储与加载。
CTESTView公共继承于CView,CView公共继承于CWnd,也是窗口类,用于数据的显示。
程序运行步骤如下(可在调试模式下逐步查看):
1、创建全局对象CTESTApp theApp;(全局对象或全局变量是在WinMain函数调用之前就创建的)
2、调用CTESTApp构造函数CTESTApp::CTESTApp(),从而调用CWinApp类的构造函数。
3、运行extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nCmdShow)函数。即main函数,此函数在。
4、调用AfxWinMain函数【在SRC文件夹的WINMAIN.CPP中】,在函数中,pApp指针调用了三个函数,这三个函数(AfxWinInit()、InitApplication()、InitInstance())就完成了作为一个应用程序所需要的几个步骤:设计窗口类,注册窗口类,创建窗口,显示窗口,更新窗口,消息循环,消息处理函数。
(Afx*前缀代表这是应用程序框架函数,是一些全局函数,应用程序框架是一套辅助生成应用程序的框架模型,把一些类做一些有机的集成,我们可根据这些类函数来设计自己的应用程序)
5、调用pThread->InitInstance()函数,完成初始化的工作。在这里,查看InitInstance()可知,其为虚函数,所以调用的是继承类的CTESTApp::InitInstance()函数。
6、调用AfxEndDeferRegisterClass(LONG fToRegister)【该函数在SRC文件夹中的WINCORE.CPP】。在函数中调用AfxRegisterClass(),从而调用RegisterClass(),从而完成各类的注册。
7、调用CMainFrame::PreCreateWindow(CREATESTRUCT& cs),从而调用CFrameWnd::PreCreateWindow(CREATESTRUCT& cs)【在SRC文件夹中的WINFRM.CPP中】,调用AfxEndDeferRegisterClass(LONG fToRegister)函数,并调用BOOL CWnd::Create(LPCTSTR lpszClassName,LPCTSTR lpszWindowName, DWORD dwStyle,const RECT& rect,CWnd* pParentWnd, UINT nID,CCreateContext* pContext)【在SRC文件夹中的WINCODE.CPP中】,实现窗口预定义。
8、最后在CTESTApp::InitInstance()中调用m_pMainWnd->ShowWindow(SW_SHOW);与m_pMainWnd->UpdateWindow();,实现窗口显示。
9、pThread->Run()完成了消息循环,在CWinThread::Run()函数中循环执行CWinThread::PumpMessage(),进行消息的转换和投递。