【问题标题】: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 函数等相关部分),这有点难以提供帮助。

标签: c++ mfc


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多