我可以为兼容的DC创建多个位图吗?

时间:2013-08-06 18:46:50

标签: c++ winapi gdi

为一个DC创建两个位图是对的吗?

我的情况是我

 dc = CreateCompatibleDC(NULL); 
 bitmap = CreateDIBSection(dc, pbmi1, DIB_RGB_COLORS, (void **) &bmpBits, NULL, 0);
 extra_bitmap = CreateDIBSection(dc, pbmi2, DIB_RGB_COLORS, (void **) &extraBmpBits, NULL, 0);

不同之处在于:位图宽度为*高度,extra_bitmap为宽度/ 2 *高度* 2

我需要根据用户的要求在屏幕上显示两个图像。

我在上面尝试了这些代码,它可以运行(仅基于我的有限测试)。但我不确定这是否是正确的方法。欢迎提出任何建议和/或意见。谢谢。

顺便说一句,如果我可以将两个位图与一个DC相关联,那么释放它们的正确方法是什么?我可以拨打DeleteDC(dc)吗?谢谢。

3 个答案:

答案 0 :(得分:3)

当位图通过SelectObject被选中时,它们只与DC相关联。传递给CreateDIBSection的DC仅用于定义新创建的位图的布局/调色板,并且仅在某些情况下,但它不会不可逆转地将该位图与DC或类似的东西相关联。 / p>

要将位图绘制到窗口,需要将其选择为DC(“源DC”),这是您一次只能有一个。

例如:

HDC hdcTarget = GetDC(hWnd); // or hdcTarget = BeginPaint(...)
HDC hdcSource = CreateCompatibleDC(hdcTarget); // create a "source DC")
HGDIOBJ hOldBmp = SelectObject(dc, bitmap); // select bitmap 1 in
BitBlt(hdcTarget, x, y, w, h, hdcSource, 0, 0, SRCCOPY); // draw bitmap 1
SelectObject(hdcSource, extra_bitmap); // select bitmap 2 in
BitBlt(hdcTarget, x1, y1, w1, h1, hdcSource, 0, 0, SRCCOPY); // draw bitmap 2
SelectObject(hdcSource, hOldBmp); // restore previous bitmap
DeleteDC(hdcSource); // no longer needed
ReleaseDC(hWnd, hdcTarget); // or EndPaint(...)

答案 1 :(得分:0)

搜索了几个小时后,我得到了

http://www.ucancode.net/Visual_C_MFC_Samples/CreateDIBSection-BITMAPINFOHEADER-CreateCompatibleDC-BITMAPINFO.htm

在这个例子中:

// Create HDCs to hold our surfaces.
hdcSrc1 = CreateCompatibleDC(hdcDest);
if (!hdcSrc1) goto HANDLEERROR;

hdcSrc2 = CreateCompatibleDC(hdcDest);
if (!hdcSrc2) goto HANDLEERROR;

删除:

  DeleteDC(hdcSrc1);
  DeleteDC(hdcSrc2);
  DeleteObject(hbmSrc1);  // hbmSrc1 and hbmSrc2 are created using  hbm = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS,(void **)&pBits, NULL, 0);
  DeleteObject(hbmSrc2);

希望这对其他人有所帮助。感谢。

答案 2 :(得分:0)

您可以根据需要创建任意数量的内存中位图。

您可以根据需要创建任意数量的设备相关DC。

一次只能将一个位图选择为一个DC。如果您尝试将同一位图选择为多个DC,则会出现不可预测的行为。

DC一次只能选择一个位图,因为选择1位的行为会选择前一个位图。

当您的位图仍被选中时,请勿删除内存DC。您应该在DC中选择原始位图(单色1x1位图)以在删除DC之前取出位图。

当内存位图仍被选为DC时,请勿删除它。