visual-c++ - 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 键,流程如下:
- 调用 void CTestDlg::OnQuality1EditKillFocus()。
- 它调用 ValidateQualityParams(IDC_EDIT_QUALITY1)
- 在 ValidateQualityParams 中,它转到 if (IDC_EDIT_QUALITY1 == qualityParamID) 条件。
- 由于我输入的值小于 MIN_QUALITY_VALUE,所以它通过调用 AfxMessageBox 来显示消息。
- 现在,即使从 AfxMessageBox 的调用堆栈中,它也会在内部命中 void CTestDlg::OnQuality2EditKillFocus()。
虽然 OnQuality1EditKillFocus 的调用栈尚未完成,但 OnQuality2EditKillFocus 是从 AfxMessageBox 的调用栈中调用的。
我不明白这个问题的原因。有没有人遇到过这样的问题?
IDC_EDIT_QUALITY1
在我的 resource.h 中,我有两个不同的值IDC_EDIT_QUALITY2
#define IDC_EDIT_QUALITY1 1018
#define IDC_EDIT_QUALITY2 1020
请帮助解决这个问题。
解决方案
当您按下 TAB 键时,IDC_EDIT_QUALITY2 获得焦点。但是由于输入的值超出范围,程序调用了m_ctrlQuality1.SetFocus()
,这反过来又导致OnQuality2EditKillFocus()
被调用。添加一个成员变量 m_bQuality1OutOfBound 并在调用之前将其设置为 true m_ctrlQuality1.SetFocus()
。在OnQuality2EditKillFocus()
中,当 m_bQuality1OutOfBound 为 true 时,将其设置为 false 并且不要调用ValidateQualityParams(IDC_EDIT_QUALITY2)
.
推荐阅读
- xml - 将 XML 加载到具有一个属性和多个值的表中
- c++ - 在OpenGL中转换应用顺序让我感到困惑
- python - 如何在操作系统分配的端口上运行 Flask (1.0.2) 应用程序
- node.js - Node.js verify.verify() 奇怪的行为
- python - 如何使用python在网络浏览器中打开选项卡
- sql - 从另一个表中获取丢失的数据
- python - 所以我必须写下一个返回形状的函数
- pdf - 修复页面底部页脚QWEB Invoice Report ODOO前的一个元素“DIV”
- php - 使用代码 eval("\$name= \"$input\";") 获取用户数据是否安全,其中 $input 从用户那里获取?
- php - 带有 ajax 的 CRUD SonataAdmin 在迁移之前不起作用