ビットマップを任意に作成

[戻る]
ぴくしー 2003/10/01(水) 16:14:41
こんにちわ。
ダイアログ等で、座標等の線を描画するための情報を数値入力して
その値をボタン等で確定すると、ビットマップファイルに反映する
プログラムを作成したいのですが、どのようにすればよいのでしょうか?

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

(環境 VC++ 6.0 SP5 Win2000 )

Tonny 2003/10/01(水) 19:05:30
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をすぐに破棄していますが、ビットマップファイルに保存させれば、お望みの
形になりませんか。

ぴくしー 2003/10/02(木) 10:12:19
Tonny解答ありがとうございます。

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

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

の部分がわかりません。


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

過去ログ 2003/10/02(木) 10:56:14
過去ログ

ぴくしー 2003/10/02(木) 15:40:37
作成したのですが、ビットマップが黒いまま保存されてしまいます。
なぜでしょうか?
ちゃんと線が掛けていないのでしょうか?

    /// ウインドウのデバイスコンテキストを取得
    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() ;

ぴくしー 2003/10/02(木) 16:20:19
ファイル保存処理はうまくいきました。

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);

に直しましたが、

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

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

よろしくお願いします。

ぴくしー 2003/10/02(木) 16:52:34
[[解決]]
自己解決しました。

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

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

質問 2003/10/02(木) 22:08:53
すいません解決したのに申し訳ないですが、参考にさせてもらっています。
この以下の文章が良く分かりませんでした。どこを直されました?
>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関数はこの場合どうされましたか?
よろしかったらご助言ください。

ぴくしー 2003/10/03(金) 13:00:28
BitBltは、APIにしたのですが
>hOldBitMap = SelectObject( memDC.m_hDC, hBitMap);
ペンで使ったものを元に戻しました。

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

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

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

ぴくしー 2003/10/17(金) 08:33:00
それは自作関数です。
参照URL:
http://sekkei-svr.nagaokaut.ac.jp/seminar/VC++/letsprog/subchap5/chap29-
4.htm#SAVEBITMAPFILE

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

質問 2003/10/17(金) 10:03:10
ぴくしーさん有難うございました。
私も自作?かなと思っていましたが初心者ゆえ自信が無かったのでご意見をお聞きした
かったです。
有難うございました。

古いスレッドには追加発言できません。