1

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

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

这个问题已知吗?OnPaint() 执行是否有任何定义的时间限制?

谢谢,

亚历克斯。

4

1 回答 1

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 消息。在 UpdateWindow 成员函数将内部 WM_PAINT 消息发送到窗口后,在窗口无效或重新调用 RedrawWindow 成员函数并设置 RDW_INTERNALPAINT 标志之前,不会再发送或发布 WM_PAINT 消息。

于 2012-03-10T13:08:13.440 回答