c++ MFC事件处理程序为主对话框文本框调用SetWindowText,仅显示第一个和最后一个文本

1cosmwyk  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(179)

我的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,但是在我尝试这样做之前,我希望有更多经验的人能给予我一些指导。

c3frrgcw

c3frrgcw1#

听起来好像调用/拥有线程在SetWindowText()调用之间很忙碌。SetWindowText()不会立即绘制窗口(查看文档),当WM_PAINT消息(低优先级消息)被处理时,更改将变得可见,在线程即将进入空闲状态之前处理。您可能只是接收到一条WM_PAINT消息,这是多个SetWindowText()调用的结果。
尝试在调用SetWindowText()UpdateData(FALSE)之后调用UpdateWindow()(对于静态控件,以及所有其他您希望立即更新或“同步”更新的控件),这将绕过消息队列并更新控件。
这与从ON_CHECKED...处理程序内部调用这些函数无关。

编辑:

我做了一个小测试,但无法重现你的问题。下面是一些代码:

for (int i = 0; i < 5; i++)
{
    CString s;
    s.Format(_T(" Count: %d"), i+1);
    cMyStatic.SetWindowText(s);
    //cMyStatic.UpdateWindow();
    Sleep(1000);
}

它是从项目的唯一线程(主线程)调用的(UI)线程,它拥有所有窗口。这工作,即使没有调用UpdateWindow()!相同的行为,即使我用一个循环调用GetTickCount()替换Sleep(1000),直到时间流逝。也就是说,对于静态控件SetWindowText()立即更新控件。你提到了一个“静态文本框”,这是一个静态控件还是一个禁用的编辑控件?在我的测试中,我使用了一个静态控件:

LTEXT "",IDC_MYSTATIC,94,34,72,12,0,WS_EX_CLIENTEDGE

使用VS 2022测试,Windows SDK版本:10.0(最新安装版本)
同样,据我所知,没有ON_CHECKED...处理程序。
你的项目肯定有问题,做一个副本,开始删除东西,直到它被减少到一个MRE...

相关问题