我想在屏幕上显示一个无模式对话框并在其中显示一些信息。
但是,如果我按照以下方式使用它,则会出现一些问题:
function()
{
showdialog(XXX).
//heavy work.
update the dialog..
//heavy work.
update the dialog...
}
似乎显示了对话框,但它没有在其中绘制任何信息。它仅在函数结束时绘制所有信息。
如何修改非模式对话框以便它立即显示信息?
您可以做一些事情。
(1)你可以post对话框中的一条消息CDialog::OnInitDialog方法,然后在该发布消息的消息处理程序中处理长函数。这样,对话框将首先显示,然后长函数将运行。
(2)第二个选项是确保消息循环获得一些处理时间。因此,如果您的长函数是某种循环,只需添加偶尔的调用处理消息确保消息队列保持为空:
void ProcessMessages()
{
MSG msg;
CWinApp* pApp = AfxGetApp();
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
pApp->PumpMessage();
}
}
Edit:在这种情况下当然可以使用线程,但这样做并不总是没有风险和复杂性。
使用带有 a 的线程GUI意味着必须处理多个消息队列,这意味着使用 API 之类的帖子主题消息这带来了一系列需要警惕的新问题。
有关此类问题的示例,请参阅此链接:
http://msdn.microsoft.com/en-us/library/ms644946(VS.85).aspx http://msdn.microsoft.com/en-us/library/ms644946(VS.85).aspx
哪里说:
PostThreadMessage 发送的消息是
不与窗口关联。作为一个
一般规则,不属于的消息
不能与窗口关联
由 DispatchMessage 调度
功能。因此,如果收件人
线程处于模态循环中(如
消息框或对话框),
消息将会丢失。拦截
在模态中线程消息
循环,使用特定于线程的钩子。
我在中使用流程消息方法Zeus IDE http://www.zeusedit.com它可以很好地确保 GUI 保持对用户的响应。它还具有非常容易实现的优点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)