スクリーンキャプチャしてBMP保存する方法を教えてください
ダイアログでボタンを押すとスクリーンキャプチャしてBMPファイルとして保存したいのですが、うまく動作しません。
どこがまずいのでしょうか?教えていただけると、嬉しいです。
void Test::OnScreenSave()
{
HDC hScreenDC;
HDC hMemDC;
HBITMAP hMemBmp;
int scrx, scry;
int xsize,ysize;
RECT rect;
HBITMAP hOld;
GetWindowRect(&rect);
scrx = GetSystemMetrics(SM_CXSCREEN);
scry = GetSystemMetrics(SM_CYSCREEN);
hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL);
xsize = rect.right -rect.left;
ysize = rect.bottom - rect.top;
hMemDC = CreateCompatibleDC(hScreenDC);
hMemBmp = CreateCompatibleBitmap(hScreenDC, xsize, ysize);
hOld = (HBITMAP)SelectObject(hMemDC, hMemBmp);
BitBlt(hMemDC, 0, 0, xsize, ysize, hScreenDC, rect.left, rect.top, SRCCOPY);
int nWid3 = (xsize * 3 + 3) & 0xfffffffc;
int nBmp = nWid3 * ysize;
BYTE *p = new BYTE[nBmp + 54];
SelectObject(hMemDC, hOld); // hMemBmpを非選択とする
int lines = GetDIBits(hMemDC, hMemBmp, 0, ysize,
(LPBYTE)(p + 54), (LPBITMAPINFO)(p + 14), DIB_RGB_COLORS);
// lines -> 0 となり、何もコピーされない。
if(OpenClipboard() != 0){
EmptyClipboard();
SetClipboardData(CF_BITMAP, hMemBmp); // この処理は正常に実行されている
CloseClipboard();
}
DeleteDC(hMemDC);
DeleteDC(hScreenDC);
delete [] p;
}
お礼
ご回答ありがとうございました。 例えば、あるビットマップがピクチャーコントロール1に表示されています。 これを50%に縮小したビットマップファイルを出力したい場合は、どのような手順になるのでしょうか? よろしくお願いいたしますm(__)m