VC入门必备--基础知识(五)
创建MFC应用程序所需要的Class
MFC应用程序无需固定的结构,但有些Class一定要和其他Class一起使用。在编程时,可以根据 需要把所有的Class按照不同的方法联合起来。例如有些程序是Document/View结构的,有些是非Document/View结构的,还有些是 Dialog-based结构的。需要注意的一点是:所有的MFC应用程序都用到了Application Class–CWinApp和Frame Window Class–CFrameWnd。应用程序Objects是从CWinApp派生的,而应用程序Window Objects是从CFrameWnd基类派生的。
一、Application Class
Application Class, CWinApp代表应用程序本身,它是基本的Application Class,它封装了Windows-based应用程序的初始化、运行、Message映射和终止。Application Class还会创建至少一个Document Template Object。
MFC应用程序必须有且仅有一个从CWinApp派生的Class的Object,这个Object在 Windows被创建之前就会被创建,也就是说这个Object会和其他C++全局Object同时创建。当Windows调用WinMain(在MFC 应用程序中,你不必亲自调用WinMain,因为当应用程序启动时会由框架提供WinMain)时,这个Object已经可用了,而且这个Object必 须是全局的。
当用AppWizard创建Document/View应用程序时,AppWizard会声明一个从 CWinApp派生的Application Class,AppWizard所产生的.cpp文件中还包括:Message映射,空的构造函数(Constructor),一个应用程序Object (即一个变量),InitInstance函数。AppWizard提供的源代码和Message映射可以满足一些基本的任务,但在通常情况下,你还是需 要手工修改那些源程序的,特别是要修改InitInstance函数。
在CWinApp中,有以下几个关键的可Override的成员函数:
InitInstance,作用是创建Document Template,即按顺序创建Documents, Views和Frame Windows。InitInstace是唯一的一个你必须Override的成员函数;
Run,初始化后,WinMain就会调用Run这个成员函数去处理Message循环。Document/View应用程序会花掉大部分时间在Run这个函数上;
ExitInstance,每当一个应用程序的Copy终止时,就会调用这个函数,即发生在应用程序退出时;
OnIdle,当没有Windows Message处理时,就会由Framework调用这个函数。通常Override这个函数去执行后台任务。
当你从CWinApp派生一个Application Class时,你必须Override成员函数InitInstance去创建应用程序的Main Window Object。Windows允许同时运行同一个应用程序的多个”Copy”,该应用程序的每个Instance(包括第一个的)都会被初始化,而初始化时都会用到被你Override了的InitInstance函数所提供的信息。
通常情况下,每个Windows-based应用程序都有一个Main Window。因此,在初始化完成后,Framework就会检查是否存在一个指向有效Main Window(CWinApp:m_pMainWnd)的指针,如果不存在的话,应用程序就会终止。
当你用AppWizard创建应用程序时,AppWizard会Override缺省的InitInstance来创建Main Window Object,还会使CWinApp的数据成员m_pMainWnd指向那个Window。
二、Frame Window Class
Frame Window Class, CFrameWnd在屏幕上定义了应用程序的物理工作空间,并充当了View的容器(Container),在Single Document Interface(SDI)应用程序中,只有一个Frame Window充当应用程序的顶级窗口和Document的View的框架。
CFrameWnd代表了主窗口(Primary Window)的边框,还会自动来设定View Window的位置和大小,以及决定应用程序的外观(例如Maximize、Minimize、Save、Close等按钮,标题栏,标题栏的图标,主菜 单,滚动栏,状态栏,工具栏等)。
CFrameWnd这个Class提供了SDI应用程序窗口的一些功能性,并提过了一些成员函数来管理这些Window。通过派生类CMDIChildWnd,Frame Window就可以处理Multiple Document Interface(MDI) Windows了。
在CFrameWnd这个Class中有两个关键成员函数:
GetActiveView,返回当前的CView的指针,如果没有当前的View,就返回NULL;
GetActiveDocument, 返回当前的CDocument的指针,如果没有当前的Document,就返回NULL。
由于CFrameWnd派生的Class是间接从CCmdTarget派生的,所以CFrameWnd派生的Class也可以接收和处理Command Messages。
以下是本节新出现的专业名词
构造函数 = Constructor
容器 = Container
主窗口 = Primary Window
非Document/View结构的应用程序的创建
在Document/View结构未被开发出来之前,MFC应用程序就有两个重要的组成部分:一个是代表应用程序本身的Application Object,另一个是代表应用程序的窗口的Window Object。Application Object的任务就是创建Window,然后就由Window来处理Message。在这些早期的版本中,MFC只是仅仅封装了Windows API,而把Object-oriented Interface转嫁到标准Windows Object(例如菜单和对话框等)上。
虽然大部分MFC应用程序都是用Document/View结构,但Document/View结构并 非必需的,Document/View应用程序虽然功能强大,但它们包含了一套开始文件,从而就增加了文件的大小和复杂性(初学者可能根本看不懂 AppWizard等工具自动生成的代码)。因此在某些情况下(例如一个简单的基于对话框应用程序),就可以不使用Document/View。为了更好 的学习Document/View和MFC,我们应先从非Document/View的应用程序开始。下面我们就用手工建立一个非常简单的非 Document/View应用程序(其实创建非Document/View应用程序的最简单的方法就是利用AppWizard创建一个基于对话框的应用 程序,不过代码比较复杂,不利于初学者),希望大家能够完全理解以下代码。
多谢你阅读我的csdn blog,我已经建立了个人博客,基本把这里的文章都转到个人博客了,欢迎交流指教!
VC入门必备--基础知识(五)
http://www.jeanva.cn/post/54.html