MFC编程技巧与范例详解01

news2024/11/16 6:00:27

目录

1、MFC概述

(1)、MFC为什么不用C语言使用C++

(2)、MFC的开发模型文档-视图模型

(3)、一个完善的MFC程序应该包括

(4)、MFC常用的类

2、MFC的特性

(1)、MFC主要支持如下的特性

(2)、面向对象在MFC的技术支持

3、MFC类的分层结构

(1)、Windows程序的工作原理

(2)、建立应用程序

(3)、程序结构剖析

(4)、重载new和delete运算符

(5)、使用MFC方法的应用程序四个类的关系

(6)、MFC中的入口函数WinMain()函数

(7)类CWinApp

(8)、类CMainFrame

(9)、类CMyView和CMyDoc

(10)、其它的用户界面类

(11)、其它的MFC类

4、MFC库的消息映射

(1)、MFC中的消息映射机制

5、窗体概述


1、MFC概述

(1)、MFC为什么不用C语言使用C++

C语言只能使用API函数会非常复杂,使用C++可以减少代码提高效率。MFC的窗口本身具备面向对象的特点,窗口也是可以继承父类窗口的特性。

(2)、MFC的开发模型文档-视图模型

应用程序和元素界面分离的一种方法,具体来说应用程序指的是函数,元素指的是一些数据或者表格等。修改数据和表格并不会对应用程序造成过大的影响,只要函数不变。

(3)、一个完善的MFC程序应该包括

应用程序框架、图形绘制的绘制对象、文件服务、异常处理、结构(List\Map等)、网络服务、OLE 2(复杂的文档编辑和显示)、数据库、通用类。

(4)、MFC常用的类

CObject类:所有类的基类,提供了基本功能和接口。

CCmdTarget类:基类,实现消息响应机制,例如用户输入和工具栏按钮等事件。

CWinThread类:基类,实现多线程编程,线程的创建管理、线程同步、线程消息处理、线程状态查询

CWinApp类:基类,用于创建和管理Windows应用程序。在每个程序中只能使用一次CWinApp类

CWnd类:基类,用于创建和管理Windows窗口

CFrameWnd类:从CWnd类继承的,实现了标准的框架窗口

CDialog类:基类,创建管理对话框类

CView类:基类,创建管理视图窗口

(5)、Windows的6钟控件类型

静态文本框、可编辑文本框、按钮、滚动条、列表框、组合框。

2、MFC的特性

(1)、MFC主要支持如下的特性

文档-视图体系结构、多文档界面、打印以及打印预览支持、使用并创建ActiveX控件、ODBC以及Access数据库支持、Internet编程支持、Windows常用控件支持、多线程支持。

(2)、面向对象在MFC的技术支持

由于使用API来完成Windows编程需要很长的时间并且很困难,但是有了面向对象的概念:我们可以把任何事物(自行车、气球等)看作一个对象,把他封装起来。这个对象包括了它的属性和一些能执行的功能。对外界而言,我们不需要知道这个方法如何实现的,只用会用它的功能就可以了。MFC本质也是一个C++的类库,里面包括各种对于Windows的操作和方法。我们只需要知道调用我们需要使用的方法就能实现功能。

3、MFC类的分层结构

(1)、Windows程序的工作原理

Windows程序设计:提供给用户一个界面,通过得到用户的选择,向程序中的特定对象发送消息,然后调用特定的函数来操作。Windows应用程序的特点就是没有固定的流程,知识针对某个时间具有特定的子流程。Windows程序就是由多个子流程构成的。

(2)、建立应用程序

即使在没有写源代码的基础上,我们运行也能产生应用程序界面,我们需要做的就是向这个应用程序添加必要的功能代码,实现特定的功能。

(3)、程序结构剖析

MFC提供了许多设计好的类来满足广泛的需要。MFC的对象层次类似于目录结构,其中根对象CObiect,其它大部分都是继承这个根类。根类提供了三个重要的特性:

1)、串行化支持

串行化是对象的永久数据流出或流入存储介质(磁盘文件)的进行

2)、运行时类信息支持

类型识别,运行时候的对象创建

3)、诊断和调试支持

允许对CObject的派生类执行有效性检查,并将信息转存到一个调试窗口。

(4)、重载new和delete运算符

CObject对他的派生类还提供了重载new和delete运算符来防止内存泄漏

(5)、使用MFC方法的应用程序四个类的关系

1)、CWinApp类主要用于处理消息,他统一管理程序收到的所有消息,然后把消息分配到相应的对象中

2)、CMainFrame是CMyView的父类,即视窗View显示在MainFrame的客户区中

3)、CMyView用于显示数据,而数据的来源是类CMyDoc,在MFC程序中,数据放在文档中,数据的显示利用视窗方式,文档和视窗分离的方法。

(6)、MFC中的入口函数WinMain()函数

用户操作所产生的消息就是通过该函数派送到对应的对象中进行处理。

(7)类CWinApp

类CWinApp是应用程序运行的基础,是由MFC中的类CWnd派生的,其中一个重要的成员函数

1)、InitInstance()函数:程序一旦运行就启动InitInstance()函数,并且会创建主窗口。可以添加一些其它初始化工作但是必须是轻量级的。

 InitInstance()函数主要执行的工作:实例化一个框架窗口对象,把框架窗口对象和文档视图进行关联

与用户交互的界面是CFrameWnd提供的,但是CWinApp中的InitInstance()函数中才可以生成CFrameWnd。

(8)、类CMainFrame

在MFC中由CFrameWnd类派生,他是一个框架窗口。类CMainFrame是类CMyView的父类,CMyView类对象显示在主框架窗口的客户区中。CMainFrame以及继承了处理窗口的一般事件消息,因此我们不需要经常对CMainFrame类进行操作,而是对视窗类进行操作。

(9)、类CMyView和CMyDoc

文档类是由文档模板对象生成的,并由应用程序对象管理,用户通过视窗对象来存储和管理应用程序中的数据,用户和文档之间的交互是通过与文档相关联的视窗对象进行的。单文档中文档窗口和主框架窗口是一样的,此时的视窗显示在文档窗口的客户区

(10)、其它的用户界面类

MFC还提供了以下的类支持用户界面

1)、通用控件类:封装了如按钮等的通用控件

2)、菜单类:CWnd类为窗口提供的菜单

3)、对话框类:封装了对话框和通用对话框

4)、属性类:封装了属性表和属性页。

(11)、其它的MFC类

并非所有的MFC类都会影响到用户界面,CFile类,CArchive类、数据库类等。

1)、CFile类

封装了创建并维护一个普通文件的WindowsAPI。从CFile类中派生出CMenFile类、CStdioFile类、CSharedFile类。CMenFile类允许在内存而不是磁盘上创建文件,在构造一个CMenClass对象时,文件会被立即打开,可以使用成员函数进行读写,就好像它是一个磁盘文件一样。CSharedFile创建文件的内存在全局堆区。CSharedFile类允许读写以回车换行符控制结尾的文本字符串。

2)、CArchive类

在序列化的过程中使用CFile类将文档的类对象写入磁盘,按照某个顺序存入一个设备,以后也可以按照相同顺序恢复

3)、数据库类

MFC中有俩种数据库的类

ODBC:大多数数据库开发商支持的API

DAO:支持微软的数据库引擎,但是也可以访问ODBC

4)、ODBC包括三个派生类

CDatabase类:使用ODBC API打开DBMS数据库使用OpenEX()函数建立数据库连接,Close()函数关闭连接

CRecordset类:用于通过数据库连接来存储接收记录

CDBVariant类:代表记录中的一列

5)DAO类具有三种类似于ODBC的派生类

CDaoDatabase类用于打开DAO数据库

CDaoRecordSet类用于获取记录

COleVariant类用于表示记录列

6)、DAO类包含以下3个派生类:

CDaoWorkSpace用于管理数据库会话,该会话允许执行事物

CDaoQueryDef类用于表示查询

CdaoTableDef类用于表示一个表的定义

4、MFC库的消息映射

MFC库的应用框架并没有采用虚函数来处理Windows消息,相反,它通过一些宏来将特定的消息映射到派生类中相应的成员函数内。不采用虚函数的方法来处理。由于采用虚函数需要在父类对于140条消息定义虚函数,并且虚函数的传递结果必须时4个字节。如果处理一个特定功能的窗口就要得2.8KB大小的表来支持虚函数。

下面时消息映射函数:可以根据需要自定义响应函数,增加了灵活性。

(1)、MFC中的消息映射机制

消息映射是通过一张消息映射表进行,一旦消息发生,Framework就会根据表来进行命令传递。首先在需要消息映射的类头文件中包含DECLARE_MESSAGE_MAP()宏

然后在类的应用程序文件中

BEGIN_MESSAGE_MAP具有俩个参数,分别是拥有消息表格的类及其父类

ON_COMMAND宏用于指定命令消息的处理函数名称

END_MESSAGE_MAP作为结尾符号

5、窗体概述

MFC中,文档是数据载体,视图是文档的显示界面,对于同一个文档,可能存在多个视图界面,需要框架来管理。

MFC创造框架类的原因:把界面管理工作独立。框架窗口为应用程序的用户界面提供结构框架,他是应用程序的主窗口,负责管理其它包含的窗口。一个应用程序启动的时候会创建一个顶级框架窗口。

框架窗口分为:单文档窗口和多文档窗口。单文档窗口只能打开一个文档框架窗口,而在多文档窗口应用中可以打开多文档窗口,这些子窗口可以是同类型或者不同类型。

(1)、SDI结构(单文档视图窗体)

单文档界面是类似于记事本的窗体,他一次只处理一个文档。

(2)、MDI结构(多文档视图窗体)

同时打开和处理多个文档。

(3)、Dialog结构(基于对话框的窗体)

一般会把配置参数,显示少量数据,获取用户输入,与用户进行交互操作作为对话框窗体。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1352927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AndroidStudio导入程序、项目(教程)

目录 1. 首先解压压缩包,转为文件夹 2. 打开解压好的项目文件夹,删除.gradle和.idea这两个文件 3. 修改bulid.gradle文件,将gradle的版本型号改成自己的 (1) 传统结构 (2) 简洁结构 4. 打开android stdio软件,导入已经修改好…

test ui-02-UI 测试组件之 Appium 入门介绍

Appium简介 正如主页所述,Appium的目标是支持许多不同平台(移动、Web、桌面等)的UI自动化。 不仅如此,它还旨在支持用不同语言(JS、Java、Python等)编写的自动化代码。 将所有这些功能组合到一个程序中是…

LabVIEW开发滚筒洗衣机动态监测系统

LabVIEW软件在滚筒洗衣机的动态监测和分析中扮演着关键角色。本案例展示了如何利用LabVIEW开发的系统来优化洗衣机的性能和可靠性。 首先,在建立洗衣机的动力学模型基础上,利用LabVIEW进行了关键零部件的动态优化设计。通过LabVIEW的高级计算和模拟功能…

华清远见作业第二十天——IO(第三天)

思维导图&#xff1a; 使用标准IO完成两个文件的拷贝 代码&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc, const char *…

【C++】STL 容器 - multiset 容器 ( std::multiset 容器简介 | std::multiset 容器 常用操作 api 简介 )

文章目录 一、mulset 容器1、std::multiset 容器简介2、代码示例 - multiset 容器 二、std::multiset 容器 常用操作 api 简介1、常用 api 简介2、代码示例 - multiset 容器常用操作 一、mulset 容器 1、std::multiset 容器简介 在 C 语言 的 标准模板库 ( STL , Standard Temp…

【LeetCode每日一题】1154. 一年中的第几天(直接计算+调用库函数)

2023-12-31 文章目录 [1154. 一年中的第几天](https://leetcode.cn/problems/day-of-the-year/)方法一&#xff1a;直接计算思路&#xff1a; 方法二&#xff1a;调用库函数思路 1154. 一年中的第几天 方法一&#xff1a;直接计算 思路&#xff1a; 1.根据所给的字符串&#…

如何使用凹凸贴图和位移贴图制作逼真的模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 本教程将解释如何应用这些效应背后的理论。在以后的教程中&#xff0…

【网络技术】【Kali Linux】Wireshark嗅探(五)文件传输协议(FTP)

一、实验目的 本次实验使用Wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解文件传输协议&#xff08;FTP&#xff09;的工作原理。 二、FTP协议概述 文件传输协议&#xff08;File Transfer Protocol&#xff09;是互联网上使用得最广泛的文件传输协议&#xff0c;用…

3dmax渲染全景图参数设置 3dmax云渲染插件使用

家经常在互联网上看到制作360度全景图的各种教程&#xff0c;但这些教程往往是片段的&#xff0c;并且细节解释并不充分。为此&#xff0c;以下是一些从业者常用的优良做法&#xff0c;涉及到3ds Max中的场景布局和V-Ray渲染设置&#xff0c;这些建议旨在提供一个更全面和详尽的…

前端插件库-VUE3 使用 vue-codemirror 插件

VUE3 插件 vue-codemirror 使用步骤和实例、基于 CodeMirror &#xff0c;适用于 Vue 的 Web 代码编辑器。 第一步&#xff1a;安装 vue-codemirror & codemirror 包 &#xff0c; 以及语言包 npm install codemirror --save npm install vue-codemirror --savenpm insta…

大数据机器学习TF-IDF 算法+SnowNLP智慧旅游数据分析可视化推荐系统

文章目录 大数据机器学习TF-IDF 算法SnowNLP智慧旅游数据分析可视化推荐系统一、项目概述二、机器学习TF-IDF 算法什么是TF-IDF&#xff1f;TF-IDF介绍名词解释和数学算法 三、SnowNLP四、数据爬虫分析五、项目架构思维导图六、项目UI系统注册登录界面各省份热门城市分析城市热…

FastReport分组后半页空白问题解决办法

在使用FastReport进行分组后&#xff0c;经常会出现‘半页空白’的现象。比如按颜色进行分组&#xff0c;有白、黑、红三个颜色&#xff0c;第一类白色信息展示完成后&#xff0c;紧接着的第二类黑色信息&#xff0c;会从新的一页开始展示&#xff0c;白色信息的末尾会出现半页…

前端开发个人简历范本(2024最新版-附模板)

前端开发工程师个人简历范本> 年龄 25岁 性别 男 毕业院校 XX大学 张三 学历 邮箱 leeywai-tools.cn 本科 专业 计算机科学与技术 个人梗概 拥有扎实的前端开发技能和丰富的实践经验 善于与团队合作&#xff0c;适应能力强&#xff0c;能够快速融入团队并贡献自…

C++八股学习心得.3

1.C 数组 C 支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素&#xff0c;最高的地址对应最后一个…

word中设置上标后括号和数字没有上下对齐,解决

问题 word中设置上标后括号和数字没有上下对齐&#xff0c;如下图 原因 因为数字的括号是中文状态下输入的&#xff0c;数字是英文状态。用户需要将其改变成用英文状态下输入 解决办法 统一成英文状态&#xff1a;选中&#xff0c;设置字体为“半角” 如果上标来自参考文献…

CEC2017(Python):五种算法(DBO、HHO、RFO、SSA、PSO)求解CEC2017

一、5种算法简介 1、蜣螂优化算法DBO 2、哈里斯鹰优化算法HHO 3、红狐优化算法RFO 4、麻雀搜索算法SSA 5、粒子群优化算法PSO 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem d…

vue-cli项目优化gzip实践

背景&#xff1a;某天测试小妹气冲冲跑过来说你的网站首次打开平均16秒&#xff0c;慢得不行啊&#xff0c;空白时间太久&#xff0c;这样客户是不收货的&#xff0c;必须优化。谁叫我们是以测试驱动开发的&#xff0c;测试妹子的话等同与老板的命令。 空白是吧&#xff0c;我…

FindMy技术用于鼠标

鼠标是计算机的标准配置之一&#xff0c;其设计初衷是为了使计算机的操作更加简便快捷&#xff0c;减少用户在操作中的负担。用户可以通过移动鼠标&#xff0c;实现光标的精确移动&#xff0c;进而选择、拖拽、复制、粘贴等操作。这种操作方式&#xff0c;使得计算机的操作变得…

病急乱投医?大众「危机」

对于外资车企&#xff08;以及合资品牌&#xff09;来说&#xff0c;面对当下电动化、智能化市场白热化竞争的局面&#xff0c;显然有些「病急乱投医」的处境。 本周&#xff0c;大众汽车被曝出正在积极寻找合作伙伴&#xff0c;以帮助实现电动化转型的低成本目标&#xff0c;即…

【AIGC】金融号角吹响,现代技术引爆财富冲击波

在金融领域&#xff0c;创新力量的推动下&#xff0c;AIGC作为一位革命者崭露头角。其独特的理念和颠覆性的方法&#xff0c;将重新定义我们对健康的认知。它不仅改变了我们对金融的理解&#xff0c;更将引领我们走向一个全新的未来。AIGC的出现&#xff0c;无疑为金融界带来了…