启用或禁用控制更有效的和有效的方式
下载demo project - 11 Kb
介绍
最近我在做一个项目,在一个对话框上有很多控件。
此对话框可在不同的用户交互和不同的交互上显示一些
此对话框的控件变为启用,有些变为禁用。
为此,我必须基于一些变量来决定要启用哪些控件
或致残。如。
隐藏,收缩,复制Codeif( m_bButton )
{
GetDlgItem( IDC_BUTTON1 )->EnableWindow(TRUE);
GetDlgItem( IDC_BUTTON2 )->EnableWindow(TRUE);
GetDlgItem( IDC_EDIT2 )->EnableWindow(FALSE);
GetDlgItem( IDC_EDIT3 )->EnableWindow(FALSE);GetDlgItem( IDC_COMBO1 )->EnableWindow(FALSE);
GetDlgItem( IDC_COMBO2 )->EnableWindow(FALSE);
}
else if( m_bEdit )
{
GetDlgItem( IDC_BUTTON1 )->EnableWindow(FALSE);
GetDlgItem( IDC_BUTTON2 )->EnableWindow(FALSE);
GetDlgItem( IDC_EDIT2 )->EnableWindow(TRUE);
GetDlgItem( IDC_EDIT3 )->EnableWindow(TRUE);GetDlgItem( IDC_COMBO1 )->EnableWindow(FALSE);
GetDlgItem( IDC_COMBO2 )->EnableWindow(FALSE);
}
else if( m_bCombo )
{
GetDlgItem( IDC_BUTTON1 )->EnableWindow(FALSE);
GetDlgItem( IDC_BUTTON2 )->EnableWindow(FALSE);
GetDlgItem( IDC_EDIT2 )->EnableWindow(FALSE);
GetDlgItem( IDC_EDIT3 )->EnableWindow(FALSE);GetDlgItem( IDC_COMBO1 )->EnableWindow(TRUE);
GetDlgItem( IDC_COMBO2 )->EnableWindow(TRUE);
}
上面的解决方案是好的,但有两个明显的问题,在使用上面的解决方案:
代码复制:有很多代码复制可以启用或禁用各种控件。代码维护:如果将来添加了控件,那么我们必须在启用或禁用控件的所有函数中更新它的状态。我们可能会忘记在某些地方更新它。
更有效的解决这个问题的方法是使用。的bitset
类STL。使用bitset类,我们可以保存一个由若干位组成的序列,
它还提供了一种简洁而有效的方式来为一组项(我们问题中的控件)保留标记。
在演示项目中,有两个命令按钮、两个编辑控件和两个组合框,当用户单击相应的单选按钮时,将启用或禁用它们。最初,所有的控件都是禁用的。当用户点击单选按钮标签为“启用按钮”,然后按钮将被启用和其他控件将保持禁用。其他单选按钮将以类似的方式工作。现在为了解决这个问题,我们将在对话框类中声明一个bitset类的对象,如下所示:复制Codebitset<16> m_bitControls;
记住要包括以下两行来使用bitset类:
隐藏,复制Code#include
using namespace std;
现在为对话框上的六个contols定义macos,如下所示:
隐藏,复制Code#define BUTTON_ONE 0
#define BUTTON_TWO 1
#define EDIT_CTRL_ONE 2
#define EDIT_CTRL_TWO 3
#define COMBO_ONE 4
#define COMBO_TWO 5
上面提到的宏将用作位集对象中的索引值。
现在在初始化列表中初始化bitset对象如下:
隐藏,复制Codem_bitControls(0)
上面的行将设置所有的16位为O。
添加一个成员函数,该函数将根据位集对象的位值启用或禁用控件。该函数代码如下:
隐藏,复制Codevoid CDialogAppDlg::enableORdisableCtrls()
{
GetDlgItem( IDC_BUTTON1 )->EnableWindow(m_bitControls[BUTTON_ONE]);
GetDlgItem( IDC_BUTTON2 )->EnableWindow(m_bitControls[BUTTON_TWO]);
GetDlgItem( IDC_EDIT2 )->EnableWindow(m_bitControls[EDIT_CTRL_ONE]);
GetDlgItem( IDC_EDIT3 )->EnableWindow(m_bitControls[EDIT_CTRL_TWO]);GetDlgItem( IDC_COMBO1 )->EnableWindow(m_bitControls[COMBO_ONE]);
GetDlgItem( IDC_COMBO2 )->EnableWindow(m_bitControls[COMBO_TWO]);
}
现在,在其中一个用于单击单选按钮的处理程序函数中添加以下代码。隐藏,复制Codem_bitControls[BUTTON_ONE] = TRUE;
m_bitControls[BUTTON_TWO] = TRUE;
m_bitControls[EDIT_CTRL_ONE] = FALSE;
m_bitControls[EDIT_CTRL_TWO] = FALSE;
m_bitControls[COMBO_ONE] = FALSE;
m_bitControls[COMBO_TWO] = FALSE;
enableORdisableCtrls();
以上代码将设置第一和第二位,并重置最后四位。在那之后
执行可使能或可使能功能。这段代码将启用两个按钮控件,并禁用两个编辑控件和两个组合
盒子。其他两个处理程序参见本文的代码。
该技术为上述两个问题提供了解决方案:
代码复制:现在只有一个函数拥有禁用控件的代码。代码维护:因为只有一个函数,所以代码维护不是一个大的任务。
本文转载于:http://www.diyabc.com/frontweb/news10660.html
启用或禁用控制更有效的和有效的方式相关推荐
- down 网卡端口周期性的up_Linux 中如何启用和禁用网卡?
启用.禁用网卡有很多种方法.在这篇文章里,我们会介绍我们使用过的最好的 5 种方法. -- Magesh Maruthamuthu(作者) 你可能会根据你的需要执行以下命令.我会在这里列举一些你会用到 ...
- WPF 自定义命令 以及 命令的启用与禁用
自定义命令: 在WPF中有5个命令类(ApplicationCommands.NavigationCommands.EditingCommands.ComponentCommands 以及 M ...
- 禁用计算机服务LanmanServer,[如何]在Windows 10中启用或禁用SMB协议 | MOS86
服务器消息块(SMB)协议基本上是Windows中存在的文件共享协议.它允许应用程序读取/写入文件,并敦促服务器管理器为网络连接的计算机提供服务请求.此协议有三个版本,SMB版本1(SMBv1),SM ...
- Linux 中如何启用和禁用网卡?
#: subject: (How To Enable (UP) And Disable (DOWN) A Network Interface Port (NIC) In Linux?) #: via: ...
- 对警报线程池的警报线程_审核和警报SQL Server作业状态更改(启用或禁用)
对警报线程池的警报线程 In this article, we will talk about how to track enabled or disabled SQL jobs in SQL Ser ...
- 如何在 CentOS 中添加、启用和禁用一个仓库
在基于 RPM 的系统上,例如 RHEL.CentOS 等,我们中的许多人使用 yum 包管理器来管理软件的安装.删除.更新.搜索等. Linux 发行版的大部分软件都来自发行版官方仓库.官方仓库包含 ...
- win10到2008服务器smb协议,如何启用或禁用SMB1文件共享协议在Windows
历史: SMB协议 SMB(Server Message Block)通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议.SM ...
- 服务器虚拟机uefi,为虚拟机启用或禁用 UEFI 安全引导
在支持 UEFI 安全引导的操作系统中,引导软件的每个部分都会进行签名,包括引导加载程序.操作系统内核以及操作系统驱动程序.虚拟机的默认配置包括多个代码签名证书. 一个仅用于引导 Windows 的 ...
- 如何使用 PowerShell 锁定、解锁、启用和禁用 AD 帐户
Active Directory GUI 管理工具,如Active Directory 用户和计算机 (ADUC),非常适合对单个帐户执行操作.但是当您需要处理多个AD帐户时,PowerShell是一 ...
最新文章
- mysql在线教程嵌套_MySQL update嵌套
- R语言可视化:散点图、散点图和折线图(line charts)、3D散点图、旋转3D散点图、气泡图、corrgram包可视化相关性矩阵、马赛克图( Mosaic plots)、hexbin、密度图
- 10474 - Where is the Marble?
- docker-compose 安装方法
- Linux操作系统Ubuntu部署J2EE篇
- windows下部署oracle11,windows下配置oracle11g的dataguard
- deepin桌面为什么那么卡_deepin因NVIDIA显卡造成开机启动问题:卡在开机logo界面+进入桌面鼠标一直转圈...
- UNIX网络编程——fcntl函数
- 使用临界段实现优化的进程间同步对象-原理和实现
- java scheduler_RxJava Scheduler介绍
- 基于C#实现的个人日程管理系统
- 汉王考勤机 二次开发
- Office批量打印助手(Excel 批量打印、Word 批量打印)
- html如何给标题设置边框和底纹,word如何设置文字边框和底纹
- Origin画并列柱状图
- poco常用语法合集
- Hadoop HDFS分布式文件系统原理及应用介绍
- 蚂蚁笔记(Leanote) ubuntu安装教程
- Linux在安装Python时:zipimport.ZipImportError: can‘t decompress data; zlib not available
- 服务器显示器不亮,液晶显示器不亮的原因及维修方法简介【图解】
热门文章
- 如何使用java代码导出word
- oschina为什么绑定手机号总是报错
- [Altium Designer 2020 硬件设计]实战1*嵌入式开发—单片机最小系统原理图设计(基于STM32F103RET6)
- 「react-native」【记】在真机(ios和安卓)上运行example项目AwesomeProject时遇到的问题
- 价值32k!阿里顶级架构师深度解析SpringBoot进阶原理实战手册
- 洛谷 P4212 外太空旅行
- 2. 无门槛学会数据类型与输入、输出函数,滚雪球学 Python
- 2021级新生程序设计班级天梯赛:1-5 天鸟火炮
- LeetCode笔记:Biweekly Contest 38 比赛记录
- linux命令tar解压包