MFC程序设计(一) MFC框架

news2024/11/15 9:05:07

基本概念

SDK:开发软件的套件

WDK:开发驱动的套件

当我们开发驱动时,两者版本需要一致

MFC:Microsoft Fundation class,即微软基础类库。是基于Win32 SDK进行的封装的框架 。

MFC为我们提供了大量的WindowsSDK的代码及设计重用,因此我们并不需要像SDK一样对消息过程进行处理,而是只需要去实现相应消息的功能即可

接下来我们开始从0到1创建一个最常见的MFC项目(基于对话框):

我们打开VS2022,选择创建MFC应用:

1.应用程序类型->修改基于对话框

2.用户界面功能->依自己想法进行选择

3.将该项目命名为Demo01

二.修改相关项目属性:

1.属性->C/C++/代码生成/运行库->MTD ,Spectre缓解->禁用,

2.属性->高级->MFC的使用->在静态库中使用MFC

完成以上设置后,我们运行程序,便得到了一个基于对话框的mfc窗口

现在我们创建一个单文档MFC项目:

一.我们打开VS2022,选择创建MFC应用:

1.应用程序类型->修改当个文档

2.项目样式->MFC standard

二.修改相关项目属性:

1.属性->C/C++/代码生成/运行库->MTD ,Spectre缓解->禁用,

2.属性->高级->MFC的使用->在静态库中使用MFC

3.注意不要关闭预编译头

完成以上设置后,我们运行程序,便得到了一个单文档的mfc窗口

接下来我们以同上单文档mfc同样的操作创建一个多文档的mfc项目

如下图所示:

WINDBG就是通过多文档MFC开发的

接下来我们创建一个单文档的Windows Explorer样式的MFC项目

如下图所示:

接下来我们创建一个单文档的office样式的Windows7视觉样式的mfc项目

如下图所示:

接下来我们创建一个单文档的VsStudio样式2018视觉央视的mfc

如下图所示:

接下来我们以上面创建的基于对话框的mfc项目进行讲解

MFC类管理

我们在该项目的类视图中可以发现,该项目有如下几个类

CAboutDlg:应用程序的主对话框点击关于弹出的对话框类

CDemo01App: CWinApp 派生的类

CDemo01Dlg:主对话框类,应用程序运行后显示的主要界面

Demo01Dlg类是一个多重继承的类,它的继承关系自顶向下分别是:

Cobject:最父类。基础类库中的主体基类,用于处理序列化以及反序列化:类似我们将结构体存储到文件,再从文件中取出该结构体的过程

CCmdTarget:消息映射结构体系类,该类可以处理WM_COMMAND消息

CWnd:窗口类

CDialog:对话框类

CDialogEx:对话框类

Demo01Dlg:最子类,我们自己创建的对话框

OnInitDialog:对话框MFC框架的入口

MFC是基于类的管理,在运行程序后生成的对话框默认绑定了一个类:Demo01Dlg,两者一一关联。

MFC函数

在MFC中,我们需要使用Windows SDK的所有需要填写窗口句柄的函数,均不需要填写窗口句柄。这是因为MFC对SDK的函数进行了二次封装。

比如:MessageBox(L”Msg”, L”Msg”, MB_OK)

但如果我们需要调用WindowsSDK本身的函数时,只需要在函数前加入::进入全局命名空间,,这时便退出了MFC的命名空间,这样便可以正常调用了

比如:

HWND hStatic = ::GetDlgItem(m_hWnd, IDC_STATIC);

::SetWindowText(hStatic, L”MSG”);

对话框

MFC中的对话框分为模态对话框和非模态对话框,和SDK一致,并且同样支持SDK通过发消息的形式对对话框的应用

现在我们进行讲解一个对话框从0到1的创建过程:

1.我们在资源中手动添加一个对话框后,右键点击后选择添加类:

如下图所示:

2.对添加的类进行相关设置

此时MFC会自动生成该对话框类以及CDialogOne.h类声明和CDialogOne.cpp类实现文件,而对话框中的控件就是类对象

按钮

现在我们进行讲解如何添加按钮并应用:

我们以程序为我们生成的主对话框为例,进行按钮的添加及应用

1.我们手动在主对话框中添加以下两个按钮

2.针对按钮进行应用:点击相关按钮,右键点击后选择事件处理程序。此处双击按钮可以创建点击消息类型的处理函数

3.对事件处理程序进行填写内容,此处我们选择的是点击的消息类型。注意该按钮在哪个对话框,就要把他放在相应对话框的类里。我们也可以选择其他消息类型以便我们对其进行相关消息触发后的处理。

4.我们同样可以右键对话框选择类向导,在类向导中,有很多可供我们选择的控件的各种消息处理

5. 我们也可以在按钮属性的控件事件(黄色闪电)中进行添加相关消息处理函数

6.完成以上步骤以后,程序会为我们生成相关的控件消息处理函数,我们直接在该函数内部进行函数定义即可

MFC在每个控件都实现了很多的函数了,我们直接使用即可。上述代码的含义是点击按钮后弹出一个对话框

此时我们便完成了MFC中对控按钮的一个应用了

编辑框

现在我们进行讲解编辑框的创建与应用

我们对控件进行应用时,控件的数据可能会发生变化,比如编辑框文本编辑。因此我们需要为这些数据可能发生变化的控件进行绑定变量。上文中的按钮,以及静态文本之类的控件,由于我们应用时并不会导致相关数据发生变化,因此我们不必进行绑定变量

MFC控件绑定变量的两种方式:

1.值类型

2.控件类型

接下来,我们针对编辑框对两种类型的绑定进行一个讲解

1.我们在对话框中创建两个文本编辑框

2.右键点击第一个编辑框选择添加控件变量,之后我们对此进行内容的填写

此时第一个编辑框便是控件类型绑定

3.右键点击第二个编辑框选择添加控件变量,之后我们对此进行内容的填写

此时第二个编辑框便是值类型绑定

现在我们开始对这两种不同变量绑定的编辑框结合按钮进行应用:

void CDemo01Dlg::OnBnClickedButtonCreateDialog()
{
	//控件类型编辑框应用:
	// 应用一:点击按钮弹出模态对话框
	CDialogOne obj;
	obj.DoModal();
	//应用二:点击按钮使控件类型编辑框显示文本
	//方法一:使用SDK的函数
	HWND hEdit1 = ::GetDlgItem(m_hWnd, IDC_EDIT1);//获取编辑框1的句柄
	::SetWindowText(hEdit1, L"Text");//点击模态按钮编辑框1显示文本Text
	//方法二:使用类中函数
	m_Edit1.SetWindowTextW(L"xxxxx");//点击模态按钮编辑框1显示文本xxxxx
	//应用三:点击按钮使值类型编辑框显示文本:
	UpdateData(TRUE); //首先需要进行文本与界面的同步
	m_Edit2 = L"xxxxx";//值类型的编辑框可以直接编辑
	UpdateData(FALSE);//同步首尾对应
}

在SDK中SendMessage和PostMessage处理的消息在MFC对应OnWndMsg和PreTranslateMessage。因此我们可以在这两个函数中像SDK一样处理消息

现在我们在对此进行实践:

//Post
BOOL CDemo01Dlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	switch (pMsg->message)
	{
	case 12138:
	{
		switch (pMsg->wParam)
		{
		case 119:
		{
			MessageBox(L"119", L"Msg", MB_OK);
			break;
		}
		case 120:
		{
			MessageBox(L"120", L"Msg", MB_OK);
			break;
		}
		case 121:
		{
			MessageBox(L"121", L"Msg", MB_OK);
			break;
		}
		default:
			break;
		}
		break;
	}
	default:
		break;
	}
	return CDialogEx::PreTranslateMessage(pMsg);
}


BOOL CDemo01Dlg::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
	// TODO: 在此添加专用代码和/或调用基类
	switch (message)
	{
	case 12138:
	{
		switch (wParam)
		{
		case 119:
		{
			MessageBox(L"119", L"Msg", MB_OK);
			break;
		}
		case 120:
		{
			MessageBox(L"120", L"Msg", MB_OK);
			break;
		}
		case 121:
		{
			MessageBox((WCHAR*)lParam, L"Msg", MB_OK);
			break;
		}
		default:
			break;
		}
		break;
	}
	default:
		break;
	}
	return CDialogEx::OnWndMsg(message, wParam, lParam, pResult);
}
现在我们在模态按钮上进行如上消息的应用
void CDemo01Dlg::OnBnClickedButtonCreateDialog()
{
	//PostMessage(12138, 119, NULL);
	//PostMessage(12138, 120, NULL);
	//PostMessage(12138, 121, L”abc”);

现在我们在模态按钮上进行如上消息的应用

void CDemo01Dlg::OnBnClickedButtonCreateDialog()
{
       //PostMessage(12138, 119, NULL);
       //PostMessage(12138, 120, NULL);
       //PostMessage(12138, 121, L”abc”);
}

由于post消息不阻塞,所以这三个post消息会一起发送给程序,因此这三个消息的执行顺序并不一样正常。但是如果是Send消息,则会顺序执行

注意:对话框只有一个消息循环且只有一个线程。当对话框消息处理函数无法结束时,POST和SEND会把消息发送给消息队列。POST会直接返回,而不是一直等到消息处理的结果。而SEND会等待结果,之后再返回

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

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

相关文章

js 数组使用 map 结构渲染个性字段

上代码: //arr来自服务端的数据 arr arr.map(i>{return {value: i.id,text: i.co_name} }) 服务端返回的原始数据: 处理后的数据:

全局上下文视觉转换器(Global Context Vision Transformers)

摘要 https://arxiv.org/pdf/2206.09959 我们提出了全局上下文视觉转换器(GC ViT),这是一种新颖的架构,旨在提高计算机视觉中的参数和计算利用率。我们的方法利用全局上下文自注意力模块与标准的局部自注意力相结合,以…

Qt WebAssembly 警告:构建套件中未设置编译器

目录 Qt WebAssembly 警告:构建套件中未设置编译器问题解决方法 参考资料 Qt WebAssembly 警告:构建套件中未设置编译器 问题 安装好QT之后构建套件中出现黄色感叹号Qt WebAssembly 警告:构建套件中未设置编译器。 原因是现在你只安装了qt for webassembly的qt的库&#xff…

深度学习-OpenCV运用(2)

文章目录 一、OpenCV介绍二、OpenCV运用1.提取与合并通道2.图片打码3.图片组合与缩放4.图像运算 三、总结 一、OpenCV介绍 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它主要用于实时的图像处理和…

ShareSDK 企业微信

本篇文档主要讲解如何使用企业微信并进行分享和授权。 创建应用 登录企业微信并通过企业认证。选择应用管理 > 应用 >创建应用。编辑应用信息。配置授权登录信息。 以下为创建过程示例,图中信息仅为示例,创建时请按照真实信息填写,否…

Java 入门指南:异常处理(Exception Handling)

异常处理是一种处理运行时错误的机制,是处理运行时错误的有效方法之一,这样可以保留应用程序的常规流程。 Java为异常设计了一套 异常处理机制(Exception Handling),当程序运行过程中发生一些异常情况时,程…

联华证券-美联储降息补贴:额外补贴,美元短期走势或保持稳定

市场进一步确信美联储9月的加息举措,即便对加息幅度的预测并不一致。 当地时间8月23日,美联储主席鲍威尔在Jackson Hole年度会议中发出迄今为止最强烈的降息信号:为避免国内劳动力市场进一步疲弱,美联储打算采取行动,…

Spring(面试篇)

目录 什么是Spring? Spring的两大核心概念 Spring框架的设计目标,设计理念,和核心是什么 Spring的优缺点是什么? Spring由哪些应用场景 Spring由哪些模块组成? Spring框架中都用到了那些设计模式? …

Battery Cycle Life Prediction From Initial Operation Data

这个例子展示了如何使用线性回归(一种监督机器学习算法)预测快速充电锂离子电池的剩余循环寿命。使用基于物理的建模方法预测锂离子电池的循环寿命是非常复杂的,因为不同的操作条件和显著的设备可变性,即使是来自同一制造商的电池。对于这种情况&#xf…

2023高教社杯数学建模国赛C题详细代码 文章 数据教学 保姆级手把手包含文档格式 2024数模国赛教学:蔬菜类商品的自动定价和补货决策

本系列专栏将包括两大块内容 第一块赛前真题和模型教学,包括至少8次真题实战教学,每期教学专栏的最底部会提供完整的资料百度网盘包括:真题、数据、可复现代码以及文章. 第二块包括赛中思路、代码、文章的参考助攻, 会提供2024年高教社国赛各个赛题的全套参考内容(一般36h内更新…

JavaWeb学习——事务管理、AOP学习

目录 一、事务管理 1、事务回顾 2、事务进阶 a、rollbackFor属性 b、propagation属性 二、AOP学习 1、基础了解 2、AOP进阶 一、事务管理 1、事务回顾 事务的概念:事务必须服从ACID原则。ACID指的是原子性(atomicity)、一致性&#xf…

Linux网络编程:多路转接--poll/epoll

1. poll poll也是一种多路转接的方案,解决了select的fd有上限和每次调用都要重新设置关心的fd的问题。 2. poll接口 #include int poll(struct pollfd* fds, nfds_t nfds, int timeout); 参数:fds:可以看成是动态数组/数组/结构体数组 nfds&…

【生日视频制作】一群美女挥手拉蓝横幅条幅AE模板修改文字软件生成器教程特效素材【AE模板】

一群美女挥手拉蓝条横幅生日视频制作教程AE模板修改文字生成器 怎么如何做的【生日视频制作】一群美女挥手拉蓝横幅条幅AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

Ai+若依(系统工具-->表单构建):【02篇】

系统工具 表单构建 介绍 允许用户通过拖放等可视化操作创建表单,比如用来收集数据的表格或调查问卷。 可以自定义表单的各个部分,比如添加不同的输入项和设置验证规则,无需编写代码。 提供了导出数据、导入数据、分享表单和设置权限的功能,方便数据管理和共享。 案例 通…

RoboCopy文件快速拷贝工具

RoboCopy是Windows平台(从Windows Vista/Window 7开始)自带的文件快速拷贝工具,它是xcopy命令工具的升级版,解除了xcopy拷贝文件时4GB的容量限制,同时,又支持多线程、给文件夹制作镜像、复制指定日期的文件等功能。 1 全部拷贝 假设从alice文件夹,全部拷贝到bob文件夹,则…

leetcode 80 删除有序数组中的重复项 II

正文 仍旧使用双指针, 思想与 leetcode 26 删除有序数组中的重复项 一致。只是此时因为要求保留重复元素两次,我们的左侧指针可以从第二个数据开始,且右侧指针需要和两个元素的值进行判断。 class Solution:def removeDuplicates(self, nums…

WPF—资源的使用

资源的使用 资源是可以在应用中的不同位置重复使用的对象。 资源的示例包括画笔和样式。 <Window.Resources><!--定义颜色资源--><SolidColorBrush x:Key"MyBrush" Color"#05E0E9"/><!--定义样式资源--><Style TargetType&quo…

前端技术(五)—— 使用Node.js编写简单的项目

一、 初始化项目 1. 创建项目 ⑴ 新建 api_kjzt_server 文件夹作为项目根目录&#xff0c;并初始化包管理配置文件 并在项目根目录中运行如下的命令&#xff0c;初始化包管理配置文件&#xff1a; npm init -y⑵ 运行如下的命令&#xff0c;安装特定版本的 express npm i e…

企业级WEB应用服务器TOMCAT详解

一、什么是TOMCAT 1.1来源 Tomcat是Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持&#xff0c;最新的Servlet 和JSP 规范总是能…

A Neural Probabilistic Language Model

摘要 统计语言建模的一个目标是学习单词序列的联合概率函数。由于维度的诅咒&#xff0c;这在本质上是困难的:我们建议用它自己的武器来对抗它。在提出的方法中&#xff0c;人们同时学习(1)每个单词的分布式表示&#xff08;词向量&#xff09;(即单词之间的相似性)以及(2)表示…