// ■クリップボードの画像をBMPファイルに出力 //  最初、キーボード右上付近にある「prt sc」をクリックしてから実行します。 // 画面キャプチャした結果が表示されますので、左ボタンをクリックして // 出力ファイル名を指定します。 // #include "myWin.h" #define IMAGE_WIDTH 1920 #define IMAGE_HEIGHT 1080 static HANDLE hF; static HBITMAP hB; static OPENFILENAME CC; static TCHAR strFile[2048],strFileTitle[128]; static TCHAR sFilter[]=TEXT("BMP Files\0*.bmp\0All Files\0*.*\0"); static BITMAPFILEHEADER bmpFileHeader;static HDC hBuff, hdc; static BITMAP bitmap; static BYTE *pbPixBit; static BITMAPINFO *pBmpInfo; static long width, height, imageSize, mCtab,nBmi,nImage; void procDIBCreate(HWND hw){ int nBit=GetObject(hB,sizeof(bitmap),(PVOID) &bitmap); switch(bitmap.bmBitsPixel){ case 1: mCtab= 2; break; case 4: mCtab= 16; break; case 8: mCtab=256; break; case 24: case 32: mCtab= 0; break;// DDBが32ビットのときもある } nBmi=sizeof(RGBQUAD)*mCtab; nImage=(((bitmap.bmWidth*bitmap.bmBitsPixel)+31)/8)*bitmap.bmHeight; pBmpInfo=(BITMAPINFO *)malloc(nBmi+nImage); pbPixBit=((BYTE *)pBmpInfo+nBmi); // BMPファイルヘッダ bmpFileHeader.bfType = 0x4D42; bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER)+nBmi+nImage + sizeof(BITMAPINFOHEADER); bmpFileHeader.bfReserved1 = bmpFileHeader.bfReserved2 = 0; bmpFileHeader.bfOffBits = nBmi+sizeof(BITMAPINFOHEADER); // BMP情報ヘッダ pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); pBmpInfo->bmiHeader.biWidth = bitmap.bmWidth; pBmpInfo->bmiHeader.biHeight = bitmap.bmHeight; pBmpInfo->bmiHeader.biPlanes = 1; pBmpInfo->bmiHeader.biBitCount = //DDBが32ビットのとき24ビットに bitmap.bmBitsPixel==32 ? 24 : bitmap.bmBitsPixel; pBmpInfo->bmiHeader.biCompression = BI_RGB; pBmpInfo->bmiHeader.biSizeImage = 0; pBmpInfo->bmiHeader.biXPelsPerMeter= 0; pBmpInfo->bmiHeader.biYPelsPerMeter= 0; pBmpInfo->bmiHeader.biClrUsed = mCtab; pBmpInfo->bmiHeader.biClrImportant = mCtab; // ピクセルデータおよび色テーブル取得 pbPixBit=(BYTE *)malloc(nImage+nBmi); hdc=GetWindowDC(hw); GetDIBits(hdc, hB, 0, bitmap.bmHeight, (LPVOID)pbPixBit ,pBmpInfo, DIB_RGB_COLORS); ReleaseDC(hw,hdc); } void procWrite(BYTE *DT, DWORD N){ DWORD dwWriteSize; WriteFile(hF,DT,N,&dwWriteSize,NULL); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ if(OpenClipboard(hw))hB = (HBITMAP)GetClipboardData(CF_BITMAP); CloseClipboard(); CC.lStructSize=sizeof(OPENFILENAME); CC.hwndOwner=hw ; CC.hInstance=hInstance; CC.lpstrFilter=sFilter ; CC.nFilterIndex=1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile=strFile ; CC.nMaxFile=2048; CC.lpstrFileTitle=strFileTitle ; CC.nMaxFileTitle=128; CC.lpstrInitialDir=TEXT("D:\\"); CC.lpstrTitle=TEXT("テストだよ") ; CC.lpstrDefExt=TEXT("bmp") ; CC.Flags=0; InvalidateRect(hw,NULL,TRUE) ; } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(GetSaveFileName(&CC)){ hF=CreateFile(strFile,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hF==INVALID_HANDLE_VALUE) MessageBox(hw,TEXT("ファイルオープンエラー"),TEXT("エラー"),MB_OK); else{ procDIBCreate(hw); procWrite((BYTE *)&bmpFileHeader,sizeof(BITMAPFILEHEADER)); procWrite((BYTE *)pBmpInfo ,sizeof(BITMAPINFOHEADER)); procWrite((BYTE *)pbPixBit ,nBmi+nImage); FlushFileBuffers(hF); CloseHandle(hF); free(pbPixBit); free(pBmpInfo); } } InvalidateRect(hw,NULL,TRUE); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ POINT pt[1]; PAINTSTRUCT ps;TCHAR str[255]; hdc=BeginPaint(hw,&ps); hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hB); BitBlt(hdc,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,hBuff,0,0,SRCCOPY); DeleteDC(hBuff); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate (hw, wp,lp); return 0; case WM_LBUTTONUP: procLButtonUp(hw, wp,lp); return 0; case WM_PAINT : procPaint (hw, wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); }