2008-10-02 76 views
9

我有一個調整大小的對話框。它還具有一個自定義背景,我在響應WM_ERASEBKGND調用(當前是對FillSolidRect的簡單調用)中繪製了一個自定義背景。如何在Windows對話框中處理WM_ERASEBKGND時避免閃爍

當對話框調整大小時,會發生巨大的閃爍。爲了嘗試減少閃爍,我列舉了所有子窗口並將它們添加到剪輯區域。這似乎有一點幫助 - 現在閃爍現象在所有兒童控制器中都很明顯,因爲它們被重新繪製。

如何在調整大小時使對話框無閃爍?我懷疑雙緩衝必須發揮一部分,但我不知道如何做到這一點與兒童控制的對話(沒有使所有的孩子控制所有者繪製或類似的東西)。

我要指出,我使用C++(不是.NET)和MFC,雖然純基於Win32的解決方案,歡迎:)

注意:有一件事我試過,但沒有工作(不肯定爲什麼)是:

CDC memDC; 
memDC.CreateCompatibleDC(pDC); 
memDC.FillSolidRect(rect, backgroundColor); 

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); 

回答

8

假設「FillSolidRect」是你的背景的擦除然後從該WM_ERASEBKGND返回TRUE。

要執行您在代碼片段中幾乎要做的雙緩衝,您需要使用CreateCompatibleBitmap並將其選擇到您的memDC中。

3

雙緩衝確實是使這項工作的唯一方法。

只要您確認CLIPCHILDREN,子控件將自行照顧自己。

5

在WM_ERASEBKGND處理中不做任何事情,並將其作爲主WM_PAINT的一部分進行擦除。您可以更智能地繪畫,以便僅重繪無效區域,或者更簡單地雙重緩衝繪圖。

通過在擦除背景中不做任何事情,您可以將所有繪圖代碼放在一個位置,這樣可以讓其他人更容易跟蹤和維護。

6

嘗試添加下面一行到你的OnInitDialog函數:

ModifyStyle(0, WS_CLIPCHILDREN, 0); 
5

如果您的目標是WinXP或更高版本,則也可以使用WS_EX_COMPOSITED樣式爲默認情況下的頂級窗口啓用雙緩衝。請記住,這有其自己的一套限制 - 具體而言,不再使用GetDC繪製OnPaint週期等。

4

您可以將InvalidateRect方法的參數設置爲false。這將阻止您在窗口重新繪製時發送WM_ERASEBKGND。 Here是防止窗口閃爍的不錯鏈接。