2011-05-27 48 views
0

我在此程序中使用BitBlt時遇到問題。您調整窗口大小並調整橢圓大小。當然,用正常的HDC方法,它是波濤洶涌,波濤洶涌。我嘗試了BitBlt方法,但這也不起作用(可能是因爲我做錯了)。 有人可以解決我什麼我donig錯了嗎?感謝名單BitBlt問題GDI

bool sizing; //global 
case WM_PAINT: 
    { 
     RECT rect; 
     GetClientRect(hwnd, &rect); 
     hdc = BeginPaint(hwnd, &ps); 
     mem = CreateCompatibleDC(hdc); 
     SelectObject(mem, GetStockObject(HOLLOW_BRUSH)); 
     if(sizing) 
     { 
     Ellipse(mem,rect.left, rect.top, rect.right, rect.bottom); 
     } 
    BitBlt(hdc, rect.left, rect.top, rect.left - rect.right, rect.top -rect.bottom , mem, rect.left, rect.top, SRCCOPY); 
     DeleteDC(mem); 
     EndPaint(hwnd, &ps); 
     break; 
    } 
    case WM_SIZE: 
     sizing = true; 
     break; 
+0

您必須處理WM_ERASEBKGND以避免閃爍。 – 2011-05-27 00:42:19

回答

6

它看起來像你想畫一個基於內存的位圖,然後塊傳送是在屏幕上,避免閃爍?

這裏的第一個問題是處理閃爍問題:首先,你需要重寫WM_ERASEBKGND,正如漢斯指出的那樣 - 否則Windows將使用任何窗口刷子(來自RegisterClass)擦除背景,並且擦除通常是閃爍的原因。

這裏的下一個問題是您使用'空'DC:CreateCompatibleDC給你一個DC - 這只是一個繪圖上下文 - 但上下文包含1個像素1像素的位圖。要畫外屏,需要一個DC 位圖。請花時間閱讀the MSDN page for CreateCompatible--它會調出這個確切的問題。

如果您不熟悉這一點,請將位圖視爲您繪製的實際畫布 - DC僅作爲執行該繪製的支持結構。當你的代碼站立時,你已經設置了畫架和油漆刷 - 但你沒有繪製任何東西。這裏

通常的做法是:

  • CreateCompatibleDC創建DC
  • CreateCompatibleBitmap創建一個你會真正吸取到
  • 選擇對象的新位圖到內存DC
  • 繪製位圖到內存DC - 它在你選擇的位圖上繪製它
  • BitBlt從內存DC(即你的位圖,它被選中)到WM中的一個_PAINT
  • 清理:SelectObject將原始位圖重新放回內存DC中,並刪除位圖和DC。