2011-01-05 71 views
1

我試圖用雙緩衝來快速更新文本。我在位圖頂部繪製文本並將其粘貼到屏幕上。但是,文字從未被覆蓋,因爲越來越多,所以在它被覆蓋的字母之前只是一堆難以理解的混亂。這裏是我的雙緩衝程序:雙緩衝時如何掩蓋舊文本? - Win32 C++

void PaintControlWindow() 
{ 
    HDC hdc,hdcMemory; 
    RECT rect; 
    HBITMAP bitmap; 
    HBRUSH backgroundBrush; 

    hdc = GetDC(windowHwnd); //windowHwnd is a valid global 
    GetClientRect(windowHwnd,&rect); 
    hdcMemory = CreateCompatibleDC(hdc); 
    bitmap = CreateCompatibleBitmap(hdc, 800, 600); 
    backgroundBrush = CreateSolidBrush(RGB(200,189,156)); 
    SelectObject(hdcMemory, bitmap); 
    FillRect(hdcMemory,&rect,backgroundBrush); 

    HDC hdcMemory2 = CreateCompatibleDC(hdcMemory); 
    SelectObject(hdcMemory2,previouslyLoadedBitmap); 

    SelectObject(hdcMemory2,previouslyCreatedFont); 
    DrawTextEx(hdcMemory2,sometext,strlen(sometext),&bitmapBounds,DT_CENTER | DT_SINGLELINE, NULL); 

    BitBlt(hdcMemory, bitmapBounds.left, bitmapBounds.top, bitmapBounds.right, bitmapBounds.bottom, hdcMemory2, 0,0, SRCCOPY); 

    DeleteDC(hdcMemory2); 

    BitBlt(hdc, rect.left, 0, rect.right, rect.bottom, hdcMemory, rect.left, 0, SRCCOPY); 
    DeleteDC(hdcMemory); 
    DeleteObject(bitmap); 
    DeleteObject(backgroundBrush); 
    ReleaseDC(windowHwnd,hdc); 
} 

如果我做了FillRect在bitmapBounds矩形:其中我畫的文字一切都很好,除了這應該是下面的文字被掩蓋的位圖。

謝謝。

+1

是否真的需要hdcMemory2?除非我誤以爲你不能在hdcMemory中完成所有的離屏渲染,並且只是把它放到窗口的DC上?另外,在這一點上處理WM_PAINT消息和blit hdcMemory是不是更好,保持此功能只是在必要時更新內存直流(然後使窗口無效以產生WM_PAINT)? – 2011-01-05 13:05:58

+0

@ Moo-Juice,我認爲是。我還在屏幕上繪製了一些帶有文本的其他位圖,但我只是在這裏給出了一個來簡化代碼。 WM_PAINT不適用於我;我正在繪製的值每秒由計時器更新10-20次,並且顯示必須與這些值保持同步。我認爲事件不能保證精確性。爲了記錄,我不會每次繪製都調用CreateCompatibleBitmap,我只是在創建窗口時執行一次。 – Luke 2011-01-05 17:17:06

回答

1

我認爲Moo-Juice的意見是相關的,你應該考慮幾種方法。但是,你的問題的根源很容易解釋。

你一般正確的想法是,你應該:

  1. 已經在DC預裝的背景(如hdcMemory2),這樣就不必保持重裝它。

  2. 複製DC位圖到另一個存儲在這個DC

  3. 複製新的DC

  4. 繪製文本屏幕

但是您目前的代碼不會做 - 當你繪製文本到hdcMemory2(其中有以前加載的BM)時,這會改變這個位圖的內容 - 這不是你想要的。爲了達到此目的,您需要保持hdcMemory2不變,將其內容複製到hdcMemory中,然後將文本繪製到hdcMemory上(從而保留原始圖像並僅與臨時副本相混淆)。然後顯然將其複製到屏幕上。

+0

謝謝!我沒有意識到寫在hdcMemory2實際上寫在那裏加載的位圖。 – Luke 2011-01-05 17:08:20