この記事は3年以上前に書かれた記事です。情報が古い可能性があります。
いわゆるスクリーンショットを撮るみたいなもの。
void SaveBitmap(HDC hdc, DWORD dwWidth, DWORD dwHeight, LPCTSTR lpszFn)
{
DWORD dwSize,dwFSize,dwLength;
HANDLE fh;
LPBITMAPFILEHEADER lpHead;
LPBITMAPINFOHEADER lpInfo;
LPBYTE lpBuf,lpPixel;
RECT rec;
HDC hdcMem;
HBITMAP hBMP,hOld;
if ((dwWidth*3) % 4==0) /* バッファの1ラインの長さを計算 */
dwLength=dwWidth*3;
else
dwLength=dwWidth*3+(4-(dwWidth*3) % 4);
/* 書き込み用バッファのサイズ計算 */
dwFSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwLength*dwHeight;
/* バッファ確保とポインタ設定 */
lpBuf=(LPBYTE)GlobalAlloc(GPTR,dwFSize);
lpHead=(LPBITMAPFILEHEADER)lpBuf;
lpInfo=(LPBITMAPINFOHEADER)(lpBuf+sizeof(BITMAPFILEHEADER));
lpPixel=lpBuf+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
/* 24ビットBMPファイルのヘッダ作成 */
lpHead->bfType='M'*256+'B';
lpHead->bfSize=dwFSize;
lpHead->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
lpInfo->biSize=sizeof(BITMAPINFOHEADER);
lpInfo->biWidth=dwWidth;
lpInfo->biHeight=dwHeight;
lpInfo->biPlanes=1;
lpInfo->biBitCount=24;
/* ウインドウのデバイスコンテキスト互換のBITMAP作成 */
hBMP=CreateCompatibleBitmap(hdc,dwWidth,dwHeight);
/* BITMAPにウインドウのクライアント領域をコピー */
hdcMem=CreateCompatibleDC(hdc);
hOld=(HBITMAP)SelectObject(hdcMem,hBMP);
BitBlt(hdcMem,0,0,dwWidth,dwHeight,hdc,0,0,SRCCOPY);
SelectObject(hdcMem,hOld);
GetDIBits(hdc,hBMP,0,dwHeight,lpPixel,(LPBITMAPINFO)lpInfo,DIB_RGB_COLORS);
//ReleaseDC(hwnd,hdc);
DeleteObject(hBMP);
DeleteObject(hdcMem);
/* バッファをファイルに書き出す */
fh=CreateFile(lpszFn,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(fh,lpBuf,dwFSize,&dwSize,NULL);
CloseHandle(fh);
GlobalFree(lpBuf);
}
という関数をつくって、以下のようにやる。
HDC hDC = GetDC( hWnd );
SaveBitmap( hDC, 1024, 1024, ".\\test.bmp" );
ReleaseDC(hWnd , hDC);
hWnd は画面のウィンドウハンドル。