如何重用HBITMAP句柄?

Mid*_*das 1 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);
Run Code Online (Sandbox Code Playgroud)

但也可以这样做吗?

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);
Run Code Online (Sandbox Code Playgroud)

但这只画了一个位图...

MSDN说:

SelectObject函数将对象选择到指定的设备上下文(DC)中.新对象替换相同类型的先前对象.

所以也许我被打电话hBmp后被浪费了SelectObject.但我把它复制到hBmp2第一个,然后是什么问题?

Sve*_*ven 5

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

所以第二个SelectObject失败是因为仍然在第一个中选择了位图HDC.

通过DeleteDCdrawBitmap函数末尾调用来清理自己(并在完成后调用DeleteObjecthBmp).

此外,该HBITMAP hBmp2 = hBmp;生产线完成任何事情.您只是将句柄分配给另一个变量.它仍然是相同位图的相同句柄.