在复选框控件(MFC)的帮助下启用/禁用编辑框

时间:2016-08-23 17:03:47

标签: visual-c++ mfc modal-dialog

我有一个复选框和一个编辑控件。我想要在未选中复选框时禁用编辑控件,并在选中复选框时启用编辑控件。

当我选中/取消选中复选框时,会调用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例。

  1. 当弹出对话框时,默认情况下禁用“编辑”框。
  2. 如果默认情况下启用了编辑框(我将对话框属性中的'已禁用'行为设置为' False'),整个操作中编辑框保持启用状态。 (选中并取消选中复选框上的操作)

    1. 当弹出对话框时默认启用编辑框。
    2. 默认情况下,当我禁用“编辑”框时(我将对话框属性中的“已禁用'行为设置为' True'”),首先启用“编辑框”' 39; '检查'在复选框上,但在整个操作过程中保持启用状态。 (选中并取消选中复选框上的操作)。

      我在这里失踪的是什么?

2 个答案:

答案 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( );
}