【问题标题】:Enable/Disable Edit box with help of Check-box control (MFC)借助复选框控件 (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. 当弹出对话框时默认禁用编辑框。

如果默认启用编辑框(我将对话框属性中的“禁用”行为设置为“假”),则编辑框在整个操作过程中保持启用状态。 (勾选和取消勾选复选框的操作)

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

当我默认禁用编辑框时(我将对话框属性中的“禁用”行为设置为“真”),编辑框在复选框上的“第一个”“检查”时启用,但在整个过程中保持启用状态其余的操作。 (勾选和取消勾选复选框的操作)。

我在这里缺少什么?

【问题讨论】:

  • 使用调试器单步调试代码应该会有所帮助。

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


【解决方案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( );
}

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多