我的功能设计有一些问题,我没有找到合适的解决方案(我是 C++ 的初学者)。
几天前,我问了另一个与此相关的问题。
所以,我有一个功能可以进行屏幕截图。它完美地工作。事实是我希望这个函数Image
从我实现的类中返回一个对象。
基本上,它是:
class Image {
public:
BYTE *bitPointer;
int width;
int height;
};
我的功能是这样的:
Image screenCapture(int width, int height) {
HDC hdcTemp, hdc;
BYTE* bitPointer;
hdc = GetDC(HWND_DESKTOP);
hdcTemp = CreateCompatibleDC(hdc);
BITMAPINFO bitmap;
bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
bitmap.bmiHeader.biWidth = width;
bitmap.bmiHeader.biHeight = -height;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 24;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = 0;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;
HBITMAP hBitmap = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
SelectObject(hdcTemp, hBitmap);
BitBlt(hdcTemp, 0, 0, width, height, hdc, 0, 0, SRCCOPY);
ReleaseDC(HWND_DESKTOP, hdc);
DeleteDC(hdcTemp);
Image screen;
screen.bitPointer = bitPointer;
screen.width = width;
screen.height = height;
return screen;
}
bitPointer
创建的usingCreateDIBSection
实际上是指向我的第一个像素值的指针(如果我理解得很好的话)。
然后,我可以使用一个简单的循环:
for (int i = 0; i >= 0; i++) {
cout << i << ": " << (int)screenCapture(1366, 768).bitPointer[0] << endl;
}
这是我的问题。
我必须hBitmap
通过调用来释放,DeleteObject(hBitmap)
否则我将没有更多的内存空间(循环最终崩溃)。
但是,我不知道在哪里做。
我想在我的函数中执行此操作,但如果我调用DeleteObject()
,那么它也会破坏我的bitPointer
,因此我将无法从Image
返回的对象中访问像素。事实上,我对我的bitPointer
变量是指针这一事实有点困惑。这意味着我不能复制它以防止它被破坏。我找不到解决方案。
我尝试过的两种解决方案:
- 创建一个调用
DeleteObject()
我的类的析构函数Image
。
它不起作用,因为析构函数是从函数调用的,而不仅仅是从我的循环内部调用的。 HBITMAP hBitmap
向我的 class添加一个属性Image
,并DeleteObject()
从我的循环内部调用。
这不是很方便,而且我必须声明一个新的 Image 对象,我不能像我写的循环那样匿名。
所以,我被卡住了,有人可以帮我吗?