为啥 UpdateData() 在 MFC CEdit 控件的 EN_CHANGE 处理程序中不起作用

Posted

技术标签:

【中文标题】为啥 UpdateData() 在 MFC CEdit 控件的 EN_CHANGE 处理程序中不起作用【英文标题】:Why does UpdateData() not work in EN_CHANGE handler for MFC CEdit control为什么 UpdateData() 在 MFC CEdit 控件的 EN_CHANGE 处理程序中不起作用 【发布时间】:2017-02-08 21:30:44 【问题描述】:

这似乎是最简单的事情(使用 Visual Studio):

在对话框上放置一个编辑控件 (MFC CEdit) 右键单击并选择“添加变量...” 将控件链接到变量(例如 CString someText) 再次右键单击控件并选择“添加事件处理程序...” 单击“添加和编辑”按钮,添加一个EN_CHANGE 事件处理程序 类向导生成一个处理函数,如OnEnChangeEdtSomeText()

太棒了 - 每次输入字符时,都会调用处理函数。但是,在我使用 MFC 控件处理过的所有其他事件中,UpdateData() 将在控件和链接到它的变量之间交换数据 - 在调用 UpdateData() 之后,控件的状态反映在链接变量的状态中.为什么不在这里?显然我必须使用其他东西,到目前为止,GetWindowText() 似乎可以很好地检索我可以在CEdit 控件中看到的文本。

但是为什么UpdateData()的正常功能被破坏了呢?例如,如果我在我的编辑控件中键入“foo”,然后单击或 Tab 键关闭焦点,然后返回键入“bar”,则在 OnEnChangeEdtSomeText()(全部 6 个)的所有调用中都没有 UpdateData()导致链接到它的变量中的任何数据。为什么不?我可以相信EN_CHANGE 不会干扰其他数据输入吗?是否还有其他通知会打破我所相信的控件和通过DDX... 机制链接的变量之间的正常链接?

【问题讨论】:

“但是如何真正得到刚刚输入的字符?” - 这是一个错误的假设。 EN_CHANGE 可以在用户没有输入字符时引发(例如,用鼠标从剪贴板粘贴)。目前尚不清楚,您真正要解决的问题是什么。此问题仅询问您提出的解决方案。 你是对的 - 这是一个我已经编辑掉的反问问题。希望现在问题更清楚了。 您可以追踪到UpdateData 以准确了解它在做什么以及为什么会失败。但是在每个字符输入上调用UpdateData 是对系统的滥用——即使你让它正常工作,我还是建议你使用GetWindowText,就像你目前正在做的那样。 显然UpdateData() 在这种特殊情况下不适合使用——这很好。但我真的很惊讶它似乎完全崩溃了,好像EN_CHANGE 对它来说是某种氪石。由于UpdateData()在我正在使用的软件中被如此广泛地使用,我想了解它可能隐藏的陷阱。 @omatai 我刚刚尝试了您所描述的内容,它在这里工作得很好。如果没有看到您的实际源代码(或者至少是 .h 文件和 DoDataExchange 函数等相关部分),这有点难以提供帮助。 【参考方案1】:

如果是富编辑,需要拨打SetEventMask(ENM_CHANGE),否则消息将不会在编辑上发送。

【讨论】:

以上是关于为啥 UpdateData() 在 MFC CEdit 控件的 EN_CHANGE 处理程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MFC中用UpdateData来刷新数据

MFC中用UpdateData来刷新数据

MFC中Cstring转char*的问题,只能得到第一个字符是为什么呢

MFC编辑框关联的变量怎么用UpdateData(FALSE)无法直接写到编辑框中啊,而是需要手动点编辑框

MFC中edit实现动态输出效果

急!MFC中给一个对话框的不同编辑框关联变量后如何获得多个不同变量的值进行计算处理?????