我必须多次绘制位图。它是从文件加载的。每次我必须以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
,那么问题是什么?
答案 0 :(得分:5)
完成后,您不会删除内存DC。这意味着DC泄漏,并且仍然在泄漏的DC中选择位图。并且根据SelectObject
文档:“应用程序无法一次将一个位图选择为多个DC。”
因此第二个SelectObject
失败,因为仍然在第一个HDC
中选择了位图。
通过调用DeleteDC
函数末尾的drawBitmap
来清理自己(并在完成后再调用hBmp上的DeleteObject
)。
此外,HBITMAP hBmp2 = hBmp;
行没有任何结果。您只是将句柄分配给另一个变量。它仍然是相同位图的相同句柄。