MFC基本框架
By  小戴 发表于 2006-12-21 15:59:00 
MFC 应用程序框架

1、 MFC 简介:

MFC ( Microsoft Foundation Class )是由微软公司编写的一套专门用于 Windows 编程的 C++ 基础类库, VC++ 编程基本上都是围绕着 MFC 类库来进行的。它封装了 Windows API 的绝大多数功能,为用户开发 Windows 应用程序建立了一个非常灵活的应用程序框架。

CObject 是 MFC 类库的根类。

MFC 类库包括:

(1)CCmdTarget 类:是 CObject 类的子类,它是 MFC 库中所有具有消息映射属性的类的公共基类。它的子类有 CWinThread 类, CWnd 类、 CDocument 类,从 CCndTarget 类派生的类能在程序运行时动态创建对象,并处理命令消息。

(2)  CWinThread 类:是 CCmdTarget 的子类。 CWinThread 是所有线程类的基类,封装了应用程序操作的多线程功能。应用程序类 CWinApp 是 CWinThread 的子类,封装了初始化、运行、终止应用程序的代码。

(3)  CWnd 类:窗口类,是 CcmdTarget 类的子类,从 CWnd 派生的类可以拥有自己的窗口,并对它进行控制。窗口框架类 CFrameWnd 和 CView 类是 CWnd 的子类,前者创建和维护窗口的边框、菜单栏、工具栏、状态栏,负责显示和搜索用户命令,后者负责为文档提供一个或几个视图。视图的作用是为修改、查询文档等任务提供人机交互的界面。

(4)  文档类 CDocument 类:是 CCmdTarget 类的子类,负责封装和维护文档。文档包括应用程序的工作成果或环境设置数据等,可以是程序需要保存的任何内容。

一个 MFC 应用程序并不直接操作上述类,而是以上述类为基类派生新的类,构建 Windows 应用程序的基本框架。

2、构建 Windows 应用程序的基本类

当你创建了一个名为 Exam1_1 的 MFC 应用程序时,就创建了必要的类。

(1) 应用程序类: CExam1_1App 类

该类是代表应用程序,它的基类是 CWinApp 代表了 Windows 应用程序,并把每一个程序都看做一个对象。应用程序类将负责完成 MFC 一些应用程序的一些例行初始化工作。另外 CWinApp 的的基类是 CwinThread ,因此它也要管理工序主线程的运行。

AppWizard 声明了一个由 CwinApp 继承的类 Cexam1_1App ,在类的实现文件中包含:

?  应用程序的消息映射。

?  一个空的应用程序类的构造函数。

?  一个 Cexam1_1APP 类的全局对象 theApp 。

?  一个 InitInstance 函数的标准定义。

全局对象 theApp 在 WinMain() 函数执行之前已经初始化, 进入 MFC 版本的 WinMain() 函数后, theApp 很快获得了管理权,进行 Windows 程序的一些例行初始化工作。

CwinApp 类中可重载的成员函数有:

InitInstance() 函数:负责应用程序的初始化工作,创建文档模板、文档、视图和主窗口,该函数是唯一一个必须重载的函数。

Run() 初始化结束后,由 WinMain() 函数调用处理消息循环,一个文档 / 视图应用程序绝大多数时间处于 Run() 函数的执行过程中。

ExitInstance() 函数:当用户退出程序时,该函数被调用。

OnIdle() 函数:当没有窗口消息需要处理时由窗口框架调用,通常用于执行后台任务。

(2) 主框架类: CMainFrame

CmainFrame 代表的是程序懂得主框架窗口,一个 Windows 应用程序除了白色部分的视图外,程序的主窗口的其他部分都归 CMAinFrame 管理。

单文档程序的主框架窗口是在调用 ProcessShellCommand() 函数时创建的,在主框架窗口创建之前, CmainFrame::PreCreateWindow() 函数将被自动调用。在这个函数中可以更改主框架窗口的风格,或者对窗口类的一些属性进行修改,此时窗口句柄还不可用。

当 Windows 通过 Win32 函数 CreateWindowEx() 接收到创建主框架窗口的请求时,它会在系统内部为窗口分配资源,并进行一些设置工作,此时窗口句柄就可以使用了,当 Windows 从 CreateWindowEx() 函数返回之前,它向程序发送 WM_CREATE 消息,让程序完成一些必要的初始化工作, CMainFrame::OnCreate() 函数就是 WM_CREATE 消息的处理函数,这个函数首先调用了基类 Cframewrd 的处理函数,让基类完成初始化工作,然后为主框架窗口创建工具栏和状态栏。

CmainFrame 的两个成员变量 m_wndToolBar 和 m_wndStatusBar 分别对应着程序主窗口中的工具栏和状态栏。 CToolBar::LoadToolBar() 函数负责装载工具栏资源,而 CToolBar::CreateEx() 函数负责工具栏的创建。状态栏的使用需要一个数组来定义状态栏类各个窗格的 ID ,这个数组就是 indicators 。 CstatusBar::Create() 函数负责状态栏的创建, CstatusBar::SetIndicators() 函数负责设置状态栏上的窗格。

?  文档 / 视图结构

文档 / 视图结构是 MFC 应用程序最核心的概念,它将应用程序的数据和浏览、操作数据的方法分离。换句话,文档对象通常代表一个已经打开的文件,而视图对象表示文档中的数据的可视化表示,并提供可视化交互界面允许用户查看、编辑数据。

?  文档 / 视图结构:

应用程序的数据存储在文档对象中,并可以显示在视图。文档与视图的关系是 1 对多的关系。一个 MFC 应用程序开始运行后,应用程序负责传递消息到窗口框架对象和视图对象。文档对象负责管理数据,视图对象按特定的方式反映当前文档对象中数据,视图和框架同时提供可视化的界面与用户实现交互,用户使用鼠标和键盘操作应用程序的菜单、工具栏及控件,发出命令消息,输入消息,应用程序接收消息,接收输入消息,并以预先定义的方式响应用户的操作。

(3)  文档类

应用程序中的文档类是 CDocument 类的派生类, Cdocument 类主要的成员函数及功能如下:

OnNewDocument() 函数:初始化一个新的文档对象,当创建一个新文档时,系统自动调用该函数,默认重载。

OnOpenDocument() 函数:当从磁盘打开一个文件时被系统自动调用,可重载。

DeleteContents() 函数:删除文档对象的内容。当文档被关闭时系统自动调用,可重载。

Serialize() 函数:文档序列化函数,用于从一个文件中读取内容到文档对象,或者将文档对象的内容保存到文件。默认重载。

UpdateAllView() 函数:更新与文档对象关联的所有视图,该函数自动调用每个相关的视图对象的 OnUpdate() 函数实现更新操作。

SetModifiedFlag() 函数:设置或清除文档的数据是否已被修改的标志,该标志决定执行应用程序关闭操作时,是否会弹出对话框确认让用户是否需要保存文件。

IsModified() 函数:如果文档对象包含未保存数据,则返回一个非零值,否则返回一个零值。

GetTitle() 函数:返回表示文档标题的文本串,如果文档没有标题返回空串。

GetFirstViewPosition() 函数:返回一个 Cview 类型的指针,指向与当前文档对象相关的一组视图的位置。

GetNextView() 函数:返回一个 Cview 类型的指针,指向与当前文档对象相关的一组视图中的下一个视图。

GetPathName() 函数:返回与文档相关的文件的名称和路径。

Serialize() 函数:将文件中的数据装入到文档对象或将文档对象的数据保存到文件中。

(4)视图类:

视图类用于显示存储在文档类对象中的数据,并允许用户编辑这些数据。应用程序中,视图类是 CView 类的派生类, Cview 类的主要成员如下:

GetDocument() 函数:返回一个指向相关文档对象的指针,通过该指针,可以在视图类的成员函数中操作文档对象的数据,实现输出。

OnDraw() 函数:支持打印,打印预览和屏幕输出。

OnInitialUpdate() 函数:当一个视图第一次与文档对象相关联时,由系统自动调用。

OnUpdate() 函数:当文档对象的数据更新后,需要更新视图时调用。默认对整个视图进行更新,可编写代码重载该函数,仅更新部分视图。

应用程序的视图类可以直接从 Cview 类中继承,也可以从视图类的派生类中继承。主要有:

?  CsrollView 类:具有滚动功能的视图类的基类。

?  CformView 类:其布局在对话资源中定义的滚动视图类。

?  CeditView 类:显示一个编辑控件,提供多行文本的编辑,具有文本编辑、查找、替换和滚动功能。

?  CrichEditView 类:显示一个直通文本编辑控件的视图类。

?  ClistView 类:显示一个列表控件的类。

?  CtreeView 类:显示一个树控件的类。

?  CrecordView 类:支持对话框数据交换的类。

?  CctrlView 类:支持直接基于控件的视图。

(5)  文档模板类:

AppWizard 除了生成可以在工作区中展示的应用程序类,窗口框架类、文档类和视图类以外,还生成了文档模板类 CDocTemplate ,文档模板类定义了文档模板的基本功能,是抽象基类,通常不需要程序员干涉它的运行,所以在工作区中没有列出文档模板类。

?  剖析 MFC SDI 的文件结构:

根据创建项目时提供的可选项, AppWizard 所创建的文件会略有不同,标准的 AppWizard 文件包括:

?  工作区文件、项目文件:

( 1 ) .dsw 文件:由 MFC 自动生成的工作区文件,保存了当前工作区所包含的项目的信息。

( 2 ) .dsp 文件: MFC 生成的项目文件,或叫工程文件,包含当前项目的设置、项目中包含的文件等信息。

( 3 ) .clw 文件:类信息文件。

3 、应用程序源文件和头文件

根据应用程序的类型 --- 单文档、多文档或基于对话框, AppWizard 将自动创建一些应用程序源文件和头文件,这些文件分别是应用程序类、文档类、主窗口类和视图类的声明文件和实现文件。

对于单文档应用程序将生成:

?  应用程序的头文件:含有所有全局变量和用于包含其他头文件的 #i nclude 伪指令。

?  应用程序主源文件:它将创建 Cexam1_1App 类的一个对象,并重载 InitInstance() 成员函数。

?  MainFrm.cpp , MainFrm.h

4 、资源文件:

资源文件包含以下各类文件:

?  一般 MFC 应用程序的默认菜单定义、加速键表和字符串表。

?  程序默认的 About 对话框和一个图标文件。

?  标准的 MFC 类的资源。

5 、预编译头文件:

StdAfx.cpp,StdAfx.h 用于建立一个预便宜的头文件 Exam1_1.PCH 和一个预定义的类型文件 StdAfx.obj 。

MFC基本框架的更多相关文章

  1. 图解MFC基本框架(深入消息映射机制)

    首先,先看整体的消息流向图: 上图解释: 起点是消息循环,在winmain函数中(mfc中winmain函数是隐含的调用的,在app全局对象构造完后紧接着调用winmain函数),while循环中不断 ...

  2. [游戏模版1] MFC最小框架(base function including)

    >_<:Here are the template of mini-MFC include: CPen,CBrush,Front,Paint Line and some other gra ...

  3. mfc简单框架的分析和原理记录

    由于最近在准备考试,可能博客的更新有点慢(呵,我又为自己的懒惰和拖延找借口,总之有时间就更新) 一.菜单 1.在windows中,菜单资源的识别通过HMENU句柄识别 ,但是这个开发过程比较繁琐 2. ...

  4. MFC - 微软基础类库和框架

    一 MFC的概念和作用 1 什么是MFC?? 全称 Microsoft Foundation Class Library我们称之为微软基础类库 1)从硬盘的存在形式上来说 MFC就是一个库(静/动态库 ...

  5. MFC学习-第2,3课 MFC框架的运行机制

    转自:http://blog.163.com/zhigang0633@126/blog/static/38790491200822711526168/ 讲述MFC AppWizard的原理与MFC程序 ...

  6. MFC应用程序框架(转)

    对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便.其实对于现在的编程工具来说,使用哪一种工具都不是问题的关键,重要的是你能够使用 ...

  7. MFC应用程序框架入门(转)

    1 MFC概述 顾名思意,MFC应用程序框架是以MFC作为框架基础的,以此程序框架模式搭建起来的应用程序在程序结构组织上是完全不同于以前的Win32 SDK编程方式的.自20世纪90年代初问世以来,M ...

  8. MFC框架中消失的WinMain()

    学过一段时间的MFC之后,很多人大概都有一个疑问:在MFC中,WinMain()哪去了?因为任何一个使用过Win32 SDK编程的人都知道,WinMain()函数是Win32程序开始的入口点,可是在M ...

  9. 框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)

    框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...

随机推荐

  1. [原创]python MySQLdb在windows环境下的安装、出错问题以及解决办法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 问题:windows下安装MySQLdb的方法 解析:python没有php那种集成环境,比如wamp那种集成软件直接把所有需要的东西全部一次性搭 ...

  2. css 改变scroll样式

    /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 16px; height: 16px; background-color: #F5 ...

  3. android改动tab 导航 指示器颜色

    我事实上想改动的上面的蓝色条条,改成红色. 这个问题实在是困扰我了太长时间.之前參照google的这个文章: https://developer.android.com/training/basics ...

  4. tomcat7源代码Bootstrap

    tomcat的启动从bootstrap的main方法開始,在main方法中主要是做了三件事,调用init方法初始化自己.调用catalinaDaemon对象 的setAwait方法设置它的await属 ...

  5. 关键字explicit

    今天在<C++ Standard Library>中看到 explicit 的作用,在这里做一下笔记,以备下次再次忘记该关键字的作用. By using the keyword expli ...

  6. XgCalendar日历插件动态添加参数

    在使用xgcalendar日历插件的时候,参数数组并非只有类型.显示时间.时区等这些参数,还可以根据extParam自定义参数扩展搜索条件,例如根据用户Id搜索不同用户的日历信息,需要将用户的Id存在 ...

  7. 20M宽带的网速等价于多少?

    最近有朋友问我:我家的宽带是20兆的,怎么网速这么慢? 运营商说的20M,完整的单位应该是20Mbps(bps:比特率),而日常中所说的下载速度单位是MB,两者是不一样的. 它们之间的换算关系是:1M ...

  8. RHEL7查看网卡配置命令ip addr show

    Validating Network Address Configuration To verify the configuration of the network address, you nee ...

  9. hdu 2200

    bc上的题目,很水,有很多方法做吧,题意大概就是给定你票数,然后让你求出票数最多的那个下标...... 之前我用两个for循环分开写,一个是读入,然后是判断,提交就wa,后来网上看了别人的,就是不能分 ...

  10. YII框架路由和URL生成

    路由和URL生成 当一个YII应用开始处理一个请求的时候,它首先要做的便是将请求的URL转化成一个路由.路由的作用是用于后续实例化相应的控制器和操作,以便处理请求,整个处理过程便叫做路由.路由的逆过程 ...