2009-11-17 96 views
1

我有一個帶有三個MDI窗口的應用程序,所有窗口都顯示OpenGL內容。在XP上,一切正常。但在Vista/Win7上,mdi子窗口無法正常刷新。OpenGL窗口被清除,沒有WM_PAINT消息

啓動後,所有窗口都正常顯示其內容。但是當我將焦點從一個mdi窗口改變爲下一個時,這兩個窗口被清除(即,它們只顯示白色,沒有內容)。我不知道爲什麼窗口被清除,當這種情況發生時他們沒有收到任何WM_ *消息,當然也沒有收到WM_PAINT消息。

調整這些窗口的大小時,我正確地獲取WM_PAINT消息(在WM_SIZE之後)並重新繪製內容,但窗口也被清除,導致調整大小時出現奇怪的閃爍。調整大小後停止,窗口保持清除(白色),直到我手動強制刷新。

這種情況與Aero啓用或禁用無關。

任何想法爲什麼發生這種情況?

回答

2

我很驚訝它適用於XP。在使用OpenGL的(有限)體驗中,WM_PAINT並不總是重繪OpenGL場景的最佳場所。最有可能的是,內容在驅動程序層面被消滅。您可以通過查看當您的一個MDI窗口跨越連接到兩個不同視頻卡的兩個顯示器時發生的情況來檢查此問題。

嘗試以下操作:

WM_SIZE發生後
  1. 重新初始化你的OpenGL上下文。
  2. 按需而不是在WM_PAINT中繪製。在WM_PAINT的處理程序中,什麼也不做。使用定時器或其他一些機制來定期觸發顯示器的更新。
  3. 閃爍通常是由干擾通過WM_ERASEBKGND引起的。如果您還沒有,請攔截WM_ERASEBKGND,並在您顯示OpenGL內容的地區不做任何事情。
  4. 在託管OpenGL內容的任何窗口上使用CS_OWNDC窗口樣式,以便在MDI窗口的生命週期內,HDC不會更改每個消息/每次調用。

其他罕見的干擾的原因可能適用(因爲你正在使用MDI窗口)

  1. WM_NCPAINT和相關的其它非客戶端繪製消息 - 你可以通過你的OpenGL內容移動到一個孩子,這些解決方法沒有邊界的窗口,在MDI窗口內。
  2. 您的視頻卡上顯式需要重疊或隱式使用它們的OpenGL的錯誤/不兼容默認功能(頻繁導致重疊上下文中的問題)。不幸的是,診斷出我的知識領域,但一些測試可能會在這裏提供一些額外的亮點。
+0

感謝您的所有提示。我一回到辦公室就會嘗試這些。 – Stefan 2009-11-17 18:10:28

+0

np。此外,通過發佈您的上下文初始化代碼的片段,您可能會從擁有更深OpenGL體驗的人那裏獲得更好的響應。 – meklarian 2009-11-17 18:15:03

+0

除非您使用遊戲循環,否則請響應WM_PAINT。如果你繪製所有的東西,你可以覆蓋WM_ERASEBKGND並且不做任何事情以避免閃爍。在你的特定情況下,還有一些其他問題,例如,不要衝洗OpenGL命令。 – gast128 2016-08-19 09:01:34