借助复选框控件 (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) 启用/禁用编辑框的主要内容,如果未能解决你的问题,请参考以下文章