2011-09-21 100 views
4

我有一個win32應用程序,它是用C++開發的。應用程序使用基本形狀(矩形)在窗口上繪製一些東西。使用InvalidateRect每20ms(50hz)重新繪製窗口。所有的作品都很好,但圖畫閃爍。我如何防止閃爍?在C#中,我通常使用雙緩衝組件(如pictureBox),我怎麼能擺脫這在c + +中使用win32?繪圖不閃爍

回答

4

你也可以很容易地在Win32中實現雙緩衝。假設您正在使用其設備上下文直接在窗口上繪畫,請改爲:

創建一個「內存」設備上下文,並在該設備上下文中執行所有繪圖,然後將該窗口的無效部分複製到實際的設備上下文在適當的時候,使用BitBlt()功能

有一個相當不錯的(雖然高電平)概述here.

+0

選擇此答案,因爲它是唯一的例子 – blejzz

5

您可以創建一個內存設備上下文,繪製這些形狀給它(就像你到窗口的設備上下文),然後在窗口無效時從窗口的設備上下文中blit。

在繪圖發生之前,您還需要禁用背景清除(適當處理WM_ERASEBKGND窗口消息)。

編輯:我偶然發現了一個關於GDI中無閃爍繪圖的非常詳盡的tutorial,它解釋了Windows繪圖的所有方面並附帶示例。

+0

非常漂亮的教程謝謝! – blejzz

+0

+1 WM_ERASEBKGND提示非常重要。當我錯了我的答案時,我忘記了這一點。 –

3

您也可以在C++中加倍使用緩衝區。

當您得到DC繪製到,您創建一個離屏位圖(CreateCompatibleBitmap)和一個內存DC(CreateCompatibleDC)。把你所有的繪畫都做到這個DC上。最後,從內存DC到實際DC執行BitBlt。

爲了提高性能,您可能需要緩存離屏位圖和DC,但請記住在窗口大小更改時重新創建它們。