----哆啦刘小洋 原创,转载需说明出处 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积分。如果你觉得还好,请点个赞支持。