MFC的类层次结构:![]() ![]() ![]() ![]() 如上图所示: CObject:是MFC提供的绝大多数类的基类。该类完成动态空间的分配与回收,支持一般的诊断、出错信息处理和文档序列化等。 CCmdTarget:主要负责将系统事件(消息)和窗口事件(消息),发送给响应这些事件的对象,完成消息发送、等待和派遣调度等工作,实现应用程序的对象之间协调运行。 CWinApp:是应用程序的主线程类,它是从CWinThread类派生而来的。CWinThread类用来完成对线程的控制,包括线程的创建、运行、终止和挂起等。 CDocument:是文档类,包含了应用程序运行期间所用到的数据。 CWnd:是一个通用的窗口类,用来提供Windows中的所有通用特性、对话框和控件。 一个MFC程序,必须包含一个派生自CWinApp的线程类,即C*App类,每一个MFC框架程序中都有且只有一个C*App的全局变量(对象)即theApp。 MFC正是利用类的这种"自动调用相应的构造函数"特性,使得WinMain()函数的调用变成了应用程序框架内部的调用,所以我们在代码中看不到每个Windows程序所必须有的WinMain()函数。C++规定,全局对象的构建将比程序进入点(在dos环境下为main,在Windows环境为WinMain)更早。所以theApp的构造函数将更早与main。 C++中子类的构造函数执行在父类之后。系统执行theApp的够造函数时,先调用基类(CObject-->....CWinApp)的构造函数,进行一系列的内部初始化操作,然后自动调用C*App的虚函数InitInstance(),该函数会进一步调用相应的函数来完成主窗口的构造和显示工作。下面来看看上述程序中InitInstance的执行过程。
首先执行的是: m_pMainWnd = new CMainFrame; 该语句用来创建从CFrameWnd类派生而来的用户框架窗口CMainFrame类对象,继而调用该类的构造函数,使得Create函数被调用,完成了窗口创建工作。 然后执行后面两句: m_pMainWnd->ShowWindow(m_nCmdShow); 用作窗口的显示和更新。接下来调用: m_pMainWnd->MessageBox("你好,欢迎进入MFC世界!"); 最后返回TRUE,表示窗口创建成功。 InitInstance()完成初始化工作之后,接下来就是调用基类CWinApp的成员函数Run(),执行应用程序的消息循环,即重复执行接收消息并转发消息的工作。当Run()检查到消息队列为空时,将调用基类CWinApp的成员函数OnIdle进行空闲时的后台处理工作。若消息队列为空且又没有后台工作要处理时,则应用程序一直处于等待状态,一直等到有消息为止。 当程序结束后,调用基类CWinApp的成员函数ExitInstance(),完成终止应用程序的收尾工作。这就是MFC应用程序的运行机制。 |
|