SegeX MemDialog:封装好的内存对话框(非资源对话框)说明

news2024/12/23 20:29:30

----哆啦刘小洋 原创,转载需说明出处 2022-12-27

SegeX MemDialog

    • 1 简介
    • 2 源文件清单
    • 3 快速测试
    • 4 实现基本原理
    • 5 主要功能
    • 6 使用方法
      • 6 .1 简单界面
      • 6.2 复杂界面

1 简介

SegeX组件之一:SegeX MemDialog,应用级内存对话框封装类。源码首次公开。使用该类不需要在VC中创建资源,具有如下主要功能:1.完备的内存对话框封装,功能齐全;2.提供AddButton…等标准函数添加各种对话框控件;3.无需编写消息处理,使用控件状态机制获取对话框结束后不同控件的状态、内容等,即写即用;4.支持模态和非模态方式打开对话框。支持VC2012及以上。

源代码附后。

2 源文件清单

1)SgxMemDialog.h
2)SgxMemDialog.cpp

3 快速测试

1)将SgxMemDialog.h 、SgxMemDialog.cpp复制到工程指定目录。
2)在要使用的文件中增加头文件:#include “SgxMemDialog.h”
3)在需要测试的代码点加一行:CSgxMemDialog::Example();

4 实现基本原理

VC中可以利用资源编辑器方便的创建对话框及上面的各种控件,功能强大。只有一个缺点:这种资源方式一定程度破坏了封装性,且不方便移植。
在实际应用中,有时需要轻量化的使用对话框,但使用数量极大,比如参数对话框,一个程序里可能有几十个不同的参数集合。这时使用内存对话框是很好的选择。MFC提供了内存对话框的创建方式,典型的函数有CreateIndirect、InitModalIndirect,但使用起来不是很方便,仅仅用MFC提供的方式,还不如使用资源类型的对话框。
SegeX MemDialog对MFC中的内存对话框创建、使用进行了封装,原理很简单,但将几乎所有繁琐的工作都帮你做好了,你只需要简单几行代码就可以在很小的代码范围做好工作,仅比AfxMessageBox函数多写几句而已。例如下图所示的简单对话框只需要不到10行代码就可以完成,且代码仅限于使用点,完美解决了封装性的问题。

在这里插入图片描述

5 主要功能

1)支持模态和非模态方式打开对话框。
2)无需消息处理。组件采用控件状态机制获取对话框结束后不同控件的状态、内容。
3)支持CButton、CEdit、CComboBox、CListBox、CCheckButton、CRadioButton、CStatic等几个常用控件。
4)即写即用。

6 使用方法

首先,该组件是针对MFC Windows桌面应用程序,不支持控制台程序。因此假定你的工程是MFC Windows桌面应用程序,例如对话框程序。
1)将SgxMemDialog.h 、SgxMemDialog.cpp复制到工程指定目录。
2)在要使用的文件中增加头文件:#include “SgxMemDialog.h”
3)SgxMemDialog.cpp会用到预编译头文件,如果这里出错,请改为你的工程预编译头文件。(vc6一般是stdafx.h,而VC2022是pch.h)
4)然后可以开始使用了。详见后续不同的使用场景。

6 .1 简单界面

以上图为例,在你程序中需要用到的地方执行如下代码则可得到上面的对话框:

void test_SgxMemDialog_Simple()
{
	//使用给定大小的对话框
	CSgxMemDialog dlg(180, 100);
	dlg.SetWindowTitle(_T(" SegeX - CT"));
	dlg.AddStatic(1000, //控件资源号,只要在本窗口范围不重复即可。
				  "数据文件的钻孔名称与当前排列不同。\r\n Yes:忽略数据文件中的钻孔名称\r\n No:取消"
				  , TRUE, TRUE, 10, 15, 160, 40);
	dlg.AddCheckButton(1001 //控件ID,只要在本窗口范围不重复即可。
				  , "调换两孔", 0, FALSE, TRUE, TRUE, 15, 45);
	dlg.AddButton(IDOK //MFC内定资源号。
				  , "Yes", TRUE, TRUE, TRUE, 25, 70);
	dlg.AddButton(IDCANCEL //MFC内定资源号。
				  , "No", FALSE, TRUE, TRUE, 95, 70);
	if (dlg.DoModal() == IDOK)
	{
		//状态机制获取是否选中了多选框
		int n = dlg.GetCtrlStatus(1001)->m_nStatus;
		if (n != 0)//多选框被选中
			AfxMessageBox(_T("选中多选框"));
		else
			AfxMessageBox(_T("未选中多选框"));
	}
	else
	{
		AfxMessageBox(_T("选择了取消"));
	}
}

使用到的方法有:
AddStatic:添加一个Static控件;
AddCheckButton:添加一个Check按钮;
AddButton:添加一个命令按钮;

是否选中了多选框,是根据dlg.GetCtrlStatus(1001)->m_nStatus的状态来确定。其中参数1001是我们添加多选框时给定的控件ID。

6.2 复杂界面

下图为较复杂的对话框使用情况:

在这里插入图片描述

对话框中常用控件CButton、CEdit、CComboBox、CListBox、CCheckButton、CRadioButton、CStatic都有了。需要解决的问题有两个:

1)如何通过代码初始化控件,变成上图的样式;
2)对话框结束(甚至在非模态下未结束)时,如何得到控件变化后的状态。

详见代码:

void test_SgxMemDialog_Normal()
{
	//使用缺省大小的对话框
	CSgxMemDialog dlg1(0, 0); // 0: 自动计算

	//第1行
	dlg1.AddStatic(IDC_STATIC //控件ID
					, "请输入要输入的字符串1:" //窗口文本
					, TRUE	//可见性
					, TRUE	//使能性
					, 0		//x 位置 0:本行自动位置, -1:换行
					, 0		//y 位置 0:本行自动位置, -1:换行
					, 100	//宽度,0:缺省
					, 0		//高度,0:缺省
					);
	dlg1.AddEdit(1001, "Edit1", TRUE, TRUE, 0, 0, 150, 0);

	//第2行
	dlg1.AddStatic(IDC_STATIC, "请输入要输入的字符串2:", TRUE, TRUE
					, -1	//x 位置 0:本行自动位置, -1:换行
					, -1	//y 位置 0:本行自动位置, -1:换行
					, 100, 0);
	dlg1.AddEdit(1002, "Edit2", TRUE, TRUE, 0, 0, 150, 0);

	//第3行,使用ComboBox要注意,它需要一定高度,但实际上没有占用那么高,因此下一行一般需要向上偏移
	dlg1.AddComboBox(1003, TRUE
					, "王一|李二|张三" //选项
					, 1		 //当前选项
					, TRUE, TRUE, -1, -1, 100, 80);

	//第4行
	dlg1.AddListBox(1004
					, "王一|李二|张三" //选项
					, 1		 //当前选项
					, TRUE, TRUE, 0, 0, 150, 60);


	//第5行
	dlg1.AddCheckButton(1005 //控件ID,只要在本窗口范围不重复即可。
		, "选择1", 0, FALSE, TRUE, TRUE, -1, -15, 0, 10);
	dlg1.AddCheckButton(1006 //控件ID,只要在本窗口范围不重复即可。
		, "选择2", 1, FALSE, TRUE, TRUE, 0, 0, 0, 10);
	dlg1.AddCheckButton(1007 //控件ID,只要在本窗口范围不重复即可。
		, "选择3", 1, FALSE, TRUE, TRUE, 0, 0, 0, 10);


	//第6行
	dlg1.AddRadioButton(1008 //控件ID,只要在本窗口范围不重复即可。
		, "option1", 0, FALSE, TRUE, TRUE, -1, -1, 50, 10);
	dlg1.AddRadioButton(1009 //控件ID,只要在本窗口范围不重复即可。
		, "option2", 1, FALSE, TRUE, TRUE, 0, 0, 50, 10);
	dlg1.AddRadioButton(1010 //控件ID,只要在本窗口范围不重复即可。
		, "option3", 0, FALSE, TRUE, TRUE, 0, 0, 50, 10);

	//第7行
	dlg1.AddButton(IDOK, "OK", TRUE, TRUE, TRUE, 130, -1);
	dlg1.AddButton(IDCANCEL, "Cancel");
    
	if (dlg1.DoModal() == IDOK)
	{
		//获取每个控件的状态
		CString sResult(_T("对话框控件状态:"));
		sResult += _T("\r\nEidt1 文本:") + dlg1.GetCtrlStatus(1001)->m_sText;
		sResult += _T("\r\nEidt2 文本:") + dlg1.GetCtrlStatus(1002)->m_sText;
		CString s;
		s.Format(_T("%d"), dlg1.GetCtrlStatus(1003)->m_nStatus);
		sResult += _T("\r\nCombox 选择文本: ") + dlg1.GetCtrlStatus(1003)->m_sText + _T(",  索引号:") + s;
		s.Format(_T("%d"), dlg1.GetCtrlStatus(1004)->m_nStatus);
		sResult += _T("\r\nList 选择文本: ") + dlg1.GetCtrlStatus(1004)->m_sText + _T(",  索引号:") + s;		
		sResult += _T("\r\nCheck1 选择:") + CString(dlg1.GetCtrlStatus(1005)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));
		sResult += _T("\r\nCheck2 选择:") + CString(dlg1.GetCtrlStatus(1006)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));
		sResult += _T("\r\nCheck3 选择:") + CString(dlg1.GetCtrlStatus(1007)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));
		sResult += _T("\r\nRadio1 选择:") + CString(dlg1.GetCtrlStatus(1008)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));
		sResult += _T("\r\nRadio2 选择:") + CString(dlg1.GetCtrlStatus(1009)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));
		sResult += _T("\r\nRadio3 选择:") + CString(dlg1.GetCtrlStatus(1010)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));

		AfxMessageBox(sResult);
	}
	else
	{
		AfxMessageBox(_T("选择了取消"));
	}
}

使用到的方法有:
AddStatic:添加一个Static控件;
AddCheckButton:添加一个Check按钮;
AddRadioButton:添加一个Radio按钮;
AddButton:添加一个命令按钮;
AddEdit:添加一个文本控件;
AddComboBox:添加一个组合框按钮;
AddListBox:添加一个列表框按钮;

具体使用可参照上述代码,并可以方便的获取每个控件的状态。
在这里插入图片描述

下载完整的代码资源。本资源完全免费,只需要0积分。如果你觉得还好,请点个赞支持。

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

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

相关文章

IEC 60598-2-22-2021 灯具 第2-22部分- 特殊要求-应急照明灯具.

2021年12月6日,国际电工委员会发布标准IEC 60598-2-22:2021《灯具-第2-22部分:特殊要求-应急照明灯具》。IEC 60598-2-22:2021标准以IEC 60598-2-22:2021 RLV标准的形式提供,包含国际标准及其红线版本,内容显示了与前一版本相比对…

tensorflow06——正则化缓解过拟合

正则化主要是在损失函数中引入了第二个部分,模型复杂度,具体就是对w参数赋予了权值,并求和,再乘上一个超参数。 (利用给w加上权值,弱化训练数据的噪声) 大概可以理解为这个意思假设模型有两个参…

从0-1搭建流媒体系统之ZLMediaKit 安装、运行、推流、拉流

音视频开发系列 文章目录音视频开发系列前言一、ZLMediaKit是什么?二、使用过程1.编译、安装、运行2.推流、拉流总结前言 目前、比较有名的流媒体服务器有ZLMediaKit、srs、live555、eadydarwin等。因为srs是单线程服务、对于多核服务器的支持需要通过部署多个服务…

蓝牙学习七(MAC地址)

1.简介 一个BLE设备,可以使用两种类型的地址(一个BLE设备可以同时具备两种地址):Public Device Address(公共设备地址)和Random Device Address(随机设备地址)。而Random Device Add…

如何用 java 实现【二叉搜索树】

文章目录搜索树概念1. 查找操作2. 插入操作3. 删除操作4. 以上三种操作的测试5. 性能分析搜索树概念 二叉搜索树 又称 二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的 左 子树 不为空,则 左 子树上所有节点的值…

自定义神经网络入门-----Pytorch

文章目录目标检测的相关评价指标IoUmAP正例和负例准确率P召回率R准确率ACCP-R曲线--APnn.Module类全连接层感知机类使用nn.Sequential进行构造使用randn函数进行简单测试损失函数nn.functionalnn.optim模型处理网络模型库torchvision.models模型Fine-tune和save参考目标检测的相…

【STM32F4系列】【HAL库】【自制库】模拟IIC从机

介绍 本项目是利用GPIO模拟I2C的从机 网上常见的是模拟I2C主机 本项目是作为一个两个单片机之间低速通信的用法 协议介绍请看,传送门 模拟主机请看这里 从机 功能 实现I2C从机端读写寄存器 编程思路 I2C的从机实现比起主机来麻烦一些 因为SCL的时序是由主机发送,从机需…

【nowcoder】笔试强训Day12

目录 一、选择题 二、编程题 2.1二进制插入 2.2 查找组成一个偶数最接近的两个素数 一、选择题 1.以下方法,哪个不是对add方法的重载? public class Test {public void add( int x,int y,int z){} } A. public int add(int x,int y,float z){return 0;} B.…

Go语言设计与实现 -- WaitGroup, Once, Cond

WaitGroup 我们可以通过 sync.WaitGroup 将原本顺序执行的代码在多个 Goroutine 中并发执行,加快程序处理的速度。 我们来看一下sync.WaitGroup的结构体: type WaitGroup struct {//保证WaitGroup不会被开发者通过再赋值的方式复制noCopy noCopy// 64-…

重学redux之Redux-Thunk高级使用(三)

这是第三篇了,哥们,如果没看过前两篇,可以去看看之前的两篇,有基础的可以直接看,不多说,直接开讲 默认情况下,Redux 的动作是同步调度的,对于任何需要与外部 API 通信或执行副作用的应用程序来说都是一个问题。 Redux 允许中间件位于被分派的动作和到达 reducer 的动…

抖音本地生活的蓬勃发展,离不开服务商的推波助澜

抖音本地生活,已经势不可挡01 抖音公布本地生活成绩单,交易额增长30倍抖音经过6年时间的演变,产品功能日益丰富,已经从内容消费,延续到线上购物、线下团购等领域,从最初的记录美好生活,成为一种…

统计分析工具-FineReport配置SQL Server外接数据库(2)

1. 配置外接数据库 1.1 外接数据库配置入口 外接数据库的配置入口,有三种形式: 1)超级管理员第一次登录数据决策系统时,即可为系统配置外接数据库。如下图所示: 2)对于使用内置数据库的系统,管…

站点能源低碳目标网,助力网络碳中和 | 华为发布站点能源十大趋势

2022年12月29日,华为今天举办站点能源十大趋势发布会并重磅发布白皮书。发布会上,华为站点能源领域总裁尧权全面解读了能源数字化、低碳网络、站点供电绿色化等站点能源十大趋势。 尧权表示,2022年是不平凡的一年,全球能源危机背…

十、通过网络服务将esp8266引脚状态显示在网页中

ESP8266在服务器模式运行时,我们可以使用浏览器来显示它的引脚状态。 1、实现目标 学习如何通过esp8266建立基本网站,在该网站上实时显示esp8266的引脚值。 2、原理图 FLASH按键与D3引脚连接,可以通过FLASH按键改变D3引脚的电平。当没有按…

中型企业适合用什么样的CRM管理软件,求推荐?

中型企业适合用什么样的CRM管理软件,求推荐? CRM管理软件是现代企业必不可少的管理软件之一,很多企业都会选择CRM管理软件来经营客户资源,但能够精准地选择到适合自己企业的CRM管理软件则是困难的。 中型企业需要与自己业务流程…

数据可视化之finebi和tableau电力系统分析实现对比

通过一个电力系统简单案例,尝试实际执行finebi和Tableau数据可视化设计的各项基本步骤,以熟悉Tableau和finebi数据可视化设计技巧,提高大数据可视化应用能力。 一、工具/准备工作 在开始本实验之前,请认真阅读课程的相关内容。 …

写给小白的TensorFlow的入门课

文章目录前言学习AI的必要性和业务的关系最简单的例子要做什么?数据图形化展示构建计算图形计算图形最小化误差MacOS 中配置运行环境安装验证安装简单模型训练识别数字图片的模型训练Softmax Regression算法大概步骤大致算法实现结语参考链接前言 深度学习就是从大…

抖音电商发布2023年食品健康行业8大趋势,新减负、新养生等成为关键词

2022抖音电商食品健康峰会暨年货盛典在杭州成功举行。抖音电商食品健康行业还联合欧睿共同发布了《2023年度食品健康行业趋势洞察报告》。图片来源:抖音电商抖音电商食品健康行业负责人白华在会上透露,过去一年,抖音电商食品健康行业呈现出有…

虚拟机数据库改密码ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘

注:原因为MySql 8.0.11 换了新的身份验证插件(caching_sha2_password), 原来的身份验证插件为(mysql_native_password)。而客户端工具Navicat Premium12 中找不到新的身份验证插件(caching_sha2_password&a…

Java实现多线程

目录 基本概念 1、程序、进程、线程 2、使用线程的优点 3、线程的分类 4、线程的生命周期 多线程的实现方法 1、继承Thread类 2、实现Runnable接口 3、实现Callable接口 4、使用线程池 线程同步 1、同步代码、同步方法 2、同步机制中的锁 3、锁(Lock&…