我的MFC对话框的ON_CHECKED...事件处理程序调用一个对话框成员“doit”,该成员将SetWindowText调用到对话框静态文本框上(cMyStatic)。只有第一个和最后一个Set.. text数据出现在文本框中。我已经用cMyStatic试过了。无效()和UpdateData()。我的SetWindowText似乎被阻止了。在请求SetWindowText之后,同一成员中的顺序代码执行2次连续的CreateProcess调用,并且这些进程运行良好(它们对对话框不做任何事情--即没有用户交互)。只有一个对话框,在VS 2019中创建,System Modal设置为FALSE。显然,我缺少了一些对从ON_ unit调用的成员与对话框本身之间通信的理解,但是我没有找到任何参考资料来说明什么是错误的,或者当一个对话框的ON_ unit正在运行时如何正确地将文本插入到对话框的文本框中。有人能提供建议吗?我怀疑我可能需要启动一个独立的线程来做Set.. Text,但是在我尝试这样做之前,我希望有更多经验的人能给予我一些指导。
1条答案
按热度按时间c3frrgcw1#
听起来好像调用/拥有线程在
SetWindowText()
调用之间很忙碌。SetWindowText()
不会立即绘制窗口(查看文档),当WM_PAINT
消息(低优先级消息)被处理时,更改将变得可见,在线程即将进入空闲状态之前处理。您可能只是接收到一条WM_PAINT
消息,这是多个SetWindowText()
调用的结果。尝试在调用
SetWindowText()
或UpdateData(FALSE)
之后调用UpdateWindow()
(对于静态控件,以及所有其他您希望立即更新或“同步”更新的控件),这将绕过消息队列并更新控件。这与从
ON_CHECKED...
处理程序内部调用这些函数无关。编辑:
我做了一个小测试,但无法重现你的问题。下面是一些代码:
它是从项目的唯一线程(主线程)调用的(UI)线程,它拥有所有窗口。这工作,即使没有调用
UpdateWindow()
!相同的行为,即使我用一个循环调用GetTickCount()
替换Sleep(1000)
,直到时间流逝。也就是说,对于静态控件SetWindowText()
立即更新控件。你提到了一个“静态文本框”,这是一个静态控件还是一个禁用的编辑控件?在我的测试中,我使用了一个静态控件:使用VS 2022测试,Windows SDK版本:10.0(最新安装版本)
同样,据我所知,没有
ON_CHECKED...
处理程序。你的项目肯定有问题,做一个副本,开始删除东西,直到它被减少到一个MRE...