MFC SetWindowText(...)造成的死循环
本帖最后由 lefter1986 于 2013-01-29 17:31:58 编辑 我在Visual Studio 2008下编写了一个MFC对话框,
void CDlgTest::OnEnChangeEdtName()
{
CString strName;
m_edtName.GetWindowText(strName); // m_edtName是一个CEdit控件变量。
if (0 != strName.CompareNoCase(_T("Mike")))
{
AfxMessageBox(_T("您输入的不是Mike,程序会自动帮您设置。"));
m_edtName.SetWindowText(_T("Mike"));
}
/* 首先为这个愚蠢的例子向大家道歉。
简单解释一下:这是一个MFC的对话框里类,对话框上有一个CEdit控件。
该函数是上述CEdit控件的编辑响应函数。
当m_edtName.SetWindowText(_T("Mike"));被调用的时候,本函数会被调用,
而本函数被调用又会导致m_edtName.SetWindowText(_T("Mike"));被调用,从而形成了死循环,
不断地弹出AfxMessageBox(_T("您输入的不是Mike,程序会自动帮您设置。"));这个提示。
问题是:如何在不改变程序逻辑的情况下,切断该死循环,
比如m_edtName.SetWindowText(_T("Mike"));被执行的时候,不调用本函数。
*/
}
谢谢大家。
[解决办法]
if (0 != strName.CompareNoCase(_T("Mike")) && bCompare == false)
{
AfxMessageBox(_T("您输入的不是Mike,程序会自动帮您设置。"));
m_edtName.SetWindowText(_T("Mike"));
}
bCompare 判断是不是比较过
避免重复比较
[解决办法]
需要清楚OnEnChangeEdtName的触发条件,这种情况下使用这个函数是不行的