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

Posted

技术标签:

【中文标题】借助复选框控件 (MFC) 启用/禁用编辑框【英文标题】:Enable/Disable Edit box with help of Check-box control (MFC) 【发布时间】:2016-08-23 17:03:47 【问题描述】:

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

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

以下代码示例将实现所需的逻辑。

头文件:

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() 事件触发。

【讨论】:

啊..我在这里犯了一个愚蠢的错误。现在更痛了:D。我的 'If' 语句和 'Else' 语句是相同的,所以它根本不会去 Else!无论如何感谢您的cmets。我也可以按照您的方式实施。【参考方案2】:

恕我直言,使用 DoDataExchange(..) 来维护对话框的状态充其量是冒险的。添加一个像 UdateState() 这样的成员并使用它。在 OnInitDialog( ) 中使用任何不容易在构造函数中初始化并调用 UpdateState( ) 的内容暂存对话框。

仅使用 DoDataExchange(..) 来做它听起来的事情,在对话框和对象之间交换数据。这样您就不会随着 Dialog 的发展而陷入困境。

//....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( );

【讨论】:

以上是关于借助复选框控件 (MFC) 启用/禁用编辑框的主要内容,如果未能解决你的问题,请参考以下文章

复选框标签启用禁用敲除js

将静态文本框绑定到复选框

标题为复选框的分组框

如何使 MFC 复选框只读但保持启用文本?

如何查看是不是选中了 MFC 复选框

请教MFC中如何循环处理相同类型的控件,如编辑框之类的?