Visual c++ MFC编辑控制焦点问题
我正在使用Visual Studio 2013并制作基于MFC对话框的应用程序。我遇到了编辑控件的Kill焦点的奇怪问题 请参阅下文: ========================================================================== 在我的应用程序中,对话框上有两个编辑控件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 我已经
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