借助复选框控件(MFC)启用/禁用编辑框



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

当我选中/取消选中复选框时,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);
    }
}

有两种情况。

  1. 当对话框弹出时,默认禁用编辑框。

如果编辑框默认启用(我将对话框属性中的"禁用"行为设置为"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( );
    }
    

    最新更新