2012-03-27 60 views
5

我想創建我自己的小窗口GUI系統,爲此我使用GDI +。我不能在這裏發佈代碼,因爲它有巨大的(C++)但波紋管是我遵循的主要步驟...如何高效渲染雙緩衝窗口而不會產生撕裂效應?

  1. 創建一個大小等於應用程序窗口的位圖。
  2. 對於所有的鼠標和鍵盤事件更新自定義的控制狀態(例如,如果鼠標目前持有超過一個特定的控制等)
  3. 對於WM_PAINT事件畫的背景,屏幕外的位圖,然後畫上的頂部全部更新控制並最終通過Graphics :: DrawImage(..)調用將整個屏外圖像複製到前端緩衝區。
  4. 對於WM_SIZE/WM_SIZING,刪除以前的離屏位圖,並用新的窗口大小創建另一個。

另外還有一些檢查,以防止控件重複繪製它需要換句話說重繪只有噹噹控制的狀態被改變才把它是畫e.t.c.即控件繪製

該系統工作正常,但只有一個例外...當窗口正在調整大小某種撕裂效果出現。現在我想說的撕裂效果我將試圖解釋...

在邊框/邊框的邊緣有一個閃爍的縫隙,因爲我拖動邊框。就好像我的DrawImage()函數立即返回,而一個交換操作已完成另一個圖像繪製啓動。

現在你可能會認爲這是在許多其他應用程序中發生的常見工件,因爲resizing backbuffer並不總是像調整窗口大小一樣快,但在其他應用程序中我注意到的其他應用程序中,儘管在窗口大小和客戶區大小隨着窗口的增長而變大,在邊緣附近沒有任何東西閃爍(它通常只是白色的背景,沿着邊界顯示爲薄的均勻帶)。 另外,在調整大小的過程中,與窗口大小調整一起移動的動態控件會變得不平穩。

起初,我認爲使用恆定的全屏幕尺寸的屏幕外表面可以最大限度地減少僞影,但是當我嘗試時,結果並不令人滿意。我還試圖在調整大小時調用Sleep(),以便在另一次翻轉開始之前翻轉完成,但奇怪的是,即使這對我也不起作用!

我聽說,GDI在Vista上沒有硬件加速,可這可能是什麼問題?

也不知框架,如Qt的是如何呈現窗戶的GUI這麼順利,即使你大小一個複雜的Qt的GUI窗口非常快忽略的少量出現的神器。據我所知Qt可以使用opengl進行GUI渲染,但這是第二種選擇。

如果我使用directx,那麼實時調整大小更加困難,另一方面,opengl似乎很好地調整大小沒有任何問題,但我將失去GDI +的所有2d繪圖功能。

如果你們做了這樣的事之前,請指導我。此外,如果您有任何我應該考慮的自定義用戶界面設計指針,請爲我提供鏈接。

謝謝!我總是希望設計像Windows Media Player 11這樣的界面,但是有人可以告訴我,對於一個C++程序員(我想知道如何,而不是使用一些現有的框架等),有一個直接的解決方案嗎?子類化,所有者繪圖,自定義繪圖似乎沒有給你這樣的控制水平,我不知道用常用控件繪製半透明控制的方法,所以我認爲這個問題值得特別關注。再次感謝。

+0

這是一個熟悉的問題:http://stackoverflow.com/questions/9786218/drawing-in-window-while-resizing-leaves-unpainted-border – 2012-03-27 15:39:12

+0

我自己經歷過這種痛苦 - 我需要一個表單完整的alpha支持和可變的點擊。我從來沒有設法順利地調整工作大小(並且花費了很長時間來制定所有其他的小問題,例如代理事件)。我很想知道你是否找到了一個體面的解決方案。 – Basic 2012-03-27 16:03:16

+0

但是其他框架如qt如何平滑調整大小呢?如果我沒記錯的話,gtk也使用無窗口的非本地自定義繪製控件。我相信存在一個解決方案,但令人驚訝的是,關於該主題的在線資源如此之少。很少有人會不同意有一個體面的自定義GUI是不值得的。 – smit 2012-03-27 17:45:07

回答

5

它可能是導致它的WM_ERASEBKGND消息嗎?

看到了這個問題:GDI+ double buffering in C++

另外,如果你需要從你的圖形用戶界面快速響應我會建議對GDI +。

+0

是的,我確實照顧過。 – smit 2012-03-27 17:51:20