读书人

MFC SetWindowText(.)促成的死循环

发布时间: 2013-03-25 15:43:04 作者: rapoo

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的触发条件,这种情况下使用这个函数是不行的

读书人网 >VC/MFC

热点推荐