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