MFC的定义和实际操作方法

我是荔园微风,作为一名在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深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu iptables开机自启动

一、配置ubuntu路由转发 用在一台电脑有多个网卡的情形下&#xff0c;一个网卡5网段、一个网卡8网段&#xff0c;8网段是网络出口&#xff0c;所以5网段的设备需要入网的话&#xff0c;要路由转发。 sudo iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -j SNAT --to-sou…

STM32速成笔记—概述

文章目录 前言一、专栏简介二、前期准备三、编程规范以及程序架构简介1. 编程规范2. 程序架构 四、STM32F103ZET6简介五、程序模板六、ST-Link调试6.1 硬件连接6.2 Keil配置6.3 下载调试 前言 本人技术菜鸟一枚&#xff0c;2022年大学毕业&#xff0c;大学加入老师实验室&#…

chatgpt赋能python:如何在Python中创建模块:完整指南

如何在Python中创建模块&#xff1a;完整指南 如果你是一位Python开发者&#xff0c;你肯定需要用到模块。模块使得代码更容易组织和管理&#xff0c;并且可以复用许多代码片段&#xff0c; 提高代码的可重用性。在Python中&#xff0c;模块是一组相关函数&#xff0c;方法和变…

oracle expdp导致system表空间满

今天下午&#xff0c;项目经理反馈有套11204版本数据库无法使用了&#xff0c;立刻登录检查环境发现SYSTEM表空间使用率99.99%了 TABLESPACE_NAME MAXSIZE_MB ACTUALSIZE_MB USED_MB FREESPACE_MB SPACE USAGE ----------------- ---------- ------------- ---------- …

Trace32 SRST和TRST、system.attach 和 system.up的区别

目录 TRST-Resets the JTAG TAP controller and the CPU internal debug logic SRST- Resets the CPU core and peripherals SYStem.Mode Down SYStem.Mode Nodebug SYStem.Mode Prepare SYStem.Mode Go SYStem.Mode Attach SYStem.Mode StandBy SYStem.Mode Up 下图为…

ProGuard 进阶系列(二)配置解析

书接上文&#xff0c;从开源库中把代码下载到本地后&#xff0c;就可以在 IDE 中进行运行了。从 main 方法入手&#xff0c;可以看到 ProGuard 执行的第一步就是去解析参数。本文的内容主要分析源码中我们配置的规则解析的实现。 在上一篇文章末尾&#xff0c;在 IDE 中&#x…

大数据Doris(三十七):Spark Load导入HDFS数据

文章目录 Spark Load导入HDFS数据 一、准备HDFS数据 二、创建Doris表 三、创建Spark Load导入任务

【Reids】搭建主从集群以及主从数据同步原理

目录 一、搭建主从集群 1、介绍 2、搭建 二、数据同步原理 1、全量同步 2、主节点如何判断是不是第一次连接 3、增量同步 4、优化主从数据同步 一、搭建主从集群 1、介绍 单节点的Redis并发能力存在上限&#xff0c;要提高并发能力就需要搭建主从集群&#xff0c;实现…

【LLM GPT】李宏毅大型语言模型课程

目录 1 概述1.1 发展历程1.2 预训练监督学习预训练的好处 1.3 增强式学习1.4 对训练数据的记忆1.5 更新参数1.6 AI内容检测1.7 保护隐私1.8 gpt和bert穷人怎么用gpt 2 生成式模型2.1 生成方式2.1.1 各个击破 Autoregressive2.1.2 一次到位 Non-autoregressive2.1.3 两者结合 2.…

RabbitMQ虚拟主机无法启动的原因和解决方案

RabbitMQ虚拟主机无法启动的原因和解决方案 摘要&#xff1a; RabbitMQ是一个广泛使用的开源消息代理系统&#xff0c;但在使用过程中可能会遇到虚拟主机无法启动的问题。本文将探讨可能导致该问题的原因&#xff0c;并提供相应的解决方案&#xff0c;以帮助读者解决RabbitMQ虚…

第五章 模型篇: 模型保存与加载

参考教程&#xff1a; https://pytorch.org/tutorials/beginner/basics/saveloadrun_tutorial.html 文章目录 pytorch中的保存与加载torch.save()torch.load()代码示例 模型的保存与加载保存 state_dict()nn.Module().load_state_dict()加载模型参数保存模型本身加载模型本身 c…

K8s 中 port, targetPort, NodePort的区别

看1个例子&#xff1a; 我们用下面命令去创建1个pod2&#xff0c; 里面运行的是1个nginx kubectl create deployment pod2 --imagenginx当这个POD被创建后&#xff0c; 其实并不能被外部访问&#xff0c; 因为端口映射并没有完成. 我们用下面这个命令去创建1个svc &#xff…

chatgpt赋能python:Python怎样让画笔变粗

Python怎样让画笔变粗 Python是一门强大的编程语言&#xff0c;不仅适用于数据分析和机器学习等领域&#xff0c;也可以用来进行图像处理。在Python中&#xff0c;我们可以使用Pillow库来进行图像操作。在本篇文章中&#xff0c;我们将介绍如何使用Python和Pillow来让画笔变粗…

vue2_markdown的内容目录生成

文章目录 ⭐前言⭐引入vue-markdown&#x1f496; 全局配置&#x1f496; 渲染选项&#x1f496; 取出markdown的标题层级 ⭐结束 ⭐前言 大家好&#xff01;我是yma16&#xff0c;本文分享在vue2的markdown文本内容渲染和目录生成 背景&#xff1a; 优化个人博客功能&#xf…

delphi的ARM架构支持与System.Win.WinRT库

delphi的ARM架构支持与System.Win.WinRT库 目录 delphi的ARM架构支持与System.Win.WinRT库 一、WinRT 二、delphi的System.Win.WinRT库 2.1、支持ARM芯片指令 2.2、基于WinRT技术的特点 2.3、所以使用默认库而未经转化的服务端应用并不支持ARM架构服务器 2.4、对默认库…

【Linux】初步认识Linux系统

Linux 操作系统 主要作用是管理好硬件设备&#xff0c;并为用户和应用程序提供一个简单的接口&#xff0c;以便于使用。 作为中间人&#xff0c;连接硬件和软件 常见操作系统 桌面操作系统 WindowsmacOsLinux 服务器操作系统 LinuxWindows Server 嵌入式操作系统 Linux …

深度学习图像分类、目标检测、图像分割源码小项目

​demo仓库和视频演示&#xff1a; 银色子弹zg的个人空间-银色子弹zg个人主页-哔哩哔哩视频 卷积网路CNN分类的模型一般使用包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型 目标检测包括…

Java关键词synchronized

目录 一、通过卖票系统观察多线程的安全隐患 二、synchronized的基本知识 1.使用synchronized的原因 2.synchronized的作用 3.synchronized的基本格式 a.synchronized加在方法名前 b.synchronized用在方法中 4. Java锁机制 5.synchronized注意事项 三、使用synchronize…

Java Logback日志框架概述及logback.xml详解

日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置&#xff08;控制台、文件中、数据库中)。 可以随时以开关的形式控制是否记录日志&#xff0c;无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件&#xff0…

MATLAB读取OpenFOAM的二进制文件

OpenFOAM的文件格式 上面是OpenFOAM二进制文件的格式&#xff0c;我们可以看出&#xff0c;前面21行都是无关的说明文件&#xff0c;22开始时除了一个括号之外&#xff0c;其它的都是数据。 读取数据 读取数据的思路非常简单&#xff0c;忽略不需要的&#xff0c;读取需要的。…