ビットマップを任意に作成 – プログラミング – Home

ビットマップを任意に作成
 
通知
すべてクリア

[解決済] ビットマップを任意に作成


ぴくしー
 ぴくしー
(@ぴくしー)
ゲスト
結合: 22年前
投稿: 12
Topic starter  

こんにちわ。
ダイアログ等で、座標等の線を描画するための情報を数値入力して
その値をボタン等で確定すると、ビットマップファイルに反映する
プログラムを作成したいのですが、どのようにすればよいのでしょうか?

ビットマップファイルのフォーマットを自力で直していくプログラムを
作成しなくてはいけないのでしょうか?

(環境 VC++ 6.0 SP5 Win2000 )


引用未解決
トピックタグ
Tonny
 Tonny
(@Tonny)
ゲスト
結合: 22年前
投稿: 32
 

MFCですと、ダイアログではありませんがCViewのOnDarawでこんな事したことがあります。

CRect client ;
GetClientRect( & client ) ;
CDC memDC ;
memDC.CreateCompatibleDC( pDC ) ;
memDC.SetBkMode(TRANSPARENT);
CBitmap bmp ;
bmp.CreateCompatibleBitmap(pDC,client.Width(),client.Height()) ;
CBitmap* old_bmp = memDC.SelectObject(&bmp) ;
//ここでmemDCにいろいろ描画
pDC->BitBlt(0,0,client.Width(),client.Height(),&memDC,0,0,SRCCOPY) ;
memDC.SelectObject(old_bmp) ;
bmp.DeleteObject();
memDC.DeleteDC() ;

裏画面にいろいろ描画してからBitBlt転送することで、画面の更新をすばやくさせています。

この例ではbmpをすぐに破棄していますが、ビットマップファイルに保存させれば、お望みの
形になりませんか。


返信引用
ぴくしー
 ぴくしー
(@ぴくしー)
ゲスト
結合: 22年前
投稿: 12
Topic starter  

Tonny解答ありがとうございます。

描画の所の方法はわかってきたのですが

>この例ではbmpをすぐに破棄していますが、ビットマップファイルに保存させれば

の部分がわかりません。

ファイルに落とすにはどのようにすればよいのでしょうか?


返信引用
過去ログ
 過去ログ
(@過去ログ)
ゲスト
結合: 22年前
投稿: 2
 

過去ログ


返信引用
ぴくしー
 ぴくしー
(@ぴくしー)
ゲスト
結合: 22年前
投稿: 12
Topic starter  

作成したのですが、ビットマップが黒いまま保存されてしまいます。
なぜでしょうか?
ちゃんと線が掛けていないのでしょうか?

/// ウインドウのデバイスコンテキストを取得
CDC* pDc = ( CDC* )this->GetDC();

/// ウインドウの構造を取得
CRect client ;
GetClientRect( & client ) ;

/// メモリに展開するデバイスコンテキストを作成
CDC memDC ;
memDC.CreateCompatibleDC( pDc ) ;
memDC.SetBkMode(TRANSPARENT);

/// ビットマップを作成する
HANDLE hBitMap = CreateCompatibleBitmap( pDc->m_hDC, client.right,
client.bottom );
HANDLE hOldBitMap = SelectObject( memDC, hBitMap );

// ペンを作成
CPen lPen( PS_SOLID, 1, RGB(128,128,128) );
pDc->SelectObject( &lPen ); // 選択

// 基点に移動
pDc->MoveTo( client.left, client.bottom );

// 描画
pDc->LineTo( client.left+100, client.bottom + 111 );
pDc->LineTo( client.left+1000, client.bottom + 122 );
pDc->LineTo( client.left+234, client.bottom + 987 );
pDc->LineTo( client.left+890, client.bottom + 199 );

// ビットマップに反映
pDc->BitBlt(0,0,client.Width(),client.Height(),&memDC,0,0,SRCCOPY) ;
SelectObject( memDC, hBitMap );

// ビットマップに保存
SaveBitmapFile(memDC.m_hDC,(HBITMAP)hBitMap, D:\\Kawazoe\\Test2.bmp);

DeleteObject(hBitMap);
memDC.DeleteDC() ;


返信引用
ぴくしー
 ぴくしー
(@ぴくしー)
ゲスト
結合: 22年前
投稿: 12
Topic starter  

ファイル保存処理はうまくいきました。

hOldBitMap = SelectObject( memDC.m_hDC, hBitMap);
BitBlt(memDC.m_hDC, 0, 0, client.right - client.left, client.bottom -
client.top, pDc->m_hDC, client.left, client.top, SRCCOPY);
SelectObject(memDC.m_hDC, hOldBitMap);

に直しましたが、

実行ウインドウが保存されてしまいます。

目的は、裏画面のビットマップに線が表示されているものが
保存されるようにしたいのですが・・・。

よろしくお願いします。


返信引用
ぴくしー
 ぴくしー
(@ぴくしー)
ゲスト
結合: 22年前
投稿: 12
Topic starter  

自己解決しました。

pDc->MoveTo( client.left, client.bottom );

memDc->MoveTo( client.left, client.bottom );

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


返信引用
質問
 質問
(@質問)
ゲスト
結合: 23年前
投稿: 15
 

すいません解決したのに申し訳ないですが、参考にさせてもらっています。
この以下の文章が良く分かりませんでした。どこを直されました?
>hOldBitMap = SelectObject( memDC.m_hDC, hBitMap);
>BitBlt(memDC.m_hDC, 0, 0, client.right - client.left, client.bottom -
>client.top, pDc->m_hDC, client.left, client.top, SRCCOPY);
>SelectObject(memDC.m_hDC, hOldBitMap);
>に直しましたが、
あとSaveBitmapFile関数はこの場合どうされましたか?
よろしかったらご助言ください。


返信引用
ぴくしー
 ぴくしー
(@ぴくしー)
ゲスト
結合: 22年前
投稿: 12
Topic starter  

BitBltは、APIにしたのですが
>hOldBitMap = SelectObject( memDC.m_hDC, hBitMap);
ペンで使ったものを元に戻しました。

>あとSaveBitmapFile関数はこの場合どうされましたか?
// ファイルの保存
BOOL bRet = SaveBitmapFile(memDC.m_hDC, (HBITMAP)
obBMap.m_hObject, D:\\Test\\Line2.bmp);

こちらの環境では、動作しています。
いちどかくにんしてみてください。


返信引用
質問
 質問
(@質問)
ゲスト
結合: 23年前
投稿: 15
 

少し考えていましたが、やはり以下の表現
BOOL bRet = SaveBitmapFile(memDC.m_hDC, (HBITMAP)
obBMap.m_hObject, D:\\Test\\Line2.bmp);
が理解できません。
この上述のソースを実行しますとSaveBitmapFile' : 定義されていない識別子ですと出
るのですが、SaveBitmapFileはこの場合、どう定義したらよろしいのですか?
ご教授ください。


返信引用
ぴくしー
 ぴくしー
(@ぴくしー)
ゲスト
結合: 22年前
投稿: 12
Topic starter  

それは自作関数です。
参照URL:
http://sekkei-svr.nagaokaut.ac.jp/seminar/VC++/letsprog/subchap5/chap29-
4.htm#SAVEBITMAPFILE

わからない関数があるときは、URLで検索するといいですよ。


返信引用
質問
 質問
(@質問)
ゲスト
結合: 23年前
投稿: 15
 

ぴくしーさん有難うございました。
私も自作?かなと思っていましたが初心者ゆえ自信が無かったのでご意見をお聞きした
かったです。
有難うございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました