Win32 のグラフィック操作系のメモ †DC の内容をファイルに保存 †こんな具合に。 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); } ex.) hDC = GetDC( hWnd ); SaveBitmap( hDC, 1024, 1024, ".\\test.bmp" ); |