Я использую Visual Studio 2013 и создаю приложение на основе MFC Dialog.У меня странная проблема с Kill Focus of Edit Control.
Пожалуйста, смотрите ниже:
=========================================================================
В моем приложении у меня есть два диалоговых окна Edit Controls.
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;
}
}
}
Теперь проблема возникает, когда после изменения значения в 1-м элементе управления редактирования (IDC_EDIT_QUALITY1), скажем, введя в него 0 и нажав клавишу TAB, последовательность действий выглядит следующим образом:
- void CTestDlg :: OnQuality1EditKillFocus() вызывается.
- Вызывает ValidateQualityParams (IDC_EDIT_QUALITY1)
- Внутри ValidateQualityParams он переходит к условию if (IDC_EDIT_QUALITY1 == qualityParamID).
- Поскольку введенное мной значение меньше MIN_QUALITY_VALUE, оно отображает сообщение, вызывая AfxMessageBox.
- Теперь, даже из стека вызовов AfxMessageBox, оно попадает в void CTestDlg :: OnQuality2EditKillFocus ()внутренне.
Хотя стек вызовов OnQuality1EditKillFocus еще не закончен, OnQuality2EditKillFocus вызывается из стека вызовов AfxMessageBox.
Я не понимаюпричина этой проблемы.Кто-нибудь сталкивался с такой проблемой раньше?
В моем resource.h у меня есть два различных значения для IDC_EDIT_QUALITY1
и IDC_EDIT_QUALITY2
#define IDC_EDIT_QUALITY1 1018
#define IDC_EDIT_QUALITY2 1020
Пожалуйста, помогите по этой проблеме.