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

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

原文地址:https://www.cnblogs.com/Dincat/p/13473227.html