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

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

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

相关文章:

MFC编程技巧与范例详解01

目录 1、MFC概述 (1)、MFC为什么不用C语言使用C (2)、MFC的开发模型文档-视图模型 (3)、一个完善的MFC程序应该包括 (4)、MFC常用的类 2、MFC的特性 (1&#xff09…...

TPS5430正负电源模块

TPS5430正负电源模块 Chapter1 TPS5430正负电源模块一、芯片重要参数二、tps5430参考电路讲解以及PCB布局1.正压降压(15V转12V)2.正压降负压(15V转-12V) Chapter2 使用tps5430制作正负DC-DC降压电源,tps7a47和tps7a33制…...

【LeetCode 面试经典150题】45. Jump Game II 跳跃游戏II

45. Jump Game II 题目大意 You are given a 0-indexed array of integers nums of length n. You are initially positioned at nums[0]. Each element nums[i] represents the maximum length of a forward jump from index i. In other words, if you are at nums[i], yo…...

RustDesk连接客户端提示key不匹配 Key Mismatch无法连接(已解决)

环境: RustDesk1.1.9 服务端docker部署 问题描述: RustDesk连接客户端提示key不匹配 Key Mismatch无法连接 解决方案: 1.docker部署RustDesk服务检查配置 networks:rustdesk-net:external: falsevolumes:hbbr:hbbs:services:hbbs:container_name: rustdesk-hbbsport…...

puppeteer入门指南

一、简介 Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。 二、使用 1、安装nodejs最新版 2、安装puppeteer-core npm install puppeteer-core 3、编写main.js const puppeteer require(puppeteer-core);(as…...

vue3按钮点击频率控制

现有一个按钮&#xff0c;如下图 点击时 再次点击 刷新窗口再次点击 刷新窗口依然可以实现点击频率控制。 代码实现&#xff1a; <template><!--<el-config-provider :locale"locale"><router-view/></el-config-provider>--><el…...

(一)Matlab数值计算基础

目录 1.2Matlab中的数据类型 1.2Matlab中的数据类型 逻辑型 逻辑型变量值为1或0字符型 MATLAB的字符型输入使用单引号括起来&#xff0c;字符串存储为字符数组&#xff0c;每个元素占一个ASCII字符数值型 数值型分为整型&#xff08;int&#xff09;、单精度浮点型&#xff0…...

《MySQL系列-InnoDB引擎02》InnoDB存储引擎介绍

文章目录 第二章 InnoDB存储引擎1 InnoDB存储引擎概述2 InnoDB存储引擎的版本3 InnoDB体系架构3.1 后台线程3.2 内存 4 Checkpoint技术5 Master Thread 工作方式5.1 InnoDB 1.0.x版本之前的Master Thread5.2 InnoDB 1.2.x版本之前的Master Thread5.3 InnoDB 1.2.x版本的Master …...

单片机大小端模式

单片机大小端模式 参考链接 单片机干货-什么是大小端_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Ju4y1M7Tx/?spm_id_from333.337.search-card.all.click&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e 特此记录 anlog 2024年1月2日...

Codeforces Good Bye 2023 A~E

A.2023(思维) 题意&#xff1a; 有一个序列 A a 1 , a 2 , . . . , a n k A a_1, a_2, ..., a_{n k} Aa1​,a2​,...,ank​&#xff0c;且这个序列满足 ∏ i 1 n k a i 2023 \prod\limits_{i 1}^{n k}a_i 2023 i1∏nk​ai​2023&#xff0c;而这个序列中的 k k k个…...

【蓝桥杯】比赛大纲整理

枚举[1-3] 排序 &#xff08;1&#xff09;冒泡排序[2] &#xff08;2&#xff09;选择排序[3] &#xff08;3&#xff09;插入排序[3] 搜索(bfs, dfs)[1-5] 贪心[1-5] 模拟[1-3] 二分[2-5] DP(普通一维问题)[3-5] 高精度[1-5] 数据结构 &#xff08;1&#xff09;栈[2-4]&…...

探索 CodeWave低代码技术的魅力与应用

目录 前言1 低代码平台2 CodeWave简介3 CodeWave 的独特之处3.1 高保真还原交互视觉需求3.2 擅长复杂应用开发3.3 支持应用导出&独立部署3.4 金融级安全要求3.5 可集成性高3.6 可拓展性强 4 平台架构和核心功能4.1 数据模型设计4.2 页面设计4.3 逻辑设计4.4 流程设计4.5 接…...

《2023我的编程之旅》

一、背景 自从踏入编程的世界&#xff0c;我就像乘坐了一辆无法停下的列车&#xff0c;穿行在数据的丛林中&#xff0c;寻找解决问题的答案。编程不仅是我的职业&#xff0c;更是我表达自我、解决问题的工具。在这篇文章中&#xff0c;我将分享一段令人印象深刻的实战经历&…...

C++ 二进制图片的读取和blob插入mysql_stmt_init—新年第一课

关于二进制图片的读取和BLOB插入一共包含五步 第一步&#xff1a;初始化 MYSQL_STMT* stmt mysql_stmt_init(&mysql); 第二步&#xff1a;预处理sql语句 mysql_stmt_prepare(stmt,sql,sqllen); 第三步&#xff1a;绑定字段 mysql_stmt_bind_param(stmt,bind); 第四…...

向爬虫而生---Redis 基石篇2 <拓展Hash>

前言: 延续上一篇向爬虫而生---Redis 基石篇 &#xff1c;拓展str&#xff1e;-CSDN博客 这个章节拓展一下hash的玩法,主要是要挖一挖 ,啥时候用它最合适;让他并不是一无是处.. 正文: 哈希&#xff08;Hash&#xff09;数据结构是Redis中的一种常用的数据类型。它是一个键值…...

【论文精读】A Survey on Large Language Model based Autonomous Agents

A Survey on Large Language Model based Autonomous Agents 前言Abstract1 Introduction2 LLM-based Autonomous Agent Construction2.1 Agent Architecture Design2.1.1 Profiling Module2.1.2 Memory ModuleMemory StructuresMemory FormatsMemory Operations 2.1.3 Plannin…...

23款奔驰GLC260L升级原厂540全景影像 高清环绕的视野

嗨 今天给大家介绍一台奔驰GLC260L升级原厂360全景影像 新款GLC升级原厂360全景影像 也只需要安装前面 左右三个摄像头 后面的那个还是正常用的&#xff0c;不过不一样的是 升级完成之后会有多了个功能 那就是新款透明底盘&#xff0c;星骏汇小许Xjh15863 左右两边只需要更换后…...

SQL 在已有表中修改列名的方法

文章目录 1. MySQL2. SQL Server3. Oracle / PostgreSQL Question&#xff1a; 假设有一张表 StudentInfo&#xff0c;表中有一个列名是 Student_Name &#xff0c;想要把这个列名改成 StudentName 应该如何操作&#xff1f; 建表语句如下&#xff1a; --建表 if object_id(S…...

QT----Visual stdio翻金币案例,附源码

历经一个月&#xff0c;各种事情磕磕绊绊&#xff0c;终于结束了&#xff0c;自己还是太菜了 案例的文档写的教程已经很详细&#xff0c;这边主要是记录一些问题 github代码 gitee代码 1、图片无法加载 一开始加载首页图片和标题出不来&#xff0c;结果是paintEvent重写的字打…...

总结:浏览器解析html与执行JS之生命周期详解

总结&#xff1a;浏览器解析html与执行JS之生命周期详解 一浏览器解析html的生命周期&#xff1a;1.请求HTML文档&#xff1a;2接收响应&#xff1a;3构建DOM树&#xff1a;4加载外部资源&#xff1a;5DOMContentLoaded事件&#xff1a;6样式计算与布局&#xff1a;7绘制与渲染…...

aspose通过开始和结束位置关键词截取word另存为新文件

关键词匹配实体类&#xff1a; Data EqualsAndHashCode(callSuper false) public class TextConfig implements Serializable {private static final long serialVersionUID 1L;/*** 开始关键词&#xff0c;多个逗号分隔*/private String textStart ;/*** 结束关键词&#x…...

深入解析美颜SDK:绿幕抠图功能的算法原理

当下&#xff0c;美颜SDK绿幕抠图功能成为许多应用中不可或缺的一环。本文将深入解析美颜SDK中绿幕抠图功能的算法原理&#xff0c;揭示其背后的技术奥秘。 一、什么是美颜SDK绿幕抠图&#xff1f; 美颜SDK的绿幕抠图功能是一种通过计算机视觉技术&#xff0c;将视频或图像中…...

从有向带权图判断最短路径里各目标顶点顺序

对如下有向带权图&#xff0c;若采用迪杰斯特拉(Dijkstra)算法求从源点a到其他各顶点的最短路径&#xff0c;则得到的第一路径的目标顶点是b&#xff0c;第二条最短路径的目标顶点是c&#xff0c;后续得到的其余各最短路径的目标顶点依次是() A.d,e,f B.e,d,f C.f,d,e D.f,…...

鼠标驱动框架:模拟键盘按键

/* 参考: drivers\hid\usbhid\usbmouse.c */ #include <linux/kernel.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/init.h> #include <linux/usb.h> #include <linux/input.h> #include <linux/hid.h>st…...

ES6之Promise的链式调用

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…...

HTML----JavaScript操作对象BOM对象

文章目录 目录 文章目录 本章要求 一.BOM模型概述 二.BOM核心&#xff1a;window对象 常用属性 常用方法&#xff1a; confirm() 案例 open ()close()案例 setTimeout( ) 案例 setInterval( ) 案例 document对象 练习 本章要求 了解BOM模型掌握BOM模型实际应用 一.BOM模型…...

隆道数智大会回顾|第13期《如何构建绿色产业供应链新生态》(完)

本期演讲嘉宾&#xff1a; 史文月 采购与供应链专家 邢庆峰 品类管理和质量管理专家 刘婷婷 中兴通讯供应链规划总监 张燕华 正大生物CIO 吴树贵 隆道公司总裁 本期演讲主题&#xff1a; 如何构建绿色产业供应链新生态 本期内容要点&#xff1a; 1.供应链管理的核心问…...

粒子群优化pso结合bp神经网络优化对csv文件预测matlab(3)

1.csv数据为密西西比数据集&#xff0c;获取数据集可以管我要&#xff0c;数据集内容形式如下图&#xff1a; 2.代码 这里参考的是b站的一位博主。 数据集导入教程在我的另一篇文章bp写过&#xff0c;需要的话可以去看一下 psobp.m close all clc%读取数据 inputX; outputY;…...

软性演员-评论家算法 SAC

软性演员-评论家算法 SAC 软性演员-评论家算法 SAC优势原理软性选择模型结构目标函数重参数化熵正则化代码实现 软性演员-评论家算法 SAC 优势原理 DDPG 的问题在于&#xff0c;训练不稳定、收敛差、依赖超参数、不适应复杂环境。 软性演员-评论家算法 SAC&#xff0c;更稳定…...

Nginx多域名部署多站点

目录 1.修改配置文件nginx.conf 2. 修改hosts文件 1.修改配置文件nginx.conf 在配置文件的 server_name 处修改成自己需要的域名&#xff0c;然后保存退出 j 查看语法是否错误&#xff0c;然后重启nginx nginx -t # 查看语法是否正确 systemctl restart nginx # 重启nginx …...

怎么做自己的个人网站/从哪里找网络推广公司

以下内容全部来自 Transforms Ⅰ. Transforms 简而言之&#xff0c;就是训练的数据有时候并不是机器学习训练的数据格式&#xff0c;这个时候就需要 Transforms 对数据进行一些操作&#xff08;转换&#xff09;&#xff0c;使其适合做神经网络的输入。比如对于图像数据&…...

吕梁网站制作吕梁安全/中文域名注册

从一个运行了RTX系统的程序中跳转到另一个带有RTX系统的程序时,程序卡在RTX初始化中,在跳转前关闭滴答定时器中断,跳转正常 http://www.keil.com/support/docs/3925.htm...

淘宝网站策划怎么做/网络服务器配置与管理

出题&#xff1a;定义一个复杂链表&#xff1a;在单向链表的基础上&#xff0c;每个节点附加一个指向链表中其他任意节点的指针sibling&#xff0c;实现CNode* Clone(Cnode *head)函数复制这个复杂链表&#xff1b; 分析&#xff1a; 解法1&#xff1a;将head复制到CHead中&…...

优秀的国外网站/西安抖音seo

需求&#xff1a;客户端界面需要一个软键盘进行操作 做了一个简易的例子进行展示。 html代码&#xff1a; <div id"container"> <div class"print-right"><div id"right-top" class"right-top"><div class&quo…...

怎么利用360域名做网站/深圳google推广

刚开始接触vue 的webpage脚手架的时候是不是对那一堆文件夹特别懵。下面我们就来看看脚手架里面的目录都代表什么吧&#xff01;首先安装好脚手架的时候目录是这样的1.node_modues --这个文件夹里面是存放下载好的依赖(模块&#xff0c;组件)--依赖的工具包目录2.public …...

wordpress 远程管理/2023引流软件

php 图片局部打马赛克 原理&#xff1a; 对图片中选定区域的每一像素&#xff0c;添加若干宽度及高度&#xff0c;生成矩型。而每一像素的矩型重叠在一起。就形成了马赛克效果。本例使用GD库的imagecolorat获取像素颜色&#xff0c;使用imagefilledrectangle画矩型。效果图&…...