我有一个复选框和一个编辑控件。我想禁用编辑控件时,复选框是"未选中",并启用编辑控件时,复选框被选中。
当我选中/取消选中复选框时,OnBnClickedCheck1被调用。m_CHECK1_VARIABLE告诉我复选框是选中还是取消选中。If-else部分正确执行,但m_TEXT1_CONTROL.EnableWindow(FALSE/TRUE)似乎不起作用。代码如下:
void CPreparationDlg::OnBnClickedCheck1()
{
UpdateData(TRUE);
if (m_CHECK1_VARIABLE)
{
m_TEXT1_CONTROL.EnableWindow(TRUE);
}
else if (m_CHECK1_VARIABLE)
{
m_TEXT1_CONTROL.EnableWindow(FALSE);
}
}
有两种情况。
- 当对话框弹出时,默认禁用编辑框。
如果编辑框默认启用(我将对话框属性中的"禁用"行为设置为"False"),则编辑框在整个操作过程中保持启用状态。(复选框上的勾选和取消勾选操作)
- 当对话框弹出时,编辑框默认是启用的。
当我默认禁用编辑框时(我将对话框属性中的"禁用"行为设置为"True"),编辑框在复选框上的"第一个"复选"上启用,但在其余操作中保持启用。(复选框上的勾选和取消勾选操作)。
我在这里错过了什么?
下面的代码示例将实现所需的逻辑。
头文件:
public:
int m_Check;
CEdit m_EditBox;
afx_msg void OnBnClickedCheck1();
类实现源码:
CMfcApplicationDlg::CMfcApplicationDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMfcApplicationDlg::IDD, pParent)
, m_Check(0) // Default checkbox state
{
// ...
}
void CMfcApplicationDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, m_EditBox);
DDX_Check(pDX, IDC_CHECK1, m_Check);
m_EditBox.EnableWindow(m_Check);
}
void CMfcApplicationDlg::OnBnClickedCheck1()
{
UpdateData();
}
所有必需的功能都可以在DoDataExchange()方法中实现。第一次编辑框控件状态设置根据m_Check默认值。下次编辑框控件状态将被OnBnClickedCheck1()事件触发
恕我直言,使用DoDataExchange(..)来维护对话框的状态充其量是有风险的。添加像UdateState()这样的成员并使用它。在OnInitDialog()中使用任何不容易在构造函数中初始化的内容,并调用UpdateState()。
使用DoDataExchange(..)只做它听起来像,在对话框和对象之间交换数据。这样你就不会在对话框发展的过程中陷入困境。
//....h
CEdit m_EditBox;
CButton m_CheckBox;
//...cpp
BOOL MyDialog::OnInitDialog( )
{
if( ! CDialogEx::OnInitDialog( ) )
return FALSE;
//do more stuff then
UpdateState( );
return TRUE;
}
void MyDialog::UpdateState( )
{
m_EditBox.EnableWindow( m_CheckBox.GetCheck( ) == BST_CHECKED );
//more state stuff...
}
void MyDialog::OnBnClickedCheck1( )
{
UpdateState( );
}