Visual c++ MFC编辑控制焦点问题

Visual c++ MFC编辑控制焦点问题,visual-c++,mfc,Visual C++,Mfc,我正在使用Visual Studio 2013并制作基于MFC对话框的应用程序。我遇到了编辑控件的Kill焦点的奇怪问题 请参阅下文: ========================================================================== 在我的应用程序中,对话框上有两个编辑控件 1st Edit Control -> IDC_EDIT_QUALITY1 2nd Edit Control -> IDC_EDIT_QUALITY2 我已经

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

请参阅下文:

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

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

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;
        }
    }
}

请对此问题提供帮助。

当您按TAB键时,IDC\u EDIT\u QUALITY2获得焦点。但由于输入的值超出了范围,因此调用了名为
m\u ctrlQuality1.SetFocus()
,这又导致调用了
OnQuality2Edit KillFocus()

在调用
m\u ctrlQuality1.SetFocus()
之前,添加一个名为m\u Bquality1AutofBond的成员变量,并将其设置为true。在
OnQuality2EditKillFocus()
中,当m\u bquality1autofound为true时,将其设置为false,并且不要调用
validatequalams(IDC\u EDIT\u QUALITY2)

当您按下TAB键时,IDC\u EDIT\u QUALITY2获得焦点。但由于输入的值超出了范围,因此调用了名为
m\u ctrlQuality1.SetFocus()
,这又导致调用了
OnQuality2Edit KillFocus()

在调用
m\u ctrlQuality1.SetFocus()
之前,添加一个名为m\u Bquality1AutofBond的成员变量,并将其设置为true。在
OnQuality2EditKillFocus()
中,当m\u bquality1autofound为true时,将其设置为false,并且不要调用
validatequalams(IDC\u EDIT\u QUALITY2)

我相信您收到的
IDC\u EDIT\u QUALITY2
控件的
EN\u KILLFOCUS
通知不是由
m\u ctrlQuality1.SetFocus()引起的
调用,而是通过
AfxMessageBox()调用

按[Tab]键时,
IDC\u EDIT\u QUALITY1
失去焦点,
IDC\u EDIT\u QUALITY2
获得焦点。然后您将收到
EN\u KILLFOCUS
关于
IDC\u EDIT\u QUALITY1
的通知。当显示消息框时,将显示错误消息,这将导致应用程序“屈服”(再次开始处理消息)。
m\u ctrlQuality1.SetFocus()
调用不会在
AfxMessageBox()
返回之前(即在关闭消息框之前)发生,因此
EN\u KILLFOCUS
IDC\u EDIT\u QUALITY2
的通知不能是该调用的结果。我猜这是显示消息框的结果(
IDC\u EDIT\u QUALITY2
获得了焦点,但消息框使其失去了焦点)

您可以按照Staytuned123的建议,通过添加memeber变量来解决此问题,但使用不同的设置:命名它,比如说
m_bKillFocusProcessing
,并在处理任何
EN_KILLFOCUS
通知时将其设置为
TRUE
,并在完成处理后执行
FALSE
;如果已经
TRUE
则不做任何操作退出。也就是说,一次只能处理一个
EN_KILLFOCUS
通知


然而,这样的用户界面(在退出字段时显示消息框)相当奇怪。为什么要重新发明轮子,而不是使用MFC已经提供的DDX/DDV功能呢?您可以定义与控件关联的成员变量,并执行各种检查,包括范围检查。调用
UpdateData(TRUE)
执行检查(针对对话框上的所有控件)并将数据传输到成员变量。或者您可以放置一些错误显示控件(通常为红色),在发现错误时激活,如在.net或web中。

我相信您收到的
IDC\u编辑质量2
控件的
EN\u KILLFOCUS
通知不是由
m\u ctrlQuality1.SetFocus()调用引起的,而是通过
AfxMessageBox()
调用

按[Tab]键时,
IDC\u EDIT\u QUALITY1
失去焦点,
IDC\u EDIT\u QUALITY2
获得焦点。然后您将收到
EN\u KILLFOCUS
关于
IDC\u EDIT\u QUALITY1
的通知。当显示消息框时,将显示错误消息,这将导致应用程序“屈服”(再次开始处理消息)。
m\u ctrlQuality1.SetFocus()
调用不会在
AfxMessageBox()
返回之前(即在关闭消息框之前)发生,因此
EN\u KILLFOCUS
IDC\u EDIT\u QUALITY2
的通知不能是该调用的结果。我猜这是显示消息框的结果(
IDC\u EDIT\u QUALITY2
获得了焦点,但消息框使其失去了焦点)

您可以按照Staytuned123的建议,通过添加memeber变量来解决此问题,但使用不同的设置:命名它,比如说
m_bKillFocusProcessing
,并在处理任何
EN_KILLFOCUS
通知时将其设置为
TRUE
,并在完成处理后执行
FALSE
;如果已经
TRUE
则不做任何操作退出。也就是说,一次只能处理一个
EN_KILLFOCUS
通知


然而,这样的用户界面(在退出字段时显示消息框)相当奇怪。为什么要重新发明轮子,而不是使用MFC已经提供的DDX/DDV功能呢?您可以定义与控件关联的成员变量,并执行各种检查,包括范围检查。调用
UpdateData(TRUE)
执行检查(针对对话框上的所有控件)并将数据传输到成员变量。或者,您可以放置一些错误显示控件(通常为红色),在发现错误时激活,如在.net或web中。

您好,请继续调谐123,我已尝试将m_bQuality1自动绑定并进行相关更改。但是,它仍然不起作用。我不熟悉Stackoverflow,也不知道如何正确地共享代码和帖子。同时,我已将源代码上传到:
 #define IDC_EDIT_QUALITY1               1018
 #define IDC_EDIT_QUALITY2               1020