当前位置:  开发笔记 > 编程语言 > 正文

如何显示无模式对话框并立即显示信息?

如何解决《如何显示无模式对话框并立即显示信息?》经验,为你挑选了2个好方法。

我想在屏幕上显示一个无模式对话框并在其中显示一些信息.

但是,如果我按照以下方式使用它,它有一些问题:

function()
{
showdialog(XXX).
//heavy work.
update the dialog..
//heavy work.
update the dialog...
}

似乎显示了对话框,但它不会在其中绘制任何信息.它只在函数结束时绘制所有信息.

如何修改无模式对话框以便立即显示信息?



1> jussij..:

你可以做一些事情.

(1)您可以从CDialog :: OnInitDialog方法内部向对话框发布消息,然后在该发布消息的消息处理程序中处理long函数.这样就会首先显示对话框,然后稍后将运行long函数.

(2)第二个选项是确保消息循环得到一些处理时间.因此,如果您的long函数是某种循环,则只需添加对ProcessMessages的临时调用以确保消息队列保持为空:

void ProcessMessages()
{
    MSG msg;
    CWinApp* pApp = AfxGetApp();
    while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
    {
        pApp->PumpMessage();
    }
}

编辑:当然有可能使用线程就是这种情况,但这样做并不总是没有风险和复杂性.

使用带有GUI的线程意味着必须处理多个消息队列,这意味着使用像PostThreadMessage这样的API,并引入一组需要警惕的新问题.

有关此类问题的示例,请参阅此链接:

http://msdn.microsoft.com/en-us/library/ms644946(VS.85).aspx

在哪里说:

PostThreadMessage发送的消息与窗口无关.作为一般规则,DispatchMessage函数无法分派与窗口无关的消息.因此,如果收件人线程处于模态循环(由MessageBox或DialogBox使用),则邮件将丢失.要在模态循环中拦截线程消息,请使用特定于线程的挂钩.

我在Zeus IDE中使用了进程消息方法,它可以很好地确保GUI保持对用户的响应.它还具有易于实现的优点.


IMO ProcessMessage()函数是添加MFC应用程序响应的方法.
我也会使用ProcessMessage选项;)

2> Aidan Ryan..:

在OnInitDialog中,启动工作线程以执行计算.从工作线程发布用户消息以更新对话框.

由于以下几个原因,这优于ProcessMessages实现:

进行计算的代码可以从不属于它的UI代码中分离出来.

在执行实际计算时,UI仍保持响应.ProcessMessages允许在单个计算功能期间进行多个UI更新,但在实际计算期间仍将阻止UI.

对话框代码:

#define WM_NEW_COUNT (WM_USER + 0x101)

BEGIN_MESSAGE_MAP()
    ON_MESSAGE(WM_NEW_COUNT, OnNewCount)
END_MESSAGE_MAP()

BOOL CMyDialog::OnInitDialog()
{
    CWinThread* pThread = AfxBeginThread(MyCountFunc, this->GetSafeHwnd());
    return TRUE;
}

LRESULT CMyDialog::OnNewCount(WPARAM wParam, LPARAM)
{
    int newCount = (int)wParam;

    // m_count is DDX member, e.g. for label
    m_count = newCount;

    UpdateData(FALSE);

    return 0;
}

工作线程:

UINT MyCountFunc(LPVOID lParam)
{
    HWND hDialogWnd = (HWND)lParam;

    for (int i=0; i < 100; ++i)
    {
        PostMessage(hDialogWnd, WM_NEW_COUNT, i, NULL);
    }
}

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有