【发布时间】:2015-11-08 16:50:09
【问题描述】:
我希望加快位图显示程序的速度。它不是非常慢,我只是认为它可以更快。我在 Win32 环境中运行它。代码如下:
void load(LPCWSTR file, int i) {
hBitmap[i] = (HBITMAP)::LoadImage(NULL, file, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
GetObject(hBitmap[i], sizeof(BITMAP), (LPSTR)&hSize[i]);
}
void newBit(int i, int x, int y, HDC hdc) {
BITMAP Bitmap = hSize[i];
HBITMAP hBit = hBitmap[i];
HDC hDCBits = CreateCompatibleDC(hdc);
SelectObject(hDCBits, hBit);
StretchBlt(hdc, x, y, Bitmap.bmWidth, Bitmap.bmHeight,
hDCBits, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, SRCCOPY);
DeleteDC(hDCBits);
}
我在开始时运行“加载”功能,我可以接受需要多长时间。每当在程序中需要时,我都会运行 newBit 函数。我特别使用了 stretchBlt 命令,因为我需要调整大小的能力。任何对我做错了什么以及我可以改进的地方的见解将不胜感激。
【问题讨论】:
-
您需要将
SelectObject(hDCBits, hBit);的结果保存到HBITMAP,然后在删除HDC 之前将其选回hDCBits。不这样做会导致资源泄漏。 GDI 句柄是有限的资源。此外,由于您正在缓存已加载的图像 - 您应该添加另一个变量,以便您只创建和销毁一次 HDC。您可以通过调用GetCurrentObject(hDCBits, OBJ_BITMAP);来获取其中选择的初始位图,这样 (a) 您只需保存一次副本,并且 (b) 您可以在最终销毁 HDC 之前恢复此位图。
标签: c++ winapi bitmap gdi stretchblt