首页 > 解决方案 > MFC 编辑控件 EN_KILLFOCUS 问题

问题描述

我正在使用 Visual Studio 2013 并制作基于 MFC 对话框的应用程序。我遇到了编辑控件的 Kill Focus 的奇怪问题。

请看下面:

==================================================== =========================

在我的应用程序中,对话框上有两个编辑控件。

1st Edit Control -> IDC_EDIT_QUALITY1
2nd Edit Control -> IDC_EDIT_QUALITY2

我已经处理了两个 EN_KILLFOCUS 事件来验证值。

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
    ON_EN_KILLFOCUS(IDC_EDIT_QUALITY1, &CTestDlg::OnQuality1EditKillFocus)
    ON_EN_KILLFOCUS(IDC_EDIT_QUALITY2, &CTestDlg::OnQuality2EditKillFocus)
END_MESSAGE_MAP()

void CTestDlg::OnQuality1EditKillFocus()
{
    ValidateQualityParams(IDC_EDIT_QUALITY1);
}

void CTestDlg::OnQuality2EditKillFocus()
{
    ValidateQualityParams(IDC_EDIT_QUALITY2);
}

#define MIN_QUALITY_VALUE     1     
#define MAX_QUALITY_VALUE   100

void CTestDlg::ValidateQualityParams(int qualityParamID)
{
    CString strQuality1;
    if (IDC_EDIT_QUALITY1 == qualityParamID)
    {
        m_ctrlQuality1.GetWindowText(strQuality1);
        if ((_ttoi(strQuality1) < MIN_QUALITY_VALUE) || (_ttoi(strQuality1) > MAX_QUALITY_VALUE))
        {
            CString strMessage;
            strMessage.Format(_T("Quality1 value must be between %d to %d."), MIN_QUALITY_VALUE, MAX_QUALITY_VALUE);
            **AfxMessageBox(strMessage);**
            m_ctrlQuality1.SetSel(0, -1);
            m_ctrlQuality1.SetFocus();
            return;
        }
    }

    CString strQuality2;
    if (IDC_EDIT_QUALITY2 == qualityParamID)
    {
        m_ctrlQuality2.GetWindowText(strQuality2);
        if ((_ttoi(strQuality2) < MIN_QUALITY_VALUE) || (_ttoi(strQuality2) > MAX_QUALITY_VALUE))
        {
            CString strMessage;
            strMessage.Format(_T("Quality2 value must be between %d to %d."), MIN_QUALITY_VALUE, MAX_QUALITY_VALUE);
            AfxMessageBox(strMessage);
            m_ctrlQuality2.SetSel(0, -1);
            m_ctrlQuality2.SetFocus();
            return;
        }
    }
}

现在,问题发生在更改第一个编辑控件(IDC_EDIT_QUALITY1)中的值后,例如在其中输入 0 并按 TAB 键,流程如下:

虽然 OnQuality1EditKillFocus 的调用栈尚未完成,但 OnQuality2EditKillFocus 是从 AfxMessageBox 的调用栈中调用的。

我不明白这个问题的原因。有没有人遇到过这样的问题?

IDC_EDIT_QUALITY1在我的 resource.h 中,我有两个不同的值IDC_EDIT_QUALITY2

 #define IDC_EDIT_QUALITY1               1018
 #define IDC_EDIT_QUALITY2               1020

请帮助解决这个问题。

标签: visual-c++mfc

解决方案


当您按下 TAB 键时,IDC_EDIT_QUALITY2 获得焦点。但是由于输入的值超出范围,程序调用了m_ctrlQuality1.SetFocus(),这反过来又导致OnQuality2EditKillFocus()被调用。添加一个成员变量 m_bQuality1OutOfBound 并在调用之前将其设置为 true m_ctrlQuality1.SetFocus()。在OnQuality2EditKillFocus()中,当 m_bQuality1OutOfBound 为 true 时,将其设置为 false 并且不要调用ValidateQualityParams(IDC_EDIT_QUALITY2).


推荐阅读