启用或禁用控制更有效的和有效的方式
下载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是一 ...
最新文章
- R删除冗余行数据基于dplyr包
- 各种操作系统ping时的TTL值
- 在OpenShift上将JMS与JBoss A-MQ结合使用。 从远程客户端和加密中学到的经验教训。...
- 网易云音乐下线所有明星艺人榜单,对数字专辑及单曲限购
- manjaro配置zsh和oh-my-zsh
- Kafka学习之二 Kafka安装和使用
- Linux中的sed命令
- 【VUE】npm run dev 报错 spawn cmd ENOENT
- 常用关系型数据库管理系统
- Win11录屏数据保存在哪里?Win11录屏数据保存的位置
- HDU P4699 Editor
- DTOJ #1079. 多项式展开 mult
- 用C#获取系统中的临时文件夹或windows安装文件夹
- 关于前端架构的过去、现在与未来
- 【论文笔记】Question Answering with Subgraph Embeddings
- java集合框架学习笔记
- 第十三届蓝桥杯 2022年省赛真题(Java 大学C组)
- 磁盘管理关于磁盘的概念
- 10分钟带你彻底搞懂微内核架构
- 计算机基础——5.2 图像与图形