2012-03-04 22 views
1

在我們的應用程序中,我們有一個MFC對話框,它打開並處理一些需要顯示的數據。因此,處理是在OnPaint()事件內懶惰地啓動的。處理 需要一些時間(大約20-30秒),並且完全是算法的(沒有UI API調用)。 會發生什麼情況,有時在處理完成後窗口「消失」。我們發現它被帶到父窗口後面(主框架)。耗時費時後,MFC對話框消失OnPaint()

處理完成後立即調用SetForegroundWindow(),或者在非UI線程中執行處理(讓OnPaint()在合理的時間內完成)已消除該問題。

這個問題是否已知? OnPaint()執行有沒有定義的時間限制?

謝謝,

Alex。

+1

你應該評論處理部分,看看窗口是否仍然消失,以縮小它。 – zar 2012-03-05 14:19:40

回答

0

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

WM_PAINT消息當UpdateWindow或RedrawWindow 成員函數被調用時發送。

由於呼叫 RedrawWindow成員函數設置了RDW_INTERNALPAINT標誌,因此窗口可能會接收到內部繪畫消息。 在這種情況下,窗口可能沒有更新區域。應用程序 應調用GetUpdateRect成員函數以確定 窗口是否具有更新區域。如果GetUpdateRect返回0,則 應用程序不應調用BeginPaint和EndPaint成員 函數。

這是一個應用程序的責任,以檢查通過查看其內部數據 結構爲每個WM_PAINT消息,因爲WM_PAINT消息可能 已造成雙方的無效面積的通話任何必要的 內部重新粉刷或更新 設置了RDW_INTERNALPAINT標誌的RedrawWindow成員函數。

Windows只發送一次內部WM_PAINT消息。在內部WM_PAINT消息通過UpdateWindow 成員函數發送到窗口後,將不會發送或發送更多WM_PAINT消息 ,直到該窗口失效,或者直到重新調用RedrawWindow成員函數並設置了RDW_INTERNALPAINT標誌爲止。