[英]GDI - Can I save the bitmap in memory between WM_PAINT calls?
我想优化我的窗户画。 要在窗口中具有静态内容和动态内容。 静态内容仅计算一次,并从创建的位图进行绘制。
我正在使用下一个算法:
/* !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显示了两个位图。
我想更改我的问题:如何制作没有背景色的位图?
工作变体:使用下层作为上层的背景!
/* !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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.