MFC编程技巧与范例详解01

目录

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结构(基于对话框的窗体)

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

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

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

相关文章

Java虚拟机介绍

JVM是一种用于计算设备的规范,它是一个虚拟出来的计算机,是通过在实际的计算机上仿真模拟计算机的各个功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。每个Java虚拟机都着一个清晰的任务&#x…

78 Python开发-多线程FuzzWaf异或免杀爆破

这里写目录标题 本课知识点:学习目的:演示案例:Python开发-简单多线程技术实现脚本Python开发-利用FTP模块实现协议爆破脚本Python开发-配合Fuzz实现免杀异或Shell脚本 涉及资源: 本课知识点: 协议模块使用,Request爬虫技术,简易多线程技术,…

freeCodeCamp:编程学习之旅的起点

一、产品介绍 freeCodeCamp是一个提供免费编程课程的学习平台。它包含了数百个编程挑战,覆盖了从基础的HTML、CSS和JavaScript到高级的算法和数据结构等各个方面的知识。freeCodeCamp不仅提供了丰富的学习资源,还帮助我通过实践提高编程技能。 二、应用…

【操作系统xv6】学习记录2 -RISC-V Architecture

说明:看完这节,不会让你称为汇编程序员,知识操作系统的前置。 ref:https://binhack.readthedocs.io/zh/latest/assembly/mips.html https://www.bilibili.com/video/BV1w94y1a7i8/?p7 MIPS MIPS的意思是 “无内部互锁流水级的微…

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题 可以从这里: 可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后 显示文件展示中,文件预览失败,那么这个时候,去修改minio的配…

test ui-04-testcomplete 入门介绍

About TestComplete TestComplete是一款适用于各种应用程序类型和技术的自动化测试环境,包括(但不限于)Windows、.NET、WPF、Visual C、Visual Basic、Delphi、CBuilder、Java以及Web应用程序和服务。 TestComplete既适用于功能测试&#x…

2023机器人行业总结,2024机器人崛起元年(具身智能)

2023总结: 1.Chatgpt引爆了通用人工智能,最大的受益者或是机器人,2023年最热门的创业赛道便是人形机器人,优必选更是成为人形机器人上市第一股, 可以说2023年是机器人开启智能化的元年,而2024则将成为机器…

Win10 开机突然时出现0xc000014c错误怎么办?

环境: Win10 专业版 问题描述: Win10 开机突然时出现0xc000014c错误怎么办? 尝试F8模式也进不了还是这个画面 文件:\Windows\System32\config\system 状态:0xc000014c 信息:无法加载操作系统&#xff…

numpy数组05-numpy的索引和切片

numpy中可以对其中的某一行(列)进行数据处理。 上节课我们已经取出了CSV文件中的二维数组,本次对这个二维数组为例,进行练习操作。 示例代码如下: import numpy as npus_file_path "US_video_data_numbers.cs…

Linux学习记录——삼십삼 http协议

文章目录 1、URL2、http协议的宏观构成3、详细理解http协议1、http请求2、http响应1、有效载荷格式2、有效载荷长度3、客户端要访问的资源类型4、修改响应写法5、处理不同的请求6、跳转 3、请求方法(GET/POST)4、HTTP状态码(实现3和4开头的&a…

【日积月累】Java中 正则表达式

目录 日积月累】Java中 正则表达式 1.前言2.基本语法3.Pattern和Matcher类4.校验的表达式大全5.参考文章所属专区 日积月累 1.前言 正则表达式是一种用于匹配文本模式的语法,它通常与编程语言一起使用。在Java中,正则表达式用于匹配字符串,可以使用Pattern和Matcher类来实…

深度生成模型之GAN优化目标设计与改进 ->(个人学习记录笔记)

文章目录 深度生成模型之GAN优化目标设计与改进原始GAN优化目标的问题1. JS散度度量问题2. 梯度问题 优化目标的设计与改进1. 最小二乘损失GAN2. Energy-based GAN(EBGAN)3. Wasserstein GAN4. WGAN-GP5. Boundary Equilibrium GAN(BEGAN)6. Loss Sensitive GAN7. Relativeisti…

AI:109-基于机器学习的文本图像关联分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

IDEA断点调试

IDEA断点调试 断点调试是一种在程序执行过程中暂停执行并逐步检查代码状态的方法。它允许开发者在程序运行到特定位置时暂停执行,查看变量的值、执行过程和调用栈等信息,从而更好地理解代码的运行情况和解决问题。可以帮助我们查看java底层源代码的执行…

Controller-Api接口删除引用的接口服务报模型验证都不能为空?

当开始引用接口服务时,如下: 则下面的控制器就必须遵循api接口规范,控制器里的接口必须都继承至ICompanyAppService中的 1、当,不想全部引用接口服务中的接口时,删除引用的接口服务,则请求接口会模型验证全…

Stata各版本安装指南

Stata下载链接 https://pan.baidu.com/s/1ECc2mPsfNOUUwOQC9hCcYg?pwd0531 1.鼠标右击【Stata18(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)【解压到 Stata18(64bit)】。 2.打开解压后的文件夹,鼠标右击【Setup】选择【以管…

【C++】HP-Socket(一): 下载、Linux上编译、Windows远程编译Linux版本

1、简介 国产、高性能、跨平台网络通信框架。 作者于2024-01-01更新了Release版本v5.9.4,辛苦了,向作者致敬! 源码下载: https://gitee.com/mirrors/hp-socket https://github.com/ldcsaa/HP-Socket 2、编译 2.1 在Linux上编…

Redis:原理速成+项目实战——Redis实战4(解决Redis缓存穿透、雪崩、击穿)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理项目实战——Redis实战3(Redis缓存最佳实践(问题解析高级实现)&#x…

一文读懂Solana 上最正统的铭文通证$mash

早在 2023 年的 11 月,包括 Solana、Avalanche、Polygon、Arbitrum、zkSync 等生态正在承接比特币铭文生态外溢的价值。当然,因铭文赛道过于火爆,当 Avalanche、BNB Chain 以及 Polygon 等链上 Gas 飙升至极值,Arbitrum、zkSync 等…

什么是聚合支付,又能带来哪些好处?

随着科技的飞速发展,人们的支付方式也在不断地发生变革。从最初的现金支付、银行卡支付,到现在的移动支付、扫码支付等,支付方式已经变得越来越便捷。聚合支付作为一种新型的支付方式,也在逐渐改变着人们的生活方式。那么&#xf…