如何重用HBITMAP句柄?

时间:2011-06-05 06:36:01

标签: c winapi

我必须多次绘制位图。它是从文件加载的。每次我必须以SelectObject方式使用它时,我可以重新加载它:

void drawBitmap(HWND hWnd, int xPos, int yPos) {
    HBITMAP hBmp = (HBITMAP) LoadImage(NULL, "image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    HDC hDC = GetDC(hWnd);
    HDC hdcMem = CreateCompatibleDC(hDC);
    SelectObject(hdcMem, hBmp);
    BitBlt(hDC, xPos, yPos, 7, 7, hdcMem, 0, 0, SRCCOPY);
}
drawBitmap(hMainWnd, 0, 0);
drawBitmap(hMainWnd, 14, 0);
drawBitmap(hMainWnd, 28, 0);

但也可以做这样的事情吗?

HBITMAP hBmp = (HBITMAP) LoadImage(NULL, "image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
void drawBitmap(HWND hWnd, int xPos, int yPos) {
    HBITMAP hBmp2 = hBmp;
    HDC hDC = GetDC(hWnd);
    HDC hdcMem = CreateCompatibleDC(hDC);
    SelectObject(hdcMem, hBmp2);
    BitBlt(hDC, xPos, yPos, 7, 7, hdcMem, 0, 0, SRCCOPY);
}
drawBitmap(hMainWnd, 0, 0);
drawBitmap(hMainWnd, 14, 0);
drawBitmap(hMainWnd, 28, 0);

但这只会绘制一个位图......

MSDN说:

  

SelectObject函数选择一个   对象进入指定的设备   上下文(DC)。新对象替换   相同类型的上一个对象。

因此,在hBmp被调用后,我的SelectObject可能会被浪费掉。但我先把它复制到hBmp2,那么问题是什么?

1 个答案:

答案 0 :(得分:5)

完成后,您不会删除内存DC。这意味着DC泄漏,并且仍然在泄漏的DC中选择位图。并且根据SelectObject文档:“应用程序无法一次将一个位图选择为多个DC。”

因此第二个SelectObject失败,因为仍然在第一个HDC中选择了位图。

通过调用DeleteDC函数末尾的drawBitmap来清理自己(并在完成后再调用hBmp上的DeleteObject)。

此外,HBITMAP hBmp2 = hBmp;行没有任何结果。您只是将句柄分配给另一个变量。它仍然是相同位图的相同句柄。