以前、http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=2068
で教えていただいたことなどを元に、下記のソースで、スクリーンショットの
画像ハンドル(LoadGraphでそのまま描画できる形式)が作成できそうだと
思ったのですが、うまくいきません。
また、backの値は0ではなく、shを返させてみてDrawSoftImageも試しましたが
共に表示されませんでした。
特にGetScreenShotの方が怪しそうなので、間違っているところの
ご指摘をよろしくお願いします。
int back=GetScreenShot(800,600);
DrawGraph(0,0,back,false);
int GetScreenShot(int _width,int _height)
{
HDC hdc_wnd=GetDC(NULL);
HBITMAP bitmap=CreateCompatibleBitmap(hdc_wnd,_width,_height);
HDC hdc_bmp=CreateCompatibleDC(hdc_wnd);
/// ハンドルにビットマップを設定
SelectObject(hdc_bmp, bitmap);
/// スクリーンをビットマップに描画
BitBlt(hdc_bmp, 0, 0, _width, _height, hdc_wnd, 0,0, SRCCOPY);
int retval=ConvertGraph(bitmap);
DeleteDC(hdc_bmp);
DeleteObject(bitmap);
ReleaseDC(NULL,hdc_wnd);
return retval;
}
int ConvertGraph(HBITMAP hBmp)
{
// DIBセクションの取得
BITMAP DDBInfo;
BITMAPINFO DIBInfo;
GetObject( hBmp, sizeof(BITMAP), &DDBInfo );
DIBInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
DIBInfo.bmiHeader.biWidth = DDBInfo.bmWidth;
DIBInfo.bmiHeader.biHeight = DDBInfo.bmHeight;
DIBInfo.bmiHeader.biPlanes = 1;
DIBInfo.bmiHeader.biBitCount = 32;
DIBInfo.bmiHeader.biCompression = BI_RGB;
BYTE *pData = new BYTE[DDBInfo.bmWidth * DDBInfo.bmHeight * 4];
HDC hDC = GetDC(NULL);
GetDIBits( hDC, hBmp, 0, DDBInfo.bmHeight, (void*)pData, &DIBInfo, DIB_RGB_COLORS);
ReleaseDC(NULL, hDC );
DeleteObject( hBmp );
// ソフトイメージに変換してみる
int sh = MakeXRGB8ColorSoftImage( DDBInfo.bmWidth, DDBInfo.bmHeight );
BYTE *Dots = pData;
for ( int y = DDBInfo.bmHeight - 1; y >= 0 ; y-- ) { // データは上下さかさまらしい
for ( int x = 0; x < DDBInfo.bmWidth; x++ ) {
DrawPixelSoftImage( sh, x, y, *(Dots+2), *(Dots+1), *(Dots+0), *(Dots+3) );
Dots += 4;
}
}
// ハンドルに変換してみる
int gh = CreateGraphFromBmp( &DIBInfo, pData ); // やってみたらうまくいきました。
delete pData; // ReCreateGraphするときに必要かも。
return gh;
}
追記:ヘッダに
int BltBmpToGraph( COLORDATA *SrcColor, HBITMAP Bmp, HBITMAP AlphaMask,int CopyPointX, int CopyPointY, int GrHandle) ; 画像データの転送
というのを見つけました。
試してみて使い方がよくわからなかったですが、これは使えないですか?