• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:実行結果をBMP形式で保存したい。)

MFCでの実行結果をBMP形式で保存する方法

このQ&Aのポイント
  • MFCのOnDrawで描画した実行結果をBMP形式で保存する方法についてアドバイスをいただきたいです。
  • BitBlt、CreateCompatibleDC、GetDCなどの関数を使用して実行結果を保存する方法について詳しく教えてください。
  • 初心者向けの参考書や指導者に相談すれば、MFCで実行結果をBMP形式で保存する方法がわかるかもしれません。アドバイスや紹介をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • flowergoo
  • ベストアンサー率38% (13/34)
回答No.1

出来てしまえば割と簡単ですが、道のりは近くないです。 私も以前書籍などを探し、akagenoanfanさんと同じような事で困っていた時期がありました。 実証済みの関数を上げさせていただきます 呼び出し部 SaveBitmap(this->m_CapDisp.m_hWnd, "TEST1.BMP"); // ビットマップの保存 ※引数1でCDC描画元のウインドウハンドルを渡します ※引数2でファイル名を渡します 関数部 //////////////////////////////////// // ビットマップファイルのファイル保存 // void SaveBitmap(HWND hWnd, LPCTSTR sFileName) { HANDLE hFile; HDC hDc, hDcBuf; LPBITMAPFILEHEADER lpHead; LPBITMAPINFOHEADER lpInfo; LPBYTE lpBuf, lpPixel; RECT cRect; HBITMAP hBmp, hOldBmp; DWORD nWriteSize, nFileSize, nWidth, nHeight, nLength; GetClientRect(hWnd, &cRect); // 画面サイズの取得 nWidth = cRect.right; //幅 nHeight = cRect.bottom; //高さ if( ( nWidth * 3 ) % 4 == 0 ) // ライン長を計算 nLength = nWidth * 3; else nLength = nWidth * 3 + ( 4 - ( nWidth * 3 ) % 4 ); // ファイルサイズの計算 nFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nLength * nHeight; // 一時メモリの確保と各種情報のセット lpBuf = (LPBYTE)GlobalAlloc(GPTR, nFileSize); // バッファの確保 lpHead = (LPBITMAPFILEHEADER)lpBuf; // ファイルヘッダ情報 lpInfo = (LPBITMAPINFOHEADER)(lpBuf + sizeof(BITMAPFILEHEADER));//その他情報 lpPixel = lpBuf + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//ピクセルの取得 // ビットマップ情報のセット lpHead->bfType = 'M' * 256 + 'B'; lpHead->bfSize = nFileSize; lpHead->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); lpInfo->biSize = sizeof(BITMAPINFOHEADER); lpInfo->biHeight = nHeight; lpInfo->biWidth = nWidth; lpInfo->biBitCount = 24; lpInfo->biPlanes = 1; // DCの取得とBMB情報のセット hDc = GetDC(hWnd); // DCの取得 hBmp = CreateCompatibleBitmap(hDc, nWidth, nHeight); // DC互換のBMPを作成 hDcBuf = CreateCompatibleDC( hDc ); // DC互換のDCバッファを作成 // BMBのコピー hOldBmp = (HBITMAP)SelectObject( hDcBuf, hBmp ); // 旧BMPの待避 BitBlt( hDcBuf, 0, 0, nWidth, nHeight, hDc, 0, 0, SRCCOPY ); // ビットマップのコピー SelectObject( hDcBuf, hOldBmp ); // 旧BMPの復元 GetDIBits( hDc, hBmp, 0, nHeight, lpPixel, (LPBITMAPINFO)lpInfo, DIB_RGB_COLORS ); hFile = CreateFile( sFileName, GENERIC_WRITE, 0, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL ); if( hFile != INVALID_HANDLE_VALUE ) { WriteFile( hFile, lpBuf, nFileSize, &nWriteSize, NULL ); // ファイルへの書き込み CloseHandle( hFile ); } ReleaseDC( hWnd, hDc ); // DCの解放 DeleteObject( hBmp ); DeleteObject( hDcBuf ); GlobalFree( lpBuf ); } 以上です お試し下さい。

akagenoanfan
質問者

補足

引数1 に 何をいれればよいのか わかりません。。。 void CClTurnView::OnDraw(CDC* pDC) { CClTurnDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 CPen Pen; CPen *pTmpPen; // 新しいペンやブラシを作るための変数です。 // クライアントの矩形領域内の中央の座標を求める。 CRect rect; GetClientRect(&rect); // 赤のペンを準備 Pen.CreatePen(PS_SOLID, 1, RGB( 255, 0, 0)); pTmpPen = pDC->SelectObject(&Pen); // X軸・Y軸を描画 pDC->MoveTo(rect.Width()/2,0); pDC->LineTo(rect.Width()/2,rect.Height() / 2*2); pDC->MoveTo(0,rect.Height() / 2); pDC->LineTo(rect.Width()/2*2,rect.Height() / 2); // 元のペンに戻す pDC->SelectObject(pTmpPen); Pen.DeleteObject(); SaveBitmap2(???????, "TEST1.BMP"); (略) }

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • flowergoo
  • ベストアンサー率38% (13/34)
回答No.2

#1の補足について 説明が足りなくて済みません。 引数1は描画元のウインドウハンドルを指定します。 ”CClTurnView”クラスであれば SaveBitmap2(this->m_hWnd, "TEST1.BMP"); となります

akagenoanfan
質問者

お礼

はい。実は最初そうしたのですが、文字が読み取れないという エラーが でて パニクッテしまったのです(恥ずかしいです。)。打ち直せば うまくいきました。 ほんとうに ありがとう ございました。 これで この問題は 解決しました。 感謝のかぎりです。

すると、全ての回答が全文表示されます。

関連するQ&A