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()的巨大区别