0

为一个 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);

区别在于:位图为 width*height ,extra_bitmap 为 width/2*height*2

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

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

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

4

3 回答 3

3

位图仅在通过SelectObject. 您传递给的 DCCreateDIBSection仅用于定义新创建的位图的布局/调色板,并且仅在某些情况下,但它不会将该位图与 DC 或类似的东西不可撤销地关联。

要将位图绘制到窗口,需要将其选择到 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(...)
于 2013-08-06T19:54:30.840 回答
0

您可以创建任意数量的内存位图。

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

一次只能将位图选择到一个 DC 中。如果您尝试将同一个位图选择到多个 DC,那么您将获得不可预知的行为。

DC 永远不会一次将多个位图选择到其中,因为选择一个输入的行为会选择前一个输出。

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

不要在内存中的位图仍被选入 DC 时删除它。

于 2013-08-06T23:19:35.857 回答
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);

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

于 2013-08-06T20:05:44.797 回答