Enabling or Disabling controls in more effective and efficient way
I was doing a project in which there were many controls on a dialog box. This dialog box could display for different user interactions. At different interactions some controls on the dialog box become enable and some become disable. To do the enabling and disabling, I make a decision based on some variable which determines the controls that are going to be enable or disable. e.g.
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);
}
The above solution is fine; however, there are twoO obvious issues:
A more effective solution to this problem can be achieved by using the “bitset class” of STL. Using the “bitset class” a sequence consisting of a number of bits cna be saved. This provides a compact and effective way of keeping flags for a set of items (controls in our problem).
In the demo project, there are two command buttons, two edit controls and two combo boxes that are going to be enable or disable when the user click the corresponding radio buttons. Initially all the controls are disabled. When a user click the radio button labeled “Enable Buttons” then the Buttons are going to be enabled and the other controls will remain disabled. Other radio buttons will work in a similar manner. To solve this problem we are going to declare an object of bitset class in dialog class as follows:
bitset<16> m_bitControls;
Remember to include following two lines to use bitset class:
#include <bitset>
using namespace std;
Now define macos for the six contols on the dialog box as follows:
#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
Above mentioned macros will use as an Index value in the bitset object.
Now initialize the bitset object in initialization list as follows:
m_bitControls(0)
Above line will set all the 16 bit to O.
Add a member function which will enable or disable the controls depend on the value of bits of the bitset object. Code of this functions is as follow:
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]);
}
Now in the one of the handler function for clicking Radio button add the following 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();
Above code will set the first and second bit and reset the last four bits. After that enableORdisble function is executed. This code will enable the two button controls and disable two edit controls and two combo boxes. For the other two handlers see the code included with this article.
This technique provide solutions for two above mentioned issues: