MFC 对话框在耗时的 OnPaint() 后消失

Posted

技术标签:

【中文标题】MFC 对话框在耗时的 OnPaint() 后消失【英文标题】:MFC dialog disappears after a time-consuming OnPaint() 【发布时间】:2012-03-04 13:40:44 【问题描述】:

在我们的应用程序中,我们有一个 MFC 对话框,可以打开并处理一些需要显示的数据。因此,处理是在 OnPaint() 事件中延迟启动的。加工处理 需要一些时间(大约 20-30 秒),并且完全是算法(没有调用 UI API)。 发生的情况是有时在处理完成后窗口“消失”。我们发现它被带到了父窗口(主框架)后面。

在处理完成后立即调用 SetForegroundWindow(),或在非 UI 线程中执行处理(让 OnPaint() 在合理的时间内完成)已经消除了问题。

这个问题已知吗? OnPaint() 的执行是否有明确的时间限制?

谢谢,

亚历克斯。

【问题讨论】:

你应该注释掉处理部分,看看窗口是否仍然消失以缩小范围。 【参考方案1】:

http://msdn.microsoft.com/en-us/library/01c9aaty%28v=vs.80%29.aspx

UpdateWindow 或 RedrawWindow 时发送 WM_PAINT 消息 成员函数被调用。

窗口可能会因为调用而收到内部绘制消息 设置了 RDW_INTERNALPAINT 标志的 RedrawWindow 成员函数。 在这种情况下,窗口可能没有更新区域。一个应用程序 应调用 GetUpdateRect 成员函数来确定是否 窗口有一个更新区域。如果 GetUpdateRect 返回 0,则 应用程序不应调用 BeginPaint 和 EndPaint 成员 功能。

应用程序有责任检查任何必要的 通过查看其内部数据进行内部重绘或更新 每个 WM_PAINT 消息的结构,因为 WM_PAINT 消息可能 由无效区域和调用 设置了 RDW_INTERNALPAINT 标志的 RedrawWindow 成员函数。

Windows 只发送一次内部 WM_PAINT 消息。经过一个 内部 WM_PAINT 消息由 UpdateWindow 发送到窗口 成员函数,不会发送或发布更多 WM_PAINT 消息 直到窗口失效或直到 RedrawWindow 成员 再次调用函数并设置 RDW_INTERNALPAINT 标志。

【讨论】:

以上是关于MFC 对话框在耗时的 OnPaint() 后消失的主要内容,如果未能解决你的问题,请参考以下文章

mfc中,我想把自己的图片显示在窗口中,一定要在wm_paint重绘中实现??

MFC OnPaint()函数中最先调用CDialog::OnPaint()和最后调用CDialog::OnPaint()的巨大区别

MFC怎么在主窗口显示后,加载子窗口

[转]MFC子线程更改图像数据后更新主窗口图像显示方法

MFC中GDI之CRgn类

关于MFC中的OnPaint和OnDraw