当前位置: 首页 > news >正文

第四课——MFC应用程序框架

一、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函数内的代码

 

转载于:https://www.cnblogs.com/xzxl/p/7930418.html

相关文章:

  • 列表、元祖概述
  • 拨云见日—深入解析Oracle TX 行锁(上)
  • 询问Spring Bott和高并发框架两个问题
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • MicroProfile 1.2新增功能介绍
  • Google瓦片地图算法解析
  • TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成
  • 网络流媒体技术及其应用
  • 【安全牛学习笔记】w3af-截断代理
  • 典型Linux发行版内核版本
  • Web开发中的文件上传组件uploadify的使用
  • httpie使用详解
  • 程序猿的日常——SpringMVC系统架构与流程回顾
  • Web监听器导图详解
  • 如何成为好的系统分析员
  • [数据结构]链表的实现在PHP中
  • 08.Android之View事件问题
  • angular组件开发
  • canvas 五子棋游戏
  • Computed property XXX was assigned to but it has no setter
  • DOM的那些事
  • input的行数自动增减
  • PAT A1092
  • php ci框架整合银盛支付
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 前端工程化(Gulp、Webpack)-webpack
  • 在weex里面使用chart图表
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 阿里云重庆大学大数据训练营落地分享
  • 国内开源镜像站点
  • 通过调用文摘列表API获取文摘
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (1)Android开发优化---------UI优化
  • (11)MATLAB PCA+SVM 人脸识别
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (七)理解angular中的module和injector,即依赖注入
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (转)h264中avc和flv数据的解析
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .gitignore
  • .gitignore文件_Git:.gitignore
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .考试倒计时43天!来提分啦!
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @EventListener注解使用说明
  • @Transaction注解失效的几种场景(附有示例代码)