MFC程序设计——用button更改静态文本+显示内容并弹出新内容+静态文本动态打开位图

news2025/7/27 3:59:32

目录

一、新建基于对话框的MFC编程项目

二、设计界面

2.设置启动项

2.找到资源视图和Dialog

3.拖入控件

三、创建变量(关联对话框与静态文本)

四、写入控件代码

1.在文本上的应用

2.在图像上的应用

2.1初始化的方法

2.2控件导入的方法

3.控件值类别


一、新建基于对话框的MFC编程项目

使用版本VS2017社区版

菜单栏——新建——项目——(VC++下)MFC项目——(应用程序类型)基于对话框——点完成

命名尽量不要用中文,比如啥静态文本之类的(保不齐后期对dialog对话框操作时会报错)

二、设计界面

2.设置启动项

如果在之前刚写完别的项目不久,那就把目前的项目作为启动项,解决方案资源管理器视图——总的最上面的解决方案"StaticText"右键——属性——启动项目(当前选定内容)

 

2.找到资源视图和Dialog

资源视图在菜单栏——视图——其他窗口——资源视图中打开

界面设计的对话框在资源视图文件下的Dialog中,不是aboutbox另一个IDD_STATICTEXT_DIALOG

双击IDD_STATICTEXT_DIALOG即可打开基于对话框的设计界面

3.拖入控件

在工具箱中拖入static txt 和button

左键选中对应的控件输入内容文字Caption

一个静态文本(写着C++的那个)

两个button按钮(一个写着设置为MFC,一个写着获取内容)

三、创建变量(关联对话框与静态文本)

左键选中C++的静态文本,右键选择添加变量,此时会报错,因为它的ID是IDC_STATIC,只需要把STATIC换成别的字母即可比如TEXT,IDC-TEXT

添加变量之后我们如何找到?或者说是在哪里对我们创建的变量进行了关联?

打开类视图(菜单栏——视图——类视图 可以找到)

选中以C开头,我们命名的项目名称为中间文字,Dlg为结尾的文件,CStaticTextDlg

下方找到CStaticTextDlg::DoDataExchange(如果被隐藏了可以拉出来)

双击CStaticTextDlg::DoDataExchange 可以定位到我们刚添加的变量与对话框的关联代码

void CStaticTextDlg::DoDataExchange(CDataExchange* pDX)//继承类DoDataExchange
{
    CDialogEx::DoDataExchange(pDX);
    //我们的文本名是StaticText,找到类视图-CStaticTextDlg下的DoDataExchange即可定位到这里
    //静态文本的ID名IDC_TEXT和变量名m_text
    DDX_Control(pDX, IDC_TEXT, m_text);//多了这一行代码DoDataExchange关联变量到dialog中

DoDataExchange是将变量名和控件名进行绑定的

要记住我们修改后的C++静态文本的变量名m_text,后续要进行调用关联

四、写入控件代码

看过MFC专栏的前段时间的博文(模态和非模态)的应该知道,双击对应的控件就可以转到相应的控件代码段

1.在文本上的应用

主要是设置和获取内容里面的API,API的概念可以进行百度(我也解释不太清楚)

//设置为MFC button的控件代码
void CStaticTextDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	//设置文本内容
	m_text.SetWindowTextW(TEXT("MFC"));
}

此时点击运行就可以执行把静态文本中的C++更换为MFC

获取内容控件代码

//获取内容button的控件代
//获取文本中的内容,并且弹出这个内容
void CStaticTextDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	//创建一个string类型变量,用于接收传递获取的内容
	CString str;
	//获取内容GetWindowTextW的方法
	m_text.GetWindowTextW(str);
	//显示获取到的内容str,弹出内容
	MessageBox(str);
}

运行截图

2.在图像上的应用

2.1初始化的方法

SetWindowTextW函数可不止能用在更改文本上,还可以用在更改图片上

static txt显示图片的前提是 目标图片是bmp(位图)格式的图片,其他格式的图片不行,可以通过重命名直接把图片后缀名改为.bmp

还有一个注意点就是,要把图片放到项目文件夹下,不然后面读入图片路径会出错

 

拉一个static静态文本稍大一点用于显示图片

同样,改掉图片静态文本里的ID,改为IDC_IMG

添加变量改为名 m_img(访问是权限界定,private,public,procte都可以按照需求改)

这里红色波浪线是因为我们刚改了ID,编译器没反应过来

改图片显示的要求为,不用点击任何控件,图片区域也有一张默认的图片,那么久把图片static txt的代码写到初始化里(当然,也可以不按要求,刚开始啥图也没有空空的,那么就只需要把代码写入控件中,点击控件之后才出现图片)

初始化代码在CStaticTextDlg::OnInitDialog中,同样在CStaticTextDlg类里面

双击OnInitDialog 定位到该函数所在位置

在添加代码的地方,return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE   这段话的前面

	//(1)首先设置空间风格
	m_img.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE);
	//(2)获取bitmap句柄
#define HBMP(filePath, width, height)  (HBITMAP)LoadImage(AfxGetInstanceHandle(), filePath, IMAGE_BITMAP, width, height, LR_LOADFROMFILE | LR_CREATEDIBSECTION)
    //(3)获取控件大小
	CRect rect;
	m_img.GetWindowRect(rect);
	//(4)设置图片
	m_img.SetBitmap(HBMP(TEXT("./img.bmp"), rect.Width(), rect.Height()));

我这里无法初始化图片,可能是因为bmp文件放的位置不对,而且这些初始化代码太长了,个人真的很不喜欢这个方法,更加喜欢(控件导入)动态方法,也利于后续开发项目导入文件啥的

2.2控件导入的方法

动态显示bmp,支持用户手动选择文件导入(但是图片不能太大,如果显示内存不足,则是new申请的内存不够图片用)

//用控件打开图片
void CStaticTextDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	//打开文件 定义四种格式的文件bmp gif jpg tiff
	CString filter;
	filter = "所有文件(*.bmp,*.jpg,*.gif,*tiff)|*.bmp;*.jpg;*.gif;*.tiff| BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TIFF(*.tiff)|*.tiff||";
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter, NULL);


	//按下确定按钮 dlg.DoModal() 函数显示对话框
	if (dlg.DoModal() == IDOK)
	{
		//打开对话框获取图像信息
		CString BmpName = dlg.GetPathName();     //获取文件路径名   如D:\pic\abc.bmp
		CString EntName = dlg.GetFileExt();      //获取文件扩展名
		EntName.MakeLower();                     //将文件扩展名转换为一个小写字符


		if (EntName.Compare(_T("bmp")) == 0)
		{
			//定义变量存储图片信息
			BITMAPINFO *pBmpInfo;       //记录图像细节
			BYTE *pBmpData;             //图像数据
			BITMAPFILEHEADER bmpHeader; //文件头
			BITMAPINFOHEADER bmpInfo;   //信息头
			CFile bmpFile;              //记录打开文件


			//以只读的方式打开文件 读取bmp图片各部分 bmp文件头 信息 数据
			if (!bmpFile.Open(BmpName, CFile::modeRead | CFile::typeBinary))
				return;
			if (bmpFile.Read(&bmpHeader, sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
				return;
			if (bmpFile.Read(&bmpInfo, sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
				return;
			pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
			//为图像数据申请空间
			memcpy(pBmpInfo, &bmpInfo, sizeof(BITMAPINFOHEADER));
			DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;
			pBmpData = (BYTE*)new char[dataBytes];
			bmpFile.Read(pBmpData, dataBytes);
			bmpFile.Close();

			//显示图像
			CWnd *pWnd = GetDlgItem(IDC_IMG); //获得pictrue控件窗口的句柄
			CRect rect;
			pWnd->GetClientRect(&rect); //获得pictrue控件所在的矩形区域
			CDC *pDC = pWnd->GetDC(); //获得pictrue控件的DC
			pDC->SetStretchBltMode(COLORONCOLOR);
			StretchDIBits(pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0,
				bmpInfo.biWidth, bmpInfo.biHeight, pBmpData, pBmpInfo, DIB_RGB_COLORS, SRCCOPY);
			delete pBmpInfo;
			delete pBmpData;
		}
	}
}

 

3.控件值类别

之前我们用到的控件类别都是  控件(control),现在我们来试一下把控件本身变为值(value)类别

给它添加变量,改类别为:值(value)  改名字为:m_value

可是改不了控件类型,老一点的版本可以把非文本的控件比如button改为值类型,新版(比如2017似乎不行)

 所以呢,就只能用static来代替实验值类型了

改ID,添加值类型变量

 

 

实现点击值就更换另一个内容显示并且弹出新内容

 button是真不能改为值类型,与之对应的SetWindowTextW方法也用不了了,所以,此案例,败,后续找到解决办法在评论区更新

 MFC专栏之后的案例博文就没有那么详细了,比如类视图资源视图这些在哪儿找,dialog怎么找,也不会再重复赘述了,讲流程就可以了

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

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

相关文章

TSC TTP244Pro 打码机出现的问题及解决方案

背景: 最近在使用TSC的TTP 244 Pro 打码机的过程中,出现了几个小问题,最后请教了专业的人员才解决了问题,现把需要注意的点记录如下: 准备: 先去TSC的** 官网 **上找关于适用于你的打码机和使用环境的驱…

数据结构(高阶)—— AVL树

目录 一、AVL树的基本概念 二、AVL树的结点定义 三、AVL树的插入 四、AVL树的旋转 1. 右单旋 2. 左单旋 3. 右左双旋 4. 左右双旋 五、AVL树的验证 六、AVL树的性能 七、源代码 一、AVL树的基本概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或…

CXL 2.0 Device配置空间寄存器组成

目录 1 配置空间 1.1 PCI Power Management Capability Structure 1.2 PCI Express Capability Structure 2 扩展配置空间 2.1 PCIe DVSEC for CXL Device 2.2 GPF DVSEC for CXL Devices 2.3 PCIe DVSEC for Flex Bus Port 2.4 Register Locator DVSEC CXL设备配置空间…

ThinkPHP架构

文章目录一、架构总览1.1、有关常用的一些概念入口文件应用模块控制器操作模型视图驱动行为命名空间【全限定类名】1.补充二、生命周期三、入口文件四、URL访问五、模块设计六、命明空间七、自动加载八、Traits引入九、API友好一、架构总览 ThinkPHP5.0应用基于MVC(…

前后端分页插件

PageHelper 是一个 MyBatis 的分页插件,支持多种数据库,可查看官网&#xff0c;负责将已经写好的 SQL 语句&#xff0c;进行SQL分页加工。无需你自己去封装以及关心 SQL 分页等问题&#xff0c;支持多种分页方式,如从第0或第一页开始, 使用很方便。 添加依赖 <dependency&…

线代 | 【提神醒脑】自用笔记串联二 —— 向量组 · 线性方程组 · 特征值与特征向量

本文总结参考于 kira 2023 线代提神醒脑技巧班。 笔记均为自用整理。加油!ヾ(◍∇◍)ノ゙ 四、向量组 4.1、向量组的线性相关性 ----------------------------------------------------------------------------------------------------------…

Linux 软链接 与 硬链接 的区别

Linux 软链接 与 硬链接 的区别 1、概念 ​  链接文件&#xff1a;是 Linux 操作系统中的一种文件&#xff0c;主要用于解决文件的共享使用问题&#xff0c;而链接的方式分为两种——软链接和硬链接。 ​  inode&#xff1a;是文件系统中存储文件元信息&#xff08;文件的…

Auddly Music Server的编译和安装

本文始于 2021 年 11 月&#xff0c;已经忘记了是什么原因一直没发&#xff0c;这次基本上全部重写了一遍&#xff0c;除了官方的图&#xff0c;所有图片都是重新截取的&#xff1b; 什么是 auddly &#xff1f; auddly 是一款自托管音乐流应用程序。 什么是 auddly-server &am…

模拟实现ATM系统——Java

目录 一、内容简介 二、基本流程 三、具体步骤 1.定义Account类 2.菜单栏 3.账户注册 (1)根据卡号查询账户信息 (2)生成随机卡号 (3)注册账户 4.账户登录 (1)验证码 (2)登录 5.账户展示界面 6.用户操作 (1)查询账户 (2)存款 (3)取款 (4)转账 (5)修改密码 …

旋转的骰子(二)

1.动画——旋转的骰子 上一次我们做了一个旋转的骰子(参看第2讲),这次我们想要点击按钮,让骰子旋转到特定的点数停下来! 2.分析需求——庖丁解牛 a.立方体特定的朝向

LiveData源码分析

先放整理流程图&#xff1a; 1.postValue调2次只触发1次&#xff1f; postValue本质是把新值保存到LiveData的mPendingData成员变量里&#xff0c;版本号1&#xff0c;把执行Runnable post到主线程&#xff0c;在主线程setValue。 多次调用会更新mPendingData的值&#xff0c…

opencv的极线几何

一、理论介绍 当我们使用针孔相机拍摄图像时&#xff0c;我们会丢失一个重要的信息&#xff0c;即图像的深度。一个解决方案如我们的眼睛的方式使用两个相机&#xff08;两只眼睛&#xff09;&#xff0c;这就是所谓的立体视觉。 PO1O2为极平面&#xff0c;l1和l2为极线,e1和…

基于webrtc的数据传输研究总结

什么是webrtc WebRTC (Web Real-Time Communications) 是一项实时通讯技术&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立浏览器之间点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和&#xff08;或&…

最新阿里云ECS服务器S6/C6/G6/N4/R6/sn2ne/sn1ne/se1ne处理器CPU性能详解

阿里云ECS服务器S6/C6/G6/N4/R6/sn2ne/sn1ne/se1ne处理器CPU性能怎么样&#xff1f;阿里云服务器优惠活动机型有云服务器S6、计算型C6、通用型G6、内存型R6、云服务器N4、云服务器sn2ne、云服务器sn1ne、云服务器se1ne处理器CPU性能详解及使用场景说明。 1、阿里云服务器活动机…

全局唯一ID

文章目录前言MongoDB ObjectIdTwitter SnowflakeUUID前言 基于数据库设置其实初始值&#xff0c;以及增量步长。基于ZK,Redis,改良雪花集中式服务生成&#xff0c;远程调用获取id。基于并行空间划分&#xff0c;Snowflake&#xff08;8Byte字节64bit位&#xff09;&#xff0c…

供应化学试剂mPEG-Azide,mPEG-N3,甲氧基-聚乙二醇-叠氮,CAS:89485-61-0

1、名称 英文&#xff1a;mPEG-Azide&#xff0c;mPEG-N3 中文&#xff1a;甲氧基-聚乙二醇-叠氮 2、CAS编号&#xff1a;89485-61-0 3、所属分类&#xff1a;Azide PEG Methoxy PEG 4、分子量&#xff1a;可定制&#xff0c;甲氧基-聚乙二醇-叠氮 5k、甲氧基-PEG-叠氮 10…

Higress 实战: 30行代码写一个 Wasm Go 插件

前言 在11月15号的直播 《Higress 开源背后的发展历程和上手 Demo 演示》中&#xff0c;为大家演示了 Higress 的 Wasm 插件如何面向 Ingress 资源进行配置生效&#xff0c;本文对当天的 Demo 进行一个回顾&#xff0c;并说明背后的原理机制。 本文中 Demo 运行的前提&#x…

PPOCR车牌定位模型推理后处理优化研究

综述 最近在研究基于PPOCR算法的车牌识别&#xff08;LPR&#xff09;&#xff0c;部署模型后发现之前关于OCR文本定位的后处理策略在车牌识别中存在定位精度不够高&#xff0c;文本框偏移的问题&#xff0c;如&#xff1a; 经分析发现是之前的OCR后处理策略存在一定局限&am…

java刷题day 03

选择题&#xff1a; 解析&#xff1a; 父类private的成员变量&#xff0c;根据权限修饰符的访问控制范围&#xff0c;只有在类内部才能被访问&#xff0c;就算是他的子类&#xff0c;也不能访问。这里如果将Person p new Child();改成 Person p new Person();代码依然无法通过…

乐趣国学—品读《弟子规》中的“余力学文”之道

文章目录余力学文不力行 但学文 长浮华 成何人但力行 不学文 任己见 昧理真读书法 有三到 心眼口 信皆要方读此 勿慕彼 此未终 彼勿起宽为限 紧用功 工夫到 滞塞通心有疑 随札记 就人问 求确义房室清 墙壁净 几案洁 笔砚正墨磨偏 心不端 字不敬 心先病列典籍 有定处 读看毕 还原…