関数の設計に問題があり、適切な解決策が見つかりません (私は 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
作成された usingは、CreateDIBSection
実際には最初のピクセルの値へのポインターです (よく理解していれば)。
次に、単純なループを使用できます。
for (int i = 0; i >= 0; i++) {
cout << i << ": " << (int)screenCapture(1366, 768).bitPointer[0] << endl;
}
これが私の問題です。
hBitmap
呼び出して解放するDeleteObject(hBitmap)
必要があります。そうしないと、メモリスペースがなくなります (そして、ループが最終的にクラッシュします)。
しかし、私はそれをどこで行うべきかわかりません。
関数内で実行したいのですが、 を呼び出すDeleteObject()
と、これも破棄されるため、返されたオブジェクトbitPointer
からピクセルにアクセスできなくなります。Image
実際、bitPointer
変数がポインターであるという事実に少し混乱しています。後で破壊されるのを防ぐためにコピーできないことを意味します。解決策が見つかりません。
私が試した2つの解決策:
DeleteObject()
my classを呼び出すデストラクタを作成しますImage
。
デストラクタはループ内だけでなく関数から呼び出されるため、機能しませんでした。HBITMAP hBitmap
クラスに属性を追加し、ループ内からImage
呼び出します。 それは本当に便利ではありません。さらに、新しい Image オブジェクトを宣言する必要があり、私が書いたループのように匿名で行うことはできません。DeleteObject()
それで、私は立ち往生しています。誰か助けてもらえますか?