アプリ版:「スタンプのみでお礼する」機能のリリースについて

なかなか うまくいきません。
C::OnDraw

 略

CDC->Polygon(///

 略


このように MFC のOnDraw でかいた 実行結果を BMP形式 で 保存したいのですが。。
BitBlt
CreateCompatibleDC
GetDC

などの いろいろな 関数がありますが、いったい何をどうつかえばいいのか わかりません。ほんとに 初歩的段階で もうしわけないのですが、、どなたか
アドバイスいただけないでしょうか?手取りあしとり指導してくれるから(これが 死ぬほどたすかるのですが・・)、この参考書をみれば やりかたが 乗っている(これも たすかる)と紹介してくれるかた、
等々 どんな ことでも いいので 教えてください。先が遠すぎてこまっています

A 回答 (2件)

出来てしまえば割と簡単ですが、道のりは近くないです。


私も以前書籍などを探し、akagenoanfanさんと同じような事で困っていた時期がありました。

実証済みの関数を上げさせていただきます

呼び出し部
SaveBitmap(this->m_CapDisp.m_hWnd, "TEST1.BMP"); // ビットマップの保存
※引数1でCDC描画元のウインドウハンドルを渡します
※引数2でファイル名を渡します

関数部
////////////////////////////////////
// ビットマップファイルのファイル保存
//
void SaveBitmap(HWND hWnd, LPCTSTR sFileName)
{
HANDLEhFile;
HDChDc, hDcBuf;
LPBITMAPFILEHEADERlpHead;
LPBITMAPINFOHEADERlpInfo;
LPBYTElpBuf, lpPixel;
RECTcRect;
HBITMAPhBmp, hOldBmp;
DWORDnWriteSize, 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 );

}

以上です
お試し下さい。

この回答への補足

引数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");

(略)



補足日時:2004/12/09 19:04
    • good
    • 0

#1の補足について


説明が足りなくて済みません。

引数1は描画元のウインドウハンドルを指定します。

”CClTurnView”クラスであれば
SaveBitmap2(this->m_hWnd, "TEST1.BMP");
となります
    • good
    • 0
この回答へのお礼

はい。実は最初そうしたのですが、文字が読み取れないという エラーが でて パニクッテしまったのです(恥ずかしいです。)。打ち直せば うまくいきました。

ほんとうに ありがとう ございました。

これで この問題は 解決しました。

感謝のかぎりです。

お礼日時:2004/12/10 11:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!