在我们的应用程序中,我们有一个MFC对话框,可以打开并处理显示所需的一些数据。因此,处理是在OnPaint()事件内懒洋洋地启动的。处理 需要一些时间(约20-30秒),并且只是算法(没有UI API调用)。 发生的事情是,有时在处理完成后窗口“消失”。我们发现它被带到了父窗口(主框架)之后。
在处理完成后立即调用SetForegroundWindow(),或者在非UI线程中执行处理(让OnPaint()在合理的时间内完成)已经消除了这个问题。
此问题是否已知? OnPaint()执行是否有任何定义的时间限制?
谢谢,
亚历。
答案 0 :(得分:0)
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消息发送到窗口 成员函数,不会发送或发布更多WM_PAINT消息 直到窗口无效或直到RedrawWindow成员 在设置RDW_INTERNALPAINT标志的情况下再次调用该函数。