为啥 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):
在对话框上放置一个编辑控件 (MFCCEdit
)
右键单击并选择“添加变量...”
将控件链接到变量(例如 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中Cstring转char*的问题,只能得到第一个字符是为什么呢