У меня есть некоторые проблемы с моим дизайном для функции, и я не могу найти правильное решение (я довольно новичок в 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
создан с использованием CreateDIBSection
на самом деле указатель на значение моего первого пикселя (если я правильно понял).
Затем я могу использовать простой цикл:
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
в мой класс Image
и позвоните DeleteObject()
из моей петли.Итак, я застрял, кто-нибудь может мне помочь, пожалуйста?
Вы можете передать hBitmap в качестве аргумента функции screenCapture.
screenCapture(int width, int height, HBITMAP& hBitmap)
Таким образом, вы можете уничтожить его, когда захотите, не мешая членам Image. Вы объявляете «пустой» hBitmap снаружи скриншот функция и передать его в качестве аргумента. Функция будет использовать ссылку для создания объекта, и вы сможете уничтожить его вне screenCapture после того, как закончите с использованием bitPointer ценности.
если ты необходимость сохраняя все скриншоты, вам нужно реализовать рабочий буфер, так как у вас ограниченный объем памяти.