我想优化我的窗口绘画。 想要在窗口中拥有静态内容和动态内容。 静态内容计算一次,并从创建的位图绘制。
我正在使用下一个算法:
/* !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);
问题是:删除hStaticDC后清除hStaticBitmap。
如何处理?
谢谢
修改
现在我不确定,因为hStaticDC会发生这种情况。我让hStaticDC成为全球性的。但我可以看到黑色背景,第二个位图擦除第一个位图。我尝试了另一种重叠模式,并使用全局hdc显示两个位图。
我想改变我的问题:如何使位图没有背景光?
答案 0 :(得分:0)
工作变体:使用较低层作为上层的背景!
/* !global object! HBITMAP hStaticBitmap */
/* !global object! HBITMAP hStaticDC */ // !!!global
PAINTSTRUCT ps = {};
HDC hdc = BeginPaint (hWnd, &ps);
//-------------------------------------------
if ( hStaticBitmapChanged )
{
/* Create once */
if ( !hStaticDC ) // !!!global
hStaticDC = CreateCompatibleDC (hdc);
if (hStaticBitmap)
DeleteObject (hStaticBitmap);
hStaticBitmap = CreateCompatibleBitmap (hdc, myRect.right - myRect.left,
myRect.bottom - myRect.top);
SelectObject (hStaticDC, hStaticBitmap);
//-------------------------------------
OnPaintStaticFigures (hStaticDC);
hStaticBitmapChanged = false;
//-------------------------------------
}
HDC hCmpDC = CreateCompatibleDC (hdc);
HBITMAP hBmp = CreateCompatibleBitmap (hdc, myRect.right - myRect.left,
myRect.bottom - myRect.top);
SelectObject (hCmpDC, hBmp);
//-------------------------------------
/* Paint every time */
SetStretchBltMode (hCmpDC, COLORONCOLOR); // !!! hCmpDC
BitBlt ( hCmpDC , 0, 0, // !!! hCmpDC
myRect.right - myRect.left,
myRect.bottom - myRect.top,
hStaticDC, 0, 0,
SRCCOPY);
//-------------------------------------
OnPainDynamicFigures (hCmpDC, wd);
//-------------------------------------
SetStretchBltMode (hdc, COLORONCOLOR);
BitBlt (hdc, 0, 0,
myRect.right - myRect.left,
myRect.bottom - myRect.top,
hCmpDC, 0, 0,
SRCCOPY);
// DeleteDC (hStaticDC); /* later */
// DeleteObject (hStaticBitmap); /* later */
DeleteDC (hCmpDC);
DeleteObject (hBmp);
//---------------------------------------------
EndPaint (hWnd, &ps);