0

我目前正在使用 MFC,我想做一个简单的帐户管理。

我制作了一个从一开始就设置为禁用的登录按钮和 2 个编辑框,每个编辑框都是用户 ID 和密码。

我想做一件简单的事情:如果其中一个编辑框根本没有价值,则禁用登录按钮,否则..使按钮可用。

但是,代码根本不起作用。

这是代码:

头文件的一部分

 // Implementation
protected:
    HICON m_hIcon;

    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
private:
    // Value of the "Username" textbox
    CString m_CStr_UserID;
    // Control variable of the "Username" textbox
    CEdit m_CEdit_ID;
    // Value of the "Password" textbox
    CString m_CStr_UserPass;
    // Control variable of the "Password" textbox
    CEdit m_CEdit_PASS;
    // Control variable of the "Login" button
    CButton m_Btn_Login;
public:
    afx_msg void OnEnChangeEditId();

    afx_msg void OnEnChangeEditPass();

继续 .cpp

 .....
void CTestDlg::OnEnChangeEditId()
{
    // TODO:  If this is a RICHEDIT control, the control will not
    // send this notification unless you override the CDialog::OnInitDialog()
    // function and call CRichEditCtrl().SetEventMask()
    // with the ENM_CHANGE flag ORed into the mask.

    // TODO:  Add your control notification handler code here

    m_CEdit_ID.GetWindowTextW(m_CStr_UserID);
    if(!m_CStr_UserID.IsEmpty() && !m_CStr_UserPass.IsEmpty())
        m_Btn_Login.EnableWindow(TRUE);
    m_Btn_Login.EnableWindow(FALSE);
}

void CTestDlg::OnEnChangeEditPass()
{
    // TODO:  If this is a RICHEDIT control, the control will not
    // send this notification unless you override the CDialog::OnInitDialog()
    // function and call CRichEditCtrl().SetEventMask()
    // with the ENM_CHANGE flag ORed into the mask.

    // TODO:  Add your control notification handler code here
    m_CEdit_PASS.GetWindowTextW(m_CStr_UserPass);
    if(!m_CStr_UserPass.IsEmpty() && !m_CStr_UserID.IsEmpty())
        m_Btn_Login.EnableWindow(TRUE);
    m_Btn_Login.EnableWindow(FALSE);
}

代码有什么问题?

4

2 回答 2

1

In both handlers it's always being enabled FALSE. I think you're missing an else

You either need to return after the EnableWindow(TRUE) or use an else.

于 2012-11-09T13:17:52.733 回答
0

acraig5057 解释了您的代码的问题,并向您展示了如何解决它。我将补充一点,您也可以这样做:将两个编辑控件的 EN_CHANGE 映射到一个处理程序,我们称之为 OnEnChangeEditIdOrPass:

void CTestDlg::OnEnChangeEditIdOrPass()
{        
    m_Btn_Login.EnableWindow((m_CEdit_ID.GetWindowTextLength() != 0) && 
                             (m_CEdit_PASS.GetWindowTextLength() != 0));
}

该函数GetWindowTextLength返回指定编辑控件中的字符数,如果编辑控件为空,则返回 0。

上面代码的逻辑是这样的:如果两个编辑框都有字符,&&会返回TRUE,登录按钮会被启用。如果其中至少一个没有,&& 将返回FALSE并且登录按钮将被禁用。

当然,此代码不会像您的代码那样将用户名和密码编辑控件的值保存到字符串变量中,但您始终可以从登录按钮的处理程序内部调用 GetWindowText。

于 2012-11-10T00:19:49.530 回答