• 启用或禁用控制更有效的和有效的方式


    介绍 最近我在做一个项目,在一个对话框上有很多控件。 此对话框可在不同的用户交互和不同的交互上显示一些 此对话框的控件变为启用,有些变为禁用。 为此,我必须基于一些变量来决定要启用哪些控件 或致残。如。 隐藏,收缩,复制Code

    if( 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类的对象,如下所示:复制Code

    bitset<16> m_bitControls;

    记住要包括以下两行来使用bitset类: 隐藏,复制Code

    #include <bitset>
    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对象如下: 隐藏,复制Code

    m_bitControls(0)

    上面的行将设置所有的16位为O。 添加一个成员函数,该函数将根据位集对象的位值启用或禁用控件。该函数代码如下: 隐藏,复制Code

    void 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]);
    }

    现在,在其中一个用于单击单选按钮的处理程序函数中添加以下代码。隐藏,复制Code

    m_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

  • 相关阅读:
    使用jsonEditor打造一个复杂json编辑器
    【原创】一次“诡异”的容器Unix Socket通信问题分析
    【原创】Ingress-Nginx-Controller的Metrics监控源码改造简析
    IDEA+DevTools实现热部署功能
    ElementUI按需引入各种组件
    vue-cli4.0更新后怎样将eslint关闭
    Mysql修改字段名、修改字段类型
    博客搬家CSDN
    如何优雅的处理Restful
    java系列之注解
  • 原文地址:https://www.cnblogs.com/Dincat/p/13473227.html
Copyright © 2020-2023  润新知