MFC的定义和实际操作方法

news2025/2/1 13:59:41

我是荔园微风,作为一名在IT界整整25年的老兵,今天从另一个角度来看一下MFC。

完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd窗口框架类,CDocument文档类,CView视类

过程:CWinApp创建CFrameWnd框架窗口实例,框架窗口创建文档模板,文档模板创建文档实例和视实例,将两者关联

微软公司除了推出Windows操作系统以外,还会研发类库从而方便自身开发人员的工作,那么mfc是什么?下面由我来介绍一下。

mfc是什么

mfc是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数,并且包含一个应用程序框架,以减少应用程序开发人员工作量。

vc++是微软公司开发的c/c++的集成开发环境,所谓集成开发环境,就是说利用它你可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。

vc++其中一个编译器内核就是gcc。 MFC除了是一个类库以外,还是一个框架,你应该试过,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。

xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西。

但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率但是MFC的封装很浅,所以效率上损失不大,灵活性还可以,虽然也有很多缺陷,但还是一个比较好的东西。

MFC生成本机代码,自然是很快,可是消息循环减缓了界面显示速度。

WinForm封装了win32的api,多次进行P/invoke操作(大部分使用p/invoke操作封装),速度慢。

WPF是一种新的模型,不再使用win32模型,自己新建模型,使用dx作为新的显示技术,直接访问驱动程序,加快了运行速度,可是,这种模型,需要支持dx9的显卡,硬件要求高(你还能找到现代机器不支持dx9的吗?)

开发效率上,MFC < WPF < WinForm

尽管MFC开发界面执行效率高但是开发效率低,作为现在的项目开发来说时间跟开发效率往往能决定项目的成败,所以除非有特别的需求,否则都回尽量避免用MFC来做开发,MFC只是一个弱封装器。

开发成本,MFC > WPF > WinForm

用MFC开发成本太高,对开发者能力要求更高,作为客户当然希望开发的费用越少越好,开发者当然希望钱赚得越多越好,这样一比,这也是MFC没落的一个很大的原因。

界面执行效率上,MFC == WPF > WinForm

随着计算机硬件的性能提高,多核cpu的普及,它们的差距会越来越小。

开发灵活性上:WPF > MFC > WinForm

美观上:WPF > WinForm > MFC

这一项中MFC下要开发出一个华丽的ui极其困难,也许你可以说你可以用控件,但是商业开发控件是要收费的,MFC要写出这种效果不知要写到何年何月。这样一来MFC存在的价值就更低了。效率和美观不如WPF,开发效率又不如WinForm。

内存使用上:WPF > WinForm > MFC

随着计算机硬件的性能提高WPF这个缺点会被忽略。

使用范围:WPF > MFC == WinForm

有以上可知:WPF大有取代WinForm和MFC之势,从.net的发展来看,MFC以后只会变成一种经典,作为一种技术来供开发者学习,WinForm和WPF两者会并存发展,但最终都会被WPF取代,最终实现桌面应用程序和浏览器应用程序的统一。

实际操作总结

一、MFC的概念和作用

1、什么是MFC?

全称:Microsoft Foundation Class Library(微软基础类库)

1-MFC从硬盘存在形式来说就是一个库(静态MFC库、动态MFC库)

2-MFC从原理来说还是一个程序框架

2、为什么使用MFC?

基于框架编程,提高工作效率,减少开发周期,降低开发成本。

二、几个重要的头文件

afx.h--包含了MFC中绝大部分类的声明

afxwin.h--包含了afx.h和windows.h

afxext.h--提供了对扩展类的支持,例如:工具栏、状态栏...

附:以Afx...开头的函数,可以确定为MFC库中的一个全局函数;

以::...开头的函数,可以确定为Win32的API函数;

三、MFC应用程序的分类

1、使用MFC库制作自己的控制台程序

相比Win32控制台程序:

多了一个全局对象 CWinApp theApp

入口函数不同于以往的入口函数

2、使用MFC库制作自己的静态库程序

3、使用MFC库制作自己的动态库程序

1--使用MFC库制作自己的规则动态库(静/动态MFC库)

2--使用MFC库制作自己的扩展动态库

区别:规则库可以被所有程序调用,扩展库只能被支持MFC的程序调用

4、使用MFC库制作自己的窗口程序

1--单文档视图构架程序

CFrameWnd-框架窗口类,封装了关于框架窗口的操作

CWinApp-应用程序类,封装了关于程序流程的操作

CDocument-文档类,封装了关于数据的操作(提取、转换、存储...)

CView-视图窗口类,封装了关于视图窗口的操作(绘图)

2--多文档视图构架程序

CMDIChildWnd-子框架窗口类,封装了关于子框架窗口的操作

CMDIFrameWnd-主框架窗口类,封装了关于主框架窗口的操作

CWinApp-应用程序类,封装了关于程序流程的操作

CDocument-文档类,封装了关于数据的操作(提取、转换、存储...)

CView-视图窗口类,封装了关于视图窗口的操作(绘图)

3--对话框构架程序

CWinApp-应用程序类,封装了关于程序流程的操作

CDialog-对话框窗口类,封装了关于对话框窗口的操作

 四、MFC库中类的概述

1、CObject-MFC库中绝大部分类的最基类

封装MFC库中最基本的几个机制:

运行时类信息机制、动态创建机制、序列化机制

2、CCmdTarget-消息映射机制的最基类

3、CWinThread/CWinApp-应用程序类,负责管理程序的流程

4、CDocument及其子类-文档类,负责管理数据

5、Exceptions-异常类,封装了关于MFC中各种异常情况的处理

6、CFile及其子类-文件操作类,封装了关于各种文件的操作

7、CWnd-窗口类的最基类,封装了关于窗口的最基本的操作

8、Frame Windows-框架窗口类,封装了关于各种框架窗口的操作

9、Dialog Boxes-对话框窗口类,封装了关于各种对话框窗口的操作

10、Views-视图窗口类,封装了关于各种视图窗口的操作

11、Controls-控件窗口类,封装了关于各种控件窗口的操作

12、CDC及其子类-封装了各种绘图设备,以及绘图函数

13、CGdiObject及其子类-封装了各种绘图对象的操作

14、CArrary/CList/CMap及其子类-封装了C++中相应的数据结构

15、非CObject类-封装了关于各种结构的操作

例如:CPoint,CRect,CString,CTime...

五、MFC的类向导功能(ClassWizard)

在VC6的菜单栏->查看->建立类向导(Ctrl+W)

  

1、Message Maps选项卡

①Project:下拉列表框给出当前工程名称。实际上,对于VC++来说,一个工作区空间(.dsw)中可以包含多个工程(.dsp)。因此,如果工作区中有多个工程,可以在Project下拉列表框选择当前需要处理的工程。

②Class name:下拉列表框显示当前工程中包含的类,用户可以选择任何存在于当前工程中的类,为其添加消息处理函数等。

③Object IDs:列表框列出当前选择的类所包含的所有资源的ID号,包括菜单项、对话框控件等,列表中的第一项总是当前的类名。

④Messages:列表框列出对应于Object IDs框中所选中的当前项可处理的消息,以及针对当前类可被重写的MFC虚函数。

⑤Member functions:列表框列出当前类包含的所有成员函数。其中,前面标注有“V”字符的是虚函数,标注“W”字符的是Windows消息处理函数。

⑥Add Class:按钮允许用户在工程中添加一个新类。新类可以是自己创建的,也可以从ActiveX库中选取。

⑦Add Function:按钮允许用户向Member Functions列表框中添加一个新的消息处理函数或重载基类的虚函数。

⑧Delete Function:按钮允许用户删除Member Functions列表框中所选中的函数。

⑨Edit Code:按钮打开编辑窗口,允许用户对Member Functions框中所选中的项进行编辑。

  

2、Member Variables选项卡

①Project:下拉列表框与Message Maps选项卡上的Project下拉列表框含义相同,给出当前工程名称。

②Class name:下拉列表框与Message Maps选项卡上的Class name下拉列表框相同,显示当前工程中包含的类,用户可以从中选择当前要操作的类。

③Control IDs:显示对话框中所具有的控件的ID号;Type项表示成员变量的类型;Member项表示成员变量的名字。

④Add Class:按钮允许用户在工程中添加一个新类。新类可以是自己创建的,也可以从ActiveX库中选取。

⑤Add Variable:按钮用于给选定的控件添加成员变量。

⑥Delete Variable:按钮用于删除选定控件的成员变量。

⑦Update Columns:按钮用于当数据源中的表结构发生变化时,即可更新相应的记录集类,以便与最新的表结构保持一致。

⑧Bind All:按钮用于把数据库内指定表中的字段与记录集类相应数据成员一一绑定。默认情况下,ClassWizard基于每个字段的名称确定记录类内相应的数据成员名称。

   

3、Automation选项卡

①Project:下拉列表框给出当前工程名称。

②Class name:下拉列表框显示当前工程中包含的类,用户可以选择任何存在于当前工程中的类,包括不支持Automation的类。

③External names:列表框列出已加到当前类中的方法及属性的外部名。这些名字供Automation客户程序使用。

④Implementation:文本框显示External names框中选中的方法及属性在C++类中是怎样实现的:S表示固有属性,C表示自定义属性,M表示方法,粗体表示默认的属性。

⑤Add Class:按钮允许用户在工程中添加一个新类。新类可以是自己创建的,也可以从ActiveX库中选取。

⑥Add Method:按钮用于给类添加新的Automation方法。增加或删除方法时,Class Wizard自动更新映射表。此项只对支持Automation的类有效。

⑦Add Property:按钮用于给类添加新的Automation属性。增加或删除属性时,Class Wizard自动更新映射表,此项只对支持Automation的类有效。

⑧Delete:按钮用于删除External names框中选定的方法或属性名。如果属性是用Get/Set方式访问的,必须手工删除.cpp文件里的Get和Set成员函数。

⑨Edit Code:按钮打开编辑窗口进行编辑。

⑩Data Binding:按钮用于指定Automation控件支持的数据绑定层次。

  

4、ActiveX Events选项卡

①Project:下拉列表框给出当前工程名称。

②Class name:下拉列表框显示当前工程中包含的类,用户可以选择任何存在于当前工程中的类,包括不支持ActiveX的类。

③External names:列表框列出已加到当前类中的成员函数与成员变量名。这些名字供Automation客户程序使用。

④Implementation:文本框显示External names框中选中的方法及属性在C++类中的实现:S表示固有属性,C表示自定义属性,M表示方法,粗体表示默认的属性。

⑤Add Class:按钮允许用户在工程中添加一个新类。新类可以是自己创建的,也可以从ActiveX库中选取。

⑥Add Event:按钮允许用户加入Automation事件。该事件用于类与该类容器之间的通信。

⑦Delete:按钮用于删除选中的Automation事件。

  

5、Class Info选项卡

①Project:下拉列表框给出当前工程名称。

②Class name:下拉列表框显示当前工程中包含的类。用户可以选择当前需要处理的类。

③File details:显示当前类的文件及资源ID号等信息。

④Advanced options:控件组包含:

Message filter:下拉列表框列出对当前选中的类有效的所有消息分类,这里是按照消息所属窗口或对话框类型进行分类的。

Foreign class:下拉列表框的内容由当前选中类的类型决定。如果当前选中的类是对话框、有格式视图或记录集视图,那么此框列出所有与选中的类相关联的外部类名。在其它情况下,则显示为None。

Foreign variable:框列出与当前选中的类相关的所有外部变量。此选项一般用于数据库类。在编辑记录集视图时,可以选取相关的记录集,并可以输入一个新的变量名。

⑤Add Class:按钮用于添加新类。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

 

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

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

相关文章

算法刷题-链表-反转链表

反转链表 206.反转链表思路C代码双指针法递归法其他语言版本使用虚拟头结点解决链表翻转使用栈解决反转链表的问题 反转链表的写法很简单&#xff0c;一些同学甚至可以背下来但过一阵就忘了该咋写&#xff0c;主要是因为没有理解真正的反转过程。 206.反转链表 力扣题目链接 …

【Java基础篇】方法的使用(方法的使用以及形参实参的关系)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;Java.SE&#xff0c;本专栏主要讲解运算符&#xff0c;程序逻辑控制&#xff0c;方法的使用&…

【线程安全问题】线程互斥与线程同步技术

在达内Windows/Win32编程专栏中&#xff0c;我们已经介绍过线程同步与线程互斥技术&#xff0c;包括了原子锁&#xff0c;互斥体&#xff0c;事件和信号量。但是与海哥讲的线程同步与线程互斥技术不太一样&#xff0c;这篇文章来带领大家学习线程同步与线程互斥技术&#xff0c…

新手运行bert,pycharm不识别conda安装的python环境

提示No module named numpy/tensorflow conda list是有这些包的 pycharm识别不出interpreter的package 改成scripts下的python.exe就能识别出numpy和tensorflow了 改完interpreter之后出现过importerror: dll load failed&#xff0c;在environment variables里加了这些就不报错…

06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布

我们先看看画布的魅力&#xff1a; 初始画布 canvas默认是宽300px&#xff0c;高150px; 绘制步骤 1.定义一个id <canvas id"canvasOne" width"300" height"300"></canvas> 2.获取canvas对象 var canvasObj document.getEleme…

程序开发体系架构(C/S与B/S)

应用最多的网络应用程序开发体系结构可分为两种&#xff0c;一种是基于客户端/服务器&#xff08;Client/Server&#xff0c;C/S&#xff09;结构&#xff0c;另一种是基于浏览器/服务器&#xff08;Browser/Server&#xff0c;B/S&#xff09;架构 C/S体系结构 C/S是指在开发…

性能测试报告模板

xxx系统 性能测试报告 版本号&#xff1a;V1.0 2023年1月9日 1 概述 1.1 测试目的 1.2 测试依据 2 测试范围 3 测试方法 3.1 测试工具 3.2 并发用户策略 3.3 性能指标监控 3.4 性能测试策略 3.5 测试步骤简述 4 测试目标 4.1 系统处理能力 4.2 操作响应时间 4…

凸优化系列——无约束优化问题

最小二乘问题: 采用适当的方法可将约束优化问题转换为无约束优化问题; 最优解的定义&#xff1a; 无约束优化问题的最优性条件 需要说明的是&#xff0c;由于二阶梯度可以取0&#xff0c;我们由一元函数的知识可以知道&#xff0c;它是必要条件而非充分条件&#xff0c;当把等…

一款自动生成CRUD代码的自定义Starter

一个基础web的spring-boot-starter框架 web-spring-boot-starter Gitee仓库链接&#xff1a;https://gitee.com/suhuamo/web-spring-boot-starter Github仓库链接&#xff1a;https://github.com/suhuamo/web-spring-boot-starter 前言 对应一个web项目的开发&#xff0c;数据…

硬件设计电源系列文章-DCDC转换器布局设计

文章目录 概要 整体架构流程 技术名词解释 1.开关电源PCB布局要点 2.输入电容的放置 3.二极管的放置 4.散热孔的放置 5.反馈路径的走线 小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 本文主要DCDC转换器布局方面的知识。 整体架构流程 提示&#xf…

Dockerfile构建镜像与实战

一、基于Dockerfile创建镜像 1&#xff09;联合文件系统(UnionFS) UnionFS(联合文件系统) : Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统&#xff0c;它支持对文件系统的修改作为一次提交来一层层的叠加&#xff0c;同时可以将不同目录挂载到同一个虚拟文…

Go语言并发之Select多路选择操作符

1、Go语言并发之Select多路选择操作符 select 是类 UNIX 系统提供的一个多路复用系统 API&#xff0c;Go 语言借用多路复用的概念&#xff0c;提供了 select 关键字&#xff0c;用 于多路监听多个通道。当监听的通道没有状态是可读或可写的&#xff0c;select 是阻塞的&#…

NoSQLBooster 8.0.11 for MongoDB

MongoDB最智能的IDE。 NoSQLBooster 是适用于 MongoDB Server 3.6-6.0 的跨平台 GUI 工具&#xff0c;它提供了内置的 MongoDB 脚本调试器、全面的服务器监控工具、链接流畅查询、SQL 查询、查询代码生成器、任务调度、ES2020 支持和高级 IntelliSense 体验。 嵌入式MongoDB S…

YUM源安装,在线YUM,本地YUM

YUM源 一、定义 YUM&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;**可以自动处理依赖性关系&…

【ChatGPT散文篇】ChatGPT-清华大学的讲座要点

刚听了清华大学关于ChatGPT的讲座&#xff0c;总结几个要点: 1、AI有可能成为地球上最初的硅基生命。 2、AI已迭代至博士研究生的智力水平。 3、以后将不存在学科和专业的概念&#xff0c;也不存在文科理科的区分&#xff0c;将是学科大融合。因为一个文科生哪怕不懂代码&a…

【Elasticsearch】结合Postman/ApiPost 快速入门

相比于MySQL那种关系型数据库&#xff0c;是采用正排索引&#xff0c;也就是根据主键去找其对应的行数据。而Elasticsearch这个NoSQL&#xff0c;是采用倒排索引&#xff0c;根据输入的某值返回其它整行的数据。而Elaticsearch是采用RESTful风格的数据库访问&#xff0c;以下就…

Docker 概述与命令操作

一、Docker 概述 1、Docker的概念 • Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源 • Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机” • Docker 的容器技术可以在一台主机上轻松为任何应用创建一…

IDEA 集成Maven

一. 下载IDEA编辑器 下载地址&#xff1a;Download IntelliJ IDEA – The Leading Java and Kotlin IDE 选中免费开源的社区版本 创建桌面图标和添加安装路径到系统变量&#xff0c;其他的默认安装即可。 二. 配置Maven环境 分为局部配置和全局配置 1. 局部配置maven环境 …

编译tolua——4、更新luaJit

目录 1、编译工具和环境说明 2、基础编译tolua 3、以pbc为例子&#xff0c;添加第三方库 4、更新luaJit 大家好&#xff0c;我是阿赵。 用tolua做项目的朋友们&#xff0c;在这两年肯定会遇到过一个问题&#xff0c;就是现在的安卓应用市场比如谷歌市场&#xff0c;要求上传的…

Linux知识点 -- 进程控制(一)

Linux知识点 – 进程控制&#xff08;一&#xff09; 文章目录 Linux知识点 -- 进程控制&#xff08;一&#xff09;一、进程创建1.fork函数2.写时拷贝2.fork常规用法3.fork调用失败的原因 二、进程终止1.进程终止时操作系统的行动2.进程终止的常见方式3.用代码终止一个进程 三…