一、MFC应用程序类型

上篇文章的彩蛋:可通过使用MFC应用程序向导(MFC AppWizard)的功能来创建所需要的应用程序,这意味着不需要输入任何代码。MFC除了应用程序向导,还对应用程序项目有着独特的管理方式。

1. MFC AppWizard

  作用:能为用户生成一些常用的标准程序结构和编程风格,它们被称为应用程序框架结构。

  提供的应用程序框架类型:包括MFC AppWizard(dll)、MFC AppWizard(exe)、Win32 Application等,这些类型基本上能满足各个层次用户的不同需要,但一般的用户更关心的是MFC AppWizard(exe)应用程序框架,因为它包含用户最常用的三种应用程序类型:单文档、多文档和基于对话框的应用程序。

2. 单文档应用程序、多文档应用程序、基于对话框的应用程序

  基于对话框的应用程序:没有菜单、工具栏及状态栏,也不能处理文档

下面的篇幅都默认已经创建了一个单文档应用程序Ex_SDI

二、项目文件和项目配置

1. 工程/项目

  应用程序包含了除源程序外的许多信息,因此在Visual C++中常将它们称为“项目”或“工程”。

2. 工作文件夹

  Visual C++是用文件夹来管理一个应用程序项目的,这个文件夹称为“工作文件夹”,且文件夹名就是项目名。如Ex_SDI就是一个工作文件夹名。

  在工作文件夹下包含源程序代码文件(.cpp、.h)、项目文件(.dsp)以及项目工作区文件(.dsw)等。

3. 探索工作文件夹

  以单文档应用程序项目Ex_SDI为例,该文件夹内除了有上述的文件外,还有相应的Debug或Release、Res等子文件夹。

  具体的图示可参考p38的图1.22,也可参考自己应用程序项目的文件夹。

4. Win32 Debug版本的运行程序

  用Visual C++ 6.0应用程序向导创建项目时,系统会自动为项目创建Win32 Debug的运行程序,并使用相应的默认配置。

  它与Win32 Release版本的区别在于:Debug版本的运行程序有相应的调试信息码,以便于程序的调试,而Release版本的运行程序没有,但Release版本的运行程序经过代码的优化,其程序的运行速度加快。

5. 让应用程序可交付

选择“组建”→“移除工程配置”菜单命令,在弹出的对话框中,选择“Ex_SDI-Win32 Release”,然后单击“确定”按钮。重新编连后,可将默认的Win32 Debug版本修改成Win32 Release版本。这样,在Release文件夹中的exe文件就是交付用户的可执行文件。

三、项目管理和类结构

1. 项目工作区

  作用:①有效地管理项目中的那些文件;②维护各源文件之间的依赖关系。

  内容:包含三个选项卡(ClassView类页面、ResourceView资源页面、FileView文件页面)

2. 应用程序的MFC类结构

  我们使用MFC AppWizard创建一个默认的Windows单文档应用程序,并命名为“Ex_SDI”。

  将项目工作区窗口切换到ClassView选项卡,可以看到MFC为单文档应用程序项目Ex_SDI自动创建了类CAboutDlg、CEx_SDIApp、CEx_SDIDoc、CEx_SDIView和CMainFrame。

上面这些类之间的说明如下:

  • CAboutDlg:对话框类,从CDialog类派生的,是每一个应用程序框架都有的用来显示本程序的有关信息
  • CEx_SDIApp:应用程序类,从CWinApp类派生的,是每一个应用程序框架都有的负责应用程序的创建、运行和终止
  • CEx_SDIDoc:应用程序文档类,从CDocument类派生的,负责应用程序文档数据管理
  • CEx_SDIView:应用程序视图类,既可从基类CView派生,也可从CView派生类(如CListView、CTreeView等)派生,负责数据的显示、绘制和其他用户交互
  • CMainFrame:主框架窗口类负责主框架窗口的显示和管理,包括工具栏和状态栏等界面元素的初始化。对于单文档应用程序,主框架窗口类是从CFrameWnd派生的。

四、OnDraw和消息添加

1. OnDraw函数

  在应用程序框架中,视图类用来封装和管理框架窗口的子窗口,当子窗口无效时,就会自动调用用户视图类的OnDraw函数。

  翻译:子窗口无效→调用视图类的OnDraw函数

  • OnDraw函数是对WM_PAINT消息的一种映射。故若想在客户区绘制“Hello MFC!”时,其绘制代码就应在OnDraw函数中添加(将项目工作区切换到ClassView选项卡,展开CEx_SDIView结点,双击OnDraw成员函数结点,在定位到的代码区添加相应的代码)。

2. 在视图类中添加单击鼠标的消息处理(映射)

  • 弹出MFC ClassWizard对话框→Message Maps(消息映射)选项卡→类名CEx_SDIView→在Objects IDs列表框中选定CEx_SDIView→双击Messages列表中的(要映射的)WM_LBUTTOMDOWN消息→在CEx_SDIView类中添加该消息的映射函数OnLButtonDown→双击消息函数(即OnLButtonDown)会定位到OnLButtonDown函数实现的源代码处→添加相应的代码
  • 上面的流程便完成了一个消息的添加和映射过程。
  • 读后感:OnLButtonDown函数是WM_LBUTTOMDOWN消息映射,故当触发“WM_LBUTTOMDOWN消息”时,程序会执行OnLButtonDown函数内的代码。

  说明:上述消息的映射遵循前述的MFC消息映射机制,且在代码中出现了//{{AFX_MSG(…)和//}}AFX_MSG以及//{{AFX_MSG_MAP(…)和//}}AFX_MSG_MAP等特殊标记,它们表示之间的内容由MFC ClassWizard自动管理。

补充:

MFC AppWizard:能为用户生成一些常用的标准程序结构和编程风格,它们被称为应用程序框架结构。

CEx_SDIView类:应用程序视图类,负责数据的显示、绘制和其他用户交互。

消息的映射:当触发“WM_LBUTTOMDOWN消息”时,程序会执行OnLButtonDown函数内的代码

第四课——MFC应用程序框架的更多相关文章

  1. VS2010/MFC编程入门之四(MFC应用程序框架分析)

    VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html   上一讲鸡啄米讲的是VS2010应用 ...

  2. VS2010-MFC(MFC应用程序框架分析)

    转自:http://www.jizhuomi.com/software/145.html 一.SDK应用程序与MFC应用程序运行过程的对比 程序运行都要有入口函数,在之前的C++教程中都是main函数 ...

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

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

  4. [转]深入理解MFC中程序框架

    最近抽空复习了一下MFC的内容,觉得一篇博文写的不错. 原文内容太多直接给出链接吧:深入理解MFC中程序框架 链接2:深入浅出话VC++(2)——MFC的本质 链接3:MFC单文档/视图结构穷追猛打

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

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

  6. 【VC++学习笔记四】MFC应用程序中框架类的获取

    一.文档类中 获取视图: 先获取主窗体,在根据主窗体获取视图 pMain->GetActiveDocument();注意类型转换 由于文档中可能包含多个视图,可以按照下面函数获取: CView* ...

  7. windows应用程序框架及实例

    应用程序框架:同一类型应用程序的结构大致相同,并有很多相同的源代码,因此可以通过一个应用程序框架AFX(Application FrameWorks)编写同一类型应用程序的通用源代码. 主要向导: D ...

  8. VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)

    VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html   上一讲中讲了VS20 ...

  9. VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)

    上一节中鸡啄米讲了GDI对象之画刷CBrush,至此图形图像的入门知识就讲完了.从本节开始鸡啄米将为大家带来Ribbon界面开发的有关内容.本文先来说说如何创建Ribbon样式的应用程序框架. Rib ...

随机推荐

  1. C++ ACM基础

    一.C++结构体 #include <iostream> using namespace std; struct Point{ int x; int y; Point(int x=0,in ...

  2. QT 防止FTP 上传软件在断连处 Crash

    前段时间发现项目中的上传FTP软件有可能会在从服务器申请断连时Crash, 所以加了一个Timer. 由于项目代码行数过大, 此处上传部分代码片段. timeoutTimer = new QTimer ...

  3. 免安装版MySQL8数据库的安装

    [环境准备] PC版本:Windows10企业版.64位操作系统 数据库:MySQL8.0.12-win64.zip免安装版 [彻底卸载已安装的MySQL数据库] 由于系统中MySQL数据库的卸载不彻 ...

  4. UEditor显示Invalid or unexpected token

    原文链接http://www.qqdeveloper.com/a/53.html 问题背景    数据修改操作,需要做一个数据内容回显,该内容中包含代码.图片.普通文本等等内容,反正就是各种内容. 当 ...

  5. 【laravel】同一代码段内,先更新数据,后查询修改的数据,查询结果错误的问题

    如标题所言,是什么意思呢?举个栗子,需求如下: 你是一个电话销售人员,手头有一些待call电话单,每个电话单上有N个不同的电话号码,需要你每打一个电话就标记为”已打“.当一个电话单上的号码都标记为”已 ...

  6. python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说

    使用cmd创建一个scrapy项目: scrapy startproject project_name (project_name 必须以字母开头,只能包含字母.数字以及下划线<undersco ...

  7. django路由基本使用-6

    路由定义位置 django的路由是定义在 urls.py 文件下的 urlpatterns 列表中的. urls.py 文件是路由解析的入口. from django.conf.urls import ...

  8. ruby中的extend 和 include

    include include是把module中定义的instance_method给mixin,然后当做类的实例方法使用(是因为module本身不能使用module的实例方法),给类进行实例化一个对 ...

  9. 快排(golang实现) 递归方法

    递归方法,逻辑简洁清晰.这个算法还是很重要的,需要重点记忆理解,面试经常考手写.据说是与傅里叶变换等并称“20世纪十大算法”.https://blog.csdn.net/v_JULY_v/articl ...

  10. ARP级ping命令:arping

    一.工作原理 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议,是网络链路层的协议,在局域网中使用.主机发送信息时将包 ...