我有一个复选框和一个编辑控件。我想要在未选中复选框时禁用编辑控件,并在选中复选框时启用编辑控件。
当我选中/取消选中复选框时,会调用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);
}
}
有2例。
如果默认情况下启用了编辑框(我将对话框属性中的'已禁用'行为设置为' False'),整个操作中编辑框保持启用状态。 (选中并取消选中复选框上的操作)
默认情况下,当我禁用“编辑”框时(我将对话框属性中的“已禁用'行为设置为' True'”),首先启用“编辑框”' 39; '检查'在复选框上,但在整个操作过程中保持启用状态。 (选中并取消选中复选框上的操作)。
我在这里失踪的是什么?
答案 0 :(得分:1)
以下代码示例将实现所需的逻辑。
标题文件:
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()事件触发。
答案 1 :(得分:1)
恕我直言,使用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( );
}