MFC 基础篇(一)

目录

一.SDK编程

二.为什么要学MFC?

三.MFC能做什么?

四.MFC开发环境搭建

五.MFC项目创建

六.消息映射机制


一.SDK编程

Application Programming Interface 应用程序编程接口。

Software Development Kit 软件开发工具包,一般会包括API接口文档,示例文档,帮助文档,使用手册,相关工具等。

SDK程序基本骨架:

int WinMain(){// 设计窗口外观及交互响应,注册,申请专利RegisterClass(...)// 生产窗口CreateWindow(...)// 展示窗口ShowWindow(...)// 粉刷窗口UpdateWindow(...)// 进入消息循环while (GetMessage(...)) {// 消息转换TranslateMessage(...);// 消息分发DispatchMessage(...);}
}

这是使用SDK创建一个窗口的过程,可以看出来,十分复杂。

重要概念:

窗口就是屏幕上的一片区域,接收用户的输入,显示程序的输出。可以包含标题栏,菜单栏,工具栏,控件等。

句柄(handle) (资源的编号,二级指针,门把手),窗口句柄,文件句柄,数据库连接句柄。

C++窗口类对象与窗口并不是一回事,它们之间惟一的关系是C++窗口类对象内部定义了一个窗口句柄变量,保存了与这个C++窗口类对象相关的那个窗口的句柄。窗口销毁时,与之对应的C++窗口类对象销毁与否,要看其生命周期是否结束。但C++窗口类对象销毁时,与之相关的窗口也将销毁

二.为什么要学MFC?

在写SDK程序时,需要程序员自己处理各种消息,实现窗口创建,注册,绘制,销毁,程序耗费很多精力在这些地方上,为了提升效率,有大佬把 SDK 进行封装,这就是MFC的诞生,使 Windows桌面应用程序开发效率大大提升。

MFC就是封装了各种系统调用,方便程序开发。SDK相当于手工作坊时代,MFC相当于流水线。因为MFC是封装了 Windows操作系统的API,所以写出来的程序也只支持在 Windows 上运行。

三.MFC能做什么?

四.MFC开发环境搭建

VS2019下安装MFC

组件列表

五.MFC项目创建

创建MFC应用

选择程序类型

MFC文档类型

  1. 基于对话框的 MFC 项目: 基于对话框的 MFC 项目是一种常见的 MFC 应用程序类型,它的主要界面是一个对话框窗口。对话框窗口通常包含了控件(如按钮、编辑框、列表框等)和菜单等元素,用于与用户交互。该类型的 MFC 项目适合处理简单的界面和交互逻辑。

  2. 基于单个文档的 MFC 项目: 基于单个文档的 MFC 项目是一种支持处理单个文档的应用程序类型,它包含了一个文档视图框架和一个文档类。该类型的 MFC 项目适合处理只有一个文档的应用场景,如文本编辑器等。

  3. 基于多个文档的 MFC 项目: 基于多个文档的 MFC 项目是一种支持处理多个文档的应用程序类型,它包含了一个文档视图框架和多个文档类。该类型的 MFC 项目适合处理多个文档之间相互关联的应用场景,如电子表格、绘图工具等。

基于对话框的 MFC 项目适合处理简单的界面和交互逻辑;基于单个文档的 MFC 项目适合处理只有一个文档的应用场景;而基于多个文档的 MFC 项目适合处理多个文档之间相互关联的复杂应用场景。

根据需要选择即可

根据需要选择即可

六.消息映射机制

MFC(Microsoft Foundation Class)消息映射机制是一种方便的事件处理方式,它将 Windows 操作系统中的消息与 MFC 应用程序中的事件进行关联。通过使用消息映射机制,开发人员可以很方便地处理用户界面上的各种事件。

在 MFC 中,每个控件都可以接收 Windows 消息,例如鼠标点击、键盘输入等。当控件接收到消息时,MFC 就会将消息转换为一个事件,并将其传递给响应的事件处理函数。这个过程就是消息映射。

消息映射的实现需要借助一个类似于表格的结构,称为消息映射表。每个消息映射表条目包含了一个消息 ID 和一个事件处理函数。当控件接收到消息时,MFC 就会查找消息映射表,并调用相应的事件处理函数来响应该消息。

BEGIN_MESSAGE_MAP(CMFCTest1Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_TEST_BTN, &CMFCTest1Dlg::OnBnClickedTestBtn)
//1 消息映射表
END_MESSAGE_MAP()//2 自动生成消息响应函数
void CMFCTest1Dlg::OnBnClickedTestBtn()
{MessageBox(_T("Test"));
}// 3 消息响应函数的声明
afx_msg void OnBnClickedTestBtn();

CMFCTest1Dlg是一个对话框;IDC_TEST_BTN是以一个控件按钮的消息ID;OnBnClickedTestBtn 是处理按钮点击事件的成员函数;

当点击对话框的按钮,就会触发控件按钮的消息ID,控件接收到消息,就会查找消息映射表,调用对应函数进行处理。

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

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

相关文章

indexedDB笔记

indexedDB 该部分内容主要源于https://juejin.cn/post/7026900352968425486 常用场景:大量数据需要缓存在本地重要概念 仓库objectStore:类似于数据库中的表,数据存储媒介索引index:索引作为数据的标志量,可根据索引获…

次小生成树学习笔记

次小生成树有严格次小生成树和非严格次小生成树之分。常见的是严格次小生成树。 严格次小生成树的定义如下: 如果最小生成树选择的边集是 E M E_M EM​,严格次小生成树选择的边集是 E S E_S ES​,那么需要满足:( v a l u e ( e…

Spring Boot 面试题——常用注解

目录 Spring Bean将一个类声明为 Bean自动装配 Bean声明 Bean 的作用域 前端后传值处理常见的 HTTP 请求类型读取配置文件定时任务全局 Controller 层异常处理 Spring Bean 将一个类声明为 Bean Component:通用的注解,可标注任意类为 Spring 组件。如果…

【入门Flink】- 04Flink部署模式和运行模式【偏概念】

部署模式 在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。Flink为各种场景提供了不同的部署模式,主要有以下三种:会话模式(Session Mode)、单作业模式(Per-Job Mode&…

小程序如何设置用户同意服务协议并上传头像和昵称

为了保护用户权益和提供更好的用户体验,设置一些必填项和必读协议是非常必要的。首先,用户必须阅读服务协议。服务协议是明确规定用户和商家之间权益和义务的文件。通过要求用户在下单前必须同意协议,可以确保用户在使用服务之前了解并同意相…

【机器学习】随机森林

随机森林 文章目录 随机森林1. 什么是集成学习方法2. 随机森林3. 随机森林工作过程4. API5. 总结 1. 什么是集成学习方法 集成学习方法通过建立几个模型组合来解决单一预测问题。它的工作原理就是生成多个分类器/模型,各自独立地学习和做出预测。这些预测最后结合成…

分析:如何多线程运行测试用例

这是时常被问到的问题,尤其是UI自动化的运行,过程非常耗时,所以,所以多线程不失为一种首先想到的解决方案。 多线程是针对的测试用例,所以和selenium没有直接关系,我们要关心的是单元测试框架。 unittest …

Spring IOC - Spring启动过程解析

Spring启动流程的核心逻辑主要体现在方法AbstractApplicationContext#refresh中,该方法没有被子类重写。 本文主要从宏观层面对其进行剖析,从整体上感知。各执行步骤和作用按先后顺序如下表所示,其中标红方法为核心方法,标绿色方法…

[GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号、数字被过滤绕过(ctfshow web入门370)-CSDN博客 ssti板块注入 正好不会 {%%}的内容 学习一下 经过测试 发现过滤了 {{}} 那么我们就开始吧 我们可以通过这个语句来查询是否存在ss…

免费亲人微信聊天记录提取软件新版本v1.1,使用说明,注意事项 2023.11.06

V 1.1 优化了备份速度,新增了备份消息类型的选型,可以选择仅仅备份文本,或者文本与音频,或者文本音频视频图片。 有什么办法可以导出与某个人的微信聊天记录? 只想导出与某个微信好友的聊天记录,有办法做到…

内网服务器(不通外网)访问高德在线地图服务的方法

在项目部署过程中,若部署服务器处于内网环境,则无法调用高德服务。需要通过搭建代理实现请求的转发,从而获取到在线服务内容。下面的记录解决了内网服务器访问高德地图服务的问题。 一、所需设备 内网服务器(项目所需部署环境&a…

运维知识点-MySQL从小白到入土

MySQL从小白到入土 mysql 服务器安装windows mysql 服务漏洞复现-mysql jdbc反序列化-权限绕过 mysql 服务器安装 https://dev.mysql.com/downloads/mysql/https://www.cnblogs.com/xiaostudy/p/12262804.html 点餐小程序腾讯云服务器安装mysql8 windows mysql 服务 net sta…

1.UML面向对象类图和关系

文章目录 4种静态结构图类图类的表示类与类之间的关系依赖关系(Dependency)关联关系(Association)聚合(Aggregation)组合(Composition)实现(Realization)继承/泛化(Inheritance/Generalization)常用的UML工具reference欢迎访问个人网络日志🌹🌹知行空间🌹🌹 4种静态结构…

cp没有--exclude选项!Linux复制文件夹时如何排除一些文件?

之前使用tar命令压缩文件将时,使用了–exclude选项排除了一些不需要的文件。现在我想复制一个文件夹,但是其中一些文件不需要复制,此时注意到cp命令居然没有–exclude选项。 rsync可以快速地帮助我们完成相同的事情,命令如下&…

rust 基础数据类型

默认类型 大部分情况下,rust 可以基于上下文自动推导出变量的类型。下面代码中,变量 x 没有显式,rust 默认是 i32 类型。 fn main() {let x 5; }但也有一些例外情况,比如,字符串类型的转换中变量 x 的类型&#xff…

【Java 进阶篇】JSP 简单入门

在现代Web开发中,JavaServer Pages(JSP)是一项非常重要的技术。JSP允许开发者将Java代码嵌入HTML页面,以实现动态内容的生成和呈现。本文将详细介绍JSP的概念、原理以及如何使用JSP来构建Web应用程序。 第一部分:JSP …

如何将 XxlJob 集成达梦数据库

1. 前言 在某些情况下,你的项目可能会面临数据库选择的特殊要求,随着国产化的不断推进,达梦数据库是一个常见的选择。本篇博客将教你如何解决 XxlJob 与达梦数据库之间的 SQL 兼容性问题,以便你的任务调度系统能够在这个数据库中…

章鱼网络进展月报 | 2023.10.1-10.31

章鱼网络大事摘要 1、Louis 成功竞选 NDC 的 HoM 议席,将会尽最大努力推动 NEAR 变革。2、章鱼网络受邀参加在土耳其主办的 Cosmoverse2023,分享 Adaptive IBC 的技术架构。3、2023年10月8日章鱼日,是章鱼网络主网上线2周年的纪念日。 …

机器学习---SVM目标函数求解,SMO算法

1. 线性可分支持向量机 1.1 定义输入数据 假设给定⼀个特征空间上的训练集为: 其中,(x , y )称为样本点。 x 为第i个实例(样本)。 y 为x 的标记: 当y 1时,x 为正例;当y −1时,x…

vue3项目实践

创建 vue3 项目 node本版:node 16.x.x, 脚手架:create-vue 脚手架工具,底层vite 创建vue3项目:npm init vuelatest setup函数 vue3 单文件组件 1、vite.config.js配置文件基于vite的配置 2、template模板不再要求唯…