我有一个CEdit派生的控件,当不可取消的数据为null时,该控件显示字符串“N/A”。我最近添加了代码,以在控件获得焦点时清空control(SetWindowText(“”);),并在用户离开焦点时失去焦点时将其设置回“N/A”(SetWindowText(“N/A”))。控制为空。

唯一的问题是将窗口文本设置为“”或“N/A”会触发EN_CHANGE,因此我的对话框认为数据已更改。

如何避免在调用SetWindowText(WM_SETTEXT)时触发EN_CHANGE?

笔记

-我知道我可以将编辑控件设置为Multiline = TRUE,但这对我来说并不理想。

-我的应用程序是MBCS,所以我不能使用SetCueBanner

我想要一个优雅的解决方案。暂时将父窗口设置为NULL并不是一个很好的解决方案。

编辑:

-我希望解决方案在我的自定义控件中,而不是在每个对话框中

谢谢

最佳答案

我以前做过的方式(上一次,例如20分钟前;实际上我正在考虑问同样的问题),是通过设置一个标志。当我要以编程方式设置文本时,我设置了标志,并在EN_CHANGE处理程序中对其进行了检查:

void CMyDialog::MyFunction()
{
    setEditTextProgramatically = true;
    c_Edit.SetWindowText(_T("Whatever"));
    setEditTextProgramatically = false;
}

void CMyDialog::OnEnChangeEdit()
{
    if (!setEditTextProgramatically)
    {
        // Do whatever you need to do
    }
}

我知道这不是最优雅的解决方案,但它至少对我有用。

我一直想知道为什么MFC不提供一种区分用户输入和代码更改的方法,但事实就是如此。

08-24 18:41