なかなか うまくいきません。
C::OnDraw
{
略
CDC->Polygon(///
略
}
このように MFC のOnDraw でかいた 実行結果を BMP形式 で 保存したいのですが。。
BitBlt
CreateCompatibleDC
GetDC
などの いろいろな 関数がありますが、いったい何をどうつかえばいいのか わかりません。ほんとに 初歩的段階で もうしわけないのですが、、どなたか
アドバイスいただけないでしょうか?手取りあしとり指導してくれるから(これが 死ぬほどたすかるのですが・・)、この参考書をみれば やりかたが 乗っている(これも たすかる)と紹介してくれるかた、
等々 どんな ことでも いいので 教えてください。先が遠すぎてこまっています
No.1ベストアンサー
- 回答日時:
出来てしまえば割と簡単ですが、道のりは近くないです。
私も以前書籍などを探し、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");
(略)
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vbaエクセルマクロについて あるデータを作成し、デスクトップに.xlsx形式で保存するマクロを作成 6 2023/03/03 18:05
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2023/01/20 14:36
- Visual Basic(VBA) vbaエクセルマクロについて あるデータを作成し、デスクトップに.xlsx形式で保存するマクロを作成 2 2023/03/02 18:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- 数学 『代数幾何についての疑問』 2 2023/05/08 17:44
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2022/03/31 12:46
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/04 09:39
- 数学 線形代数 正則 階数 3 2023/03/22 07:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
シェアウェアなどの期間限定機能
-
読み取り専用ファイルを上書き...
-
至急教えてください!プログラ...
-
Excel VBAでほかのアプリケーシ...
-
VBAで、強制保存してブックを閉...
-
JScript 中の日本語とエンコー...
-
VB6.0でエクセル保存する時の保...
-
コマンドプロンプトでデスクト...
-
VBScriptで日本語が変です
-
ExcelVBAでデスクトップのPATH...
-
CrescentEve書き込みモード解除...
-
VB.NETでEXCELファイルを開き、...
-
オンラインエディタ JS Bin
-
onedriveで同期解除をしたら、...
-
vlan internal allocation poli...
-
共有しているファイルを削除し...
-
YAHAMA RTXシリーズのコマンド...
-
沢山のフォルダにあるファイル...
-
teratarmでコマンド入力すると...
-
Ciscoルーター 対向機器のIPア...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
読み取り専用ファイルを上書き...
-
Excel VBAでほかのアプリケーシ...
-
Corel Digital Studioの動画をS...
-
コマンドプロンプトでデスクト...
-
Excel VBAで作成したマクロをxl...
-
エクセルで「名前を付けて保存...
-
ExcelVBAでデスクトップのPATH...
-
VBA メモ帳の上書き保存がしたい
-
VBAで、強制保存してブックを閉...
-
irvineを利用してVBAからダウン...
-
VBScriptでのSaveAsについて
-
webページの特定の部分だけ消し...
-
VBScriptで日本語が変です
-
Pivot table で集計されたデー...
-
AccessVBAでレポートをPDFで出力
-
vbaでIEの名前を付けて保存(A)...
-
エクセル:マクロ:保存時に連...
-
ファイルのダウンロード保存先...
-
htmlから取り込んだ を消...
-
印刷と保存の仕方をVBAマクロの...
おすすめ情報