[Visual C++] デバイスコンテキストの内容をファイルに出力する方法

この記事は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 は画面のウィンドウハンドル。

タイトルとURLをコピーしました