1.每一个单文档的应用程序主要包含以下几个类:
CTestApp
CTestView
CTestDoc
CMainFrame
CMainFrame派生于CFrameWnd、CTestView派生于CView。而CFrameWnd和CView都派生于CWnd,即他们有共同的基类。
CWnd是MFC中一个很重要的类,它封装了与窗口相关的操作。
2.MFC中的WinMain函数 :
在MFC的程序当中当前工程代码中找不到WinMain函数,但这并不代表在MFC程序当中不需要WinMain函数,其实在MFC的程序当中的WinMain函数时在VC98目录下的:MFC/SRC/ADDMOUDLE.CPP文件当中。如果设置断点运行,则会发现程序运行到该函数处的时候停止到断点处。这里的WinMain函数和常见的WinMain函数的原型有点不一样,变成了:_tWinMain()。其实这是一个宏。
#define _tWinMain WinMain
3.theApp对象:
全局变量或者对象在进入WinMain函数之前就已经分配了内存空间。
Win32SDK应用程序的实例是由实例句柄(WinMain函数中的hInstance)来体现的。但是对于MFC应用程序来说则是通过产生一个应用程序对象来标识应用程序本身的。每一个应用程序都有且仅有一个从CWinAPP派生出来的类,每个应用程序有且仅有一个由该类派生出来的对象,也就是theApp对象,这个对象标识了应用程序本身。
CWinApp的构造函数完成了程序的一些初始化工作。
CWinApp的构造函数中有以下的一句代码:
pThreadState->m_pCurrentWinThread = this;
根据C++的继承性原理,这里的this指针指向的是子类CTestApp的对象,即theApp。同时我们注意到在CWinApp的构造函数中有一个形式参数lpszAppName,但是在CTestApp中却没有显示地传递这个参数,其原因是父类的构造函数中有一个默认的初始化值。所以在产生子类的对象的时候可以不用显示地传递参数。
4.AfxWinMain函数:
产生了theApp函数之后,就需要进入WinMain函数,但是通过前面的代码我们可以发现其实WinMain函数实际上是通过调用AfxWinMain函数来实现其功能的。Afx前缀的函数时一套应用程序框架函数,使用这些函数可以帮助我们生成应用程序框架。而且这些函数都是全局函数,在工程的任何一个地方都可以调用。
在AfxWinMain函数中,首先调用AfxGetThread(),产生一个CWinThread类型的指针pThread。接着调用AfxGetApp();产生一个CWinApp类型的指针pApp。
5.InitInstance函数:
在AfxWinMain函数中调用AfxGetThread函数和AfxGetApp函数之后。紧接着pThrea和pApp调用了三个函数,分别是:
pApp->InitApplication()
pThread->InitInstance()
pThread->Run()
这三个函数主要完成了Win32应用程序运行所需要的三个过程:设计窗口类、注册窗口类、创建窗口、显示窗口、更新窗口、消息循环、和窗口过程函数。
<1> pApp->InitApplication()该函数完成了MFC内部的管理工作。
<2> pThread->InitInstance()
在CWinThread中定义的InitInstance是一个虚函数。可见在使用的时候其实使用的是子类的InitInstance函数(多态性的原理)。
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);
---待续---
阅读(3083) | 评论(0) | 转发(0) |