下载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

启用或禁用控制更有效的和有效的方式相关推荐

  1. down 网卡端口周期性的up_Linux 中如何启用和禁用网卡?

    启用.禁用网卡有很多种方法.在这篇文章里,我们会介绍我们使用过的最好的 5 种方法. -- Magesh Maruthamuthu(作者) 你可能会根据你的需要执行以下命令.我会在这里列举一些你会用到 ...

  2. WPF 自定义命令 以及 命令的启用与禁用

    自定义命令:     在WPF中有5个命令类(ApplicationCommands.NavigationCommands.EditingCommands.ComponentCommands 以及 M ...

  3. 禁用计算机服务LanmanServer,[如何]在Windows 10中启用或禁用SMB协议 | MOS86

    服务器消息块(SMB)协议基本上是Windows中存在的文件共享协议.它允许应用程序读取/写入文件,并敦促服务器管理器为网络连接的计算机提供服务请求.此协议有三个版本,SMB版本1(SMBv1),SM ...

  4. Linux 中如何启用和禁用网卡?

    #: subject: (How To Enable (UP) And Disable (DOWN) A Network Interface Port (NIC) In Linux?) #: via: ...

  5. 对警报线程池的警报线程_审核和警报SQL Server作业状态更改(启用或禁用)

    对警报线程池的警报线程 In this article, we will talk about how to track enabled or disabled SQL jobs in SQL Ser ...

  6. 如何在 CentOS 中添加、启用和禁用一个仓库

    在基于 RPM 的系统上,例如 RHEL.CentOS 等,我们中的许多人使用 yum 包管理器来管理软件的安装.删除.更新.搜索等. Linux 发行版的大部分软件都来自发行版官方仓库.官方仓库包含 ...

  7. win10到2008服务器smb协议,如何启用或禁用SMB1文件共享协议在Windows

    历史: SMB协议 SMB(Server Message Block)通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议.SM ...

  8. 服务器虚拟机uefi,为虚拟机启用或禁用 UEFI 安全引导

    在支持 UEFI 安全引导的操作系统中,引导软件的每个部分都会进行签名,包括引导加载程序.操作系统内核以及操作系统驱动程序.虚拟机的默认配置包括多个代码签名证书. 一个仅用于引导 Windows 的 ...

  9. 如何使用 PowerShell 锁定、解锁、启用和禁用 AD 帐户

    Active Directory GUI 管理工具,如Active Directory 用户和计算机 (ADUC),非常适合对单个帐户执行操作.但是当您需要处理多个AD帐户时,PowerShell是一 ...

最新文章

  1. mysql在线教程嵌套_MySQL update嵌套
  2. R语言可视化:散点图、散点图和折线图(line charts)、3D散点图、旋转3D散点图、气泡图、corrgram包可视化相关性矩阵、马赛克图( Mosaic plots)、hexbin、密度图
  3. 10474 - Where is the Marble?
  4. docker-compose 安装方法
  5. Linux操作系统Ubuntu部署J2EE篇
  6. windows下部署oracle11,windows下配置oracle11g的dataguard
  7. deepin桌面为什么那么卡_deepin因NVIDIA显卡造成开机启动问题:卡在开机logo界面+进入桌面鼠标一直转圈...
  8. UNIX网络编程——fcntl函数
  9. 使用临界段实现优化的进程间同步对象-原理和实现
  10. java scheduler_RxJava Scheduler介绍
  11. 基于C#实现的个人日程管理系统
  12. 汉王考勤机 二次开发
  13. Office批量打印助手(Excel 批量打印、Word 批量打印)
  14. html如何给标题设置边框和底纹,word如何设置文字边框和底纹
  15. Origin画并列柱状图
  16. poco常用语法合集
  17. Hadoop HDFS分布式文件系统原理及应用介绍
  18. 蚂蚁笔记(Leanote) ubuntu安装教程
  19. Linux在安装Python时:zipimport.ZipImportError: can‘t decompress data; zlib not available
  20. 服务器显示器不亮,液晶显示器不亮的原因及维修方法简介【图解】

热门文章

  1. 如何使用java代码导出word
  2. oschina为什么绑定手机号总是报错
  3. [Altium Designer 2020 硬件设计]实战1*嵌入式开发—单片机最小系统原理图设计(基于STM32F103RET6)
  4. 「react-native」【记】在真机(ios和安卓)上运行example项目AwesomeProject时遇到的问题
  5. 价值32k!阿里顶级架构师深度解析SpringBoot进阶原理实战手册
  6. 洛谷 P4212 外太空旅行
  7. 2. 无门槛学会数据类型与输入、输出函数,滚雪球学 Python
  8. 2021级新生程序设计班级天梯赛:1-5 天鸟火炮
  9. LeetCode笔记:Biweekly Contest 38 比赛记录
  10. linux命令tar解压包