0
我想優化我的窗口繪畫。 想要在窗口中有靜態內容和動態內容。 靜態內容計算一次,並從創建的位圖繪製。GDI - 我可以在WM_PAINT調用之間將位圖保存在內存中嗎?
我用下一個算法:
/* !global object! HBITMAP hStaticBitmap */
PAINTSTRUCT ps = {};
HDC hdc = BeginPaint (hWnd, &ps);
//-------------------------------------------
HDC hStaticDC = CreateCompatibleDC (hdc);
if (hStaticBitmapChanged)
{
/* Create once */
if (hStaticBitmap)
DeleteObject (hStaticBitmap);
hStaticBitmap = CreateCompatibleBitmap (hdc, myRect.right - myRect.left,
myRect.bottom - myRect.top);
HBITMAP hBmp_old = (HBITMAP) SelectObject (hStaticDC, wd.hStaticBitmap);
//-------------------------------------
OnPaintStaticFigures (hStaticDC);
hStaticBitmapChanged = false;
//-------------------------------------
SetStretchBltMode (hdc, COLORONCOLOR);
BitBlt (hdc, 0, 0,
myRect.right - myRect.left,
myRect.bottom - myRect.top,
hStaticDC, 0, 0,
SRCCOPY);
//-------------------------------------
SelectObject (hStaticDC, hBmp_old);
}
else
{
/* Paint every time */
HBITMAP hBmp_old = (HBITMAP) SelectObject (hStaticDC, wd.hStaticBitmap);
//-------------------------------------
SetStretchBltMode (hdc, COLORONCOLOR);
BitBlt (hdc, 0, 0,
myRect.right - myRect.left,
myRect.bottom - myRect.top,
hStaticDC, 0, 0,
SRCCOPY);
//-------------------------------------
SelectObject (hStaticDC, hBmp_old);
}
HDC hCmpDC = CreateCompatibleDC (hdc);
HBITMAP hBmp = CreateCompatibleBitmap (hdc, myRect.right - myRect.left,
myRect.bottom - myRect.top);
SelectObject (hCmpDC, hBmp);
//-------------------------------------
OnPainDynamicFigures (hCmpDC, wd);
//-------------------------------------
SetStretchBltMode (hdc, COLORONCOLOR);
BitBlt (hdc, 0, 0,
myRect.right - myRect.left,
myRect.bottom - myRect.top,
hCmpDC, 0, 0,
SRCCOPY);
DeleteDC (hStaticDC);
DeleteDC (hCmpDC);
DeleteObject (hBmp);
//---------------------------------------------
EndPaint (hWnd, &ps);
的問題是:hStaticBitmap被刪除hStaticDC後清零。 如何處理?
謝謝
編輯:
現在我不知道,這是因爲在hStaticDC的。我已經使hStaticDC成爲全球性的。但是我可以看到黑色背景,第二個位圖擦除了第一個。我嘗試了另一種重疊模式,並且使用全局hdc顯示了兩個位圖。
我想改變我的問題:如何使一個位圖沒有backgraoud?