プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております。
今回教えていただきたいことは、GDI+についてです。

今まで GDI と OpenGL を組み合わせてプログラミングをしていましたが、GDIでは自前でアンチエリアス処理をしなければならないなど面倒な部分が多く困っていました。
そこで GDI+ を使用して楽にプログラミングしようと考えて色々とプログラムをしてみたのですが、ここにきて壁にぶち当たりましたので、先人の方にご教授していただきたいのです。

《 GDI でプログラムしていた時 》

(1)画像バッファを作成しておく

 //ディスクトップのDCを取得
 HDC hdcTmp = GetDC( GetDesktopWindow() );

 //ビットマップのハンドルと、作成したバッファの先頭アドレスを取得
 hBitmap = CreateDIBSection( hdcTmp, &bmi, DIB_RGB_COLORS, (void**)&buffer, 0, 0 );

 //HBITMAPにHDCを結び付ける
 hdc = CreateCompatibleDC( hdcTmp );     //DIBSection用メモリデバイスコンテキスト作成
 hOldHandle = SelectObject( hdc, hBitmap );       //画像バッファ(m_hBitmap)をメモリデバイスコンテキストに選択 (GDIでも描画出来るようにするため)

(2)画像バッファ上にGDIで描画する
 hdcに対してGDIの関数を使用して描画

(3)BitBlt()でウィンドウに転送する
 WM_PAINTのメッセージのときだけウィンドウに対して転送

上記(1)(2)(3)のようにして描画を行っていました。


■したいこと(1)■
今したい事は 上記(1)で作成したGDI の画像バッファのhdcを使ってGDI+関数で描画したいのです。
そうするといままで使っていたGDIの知識を生かして両方使えます。


■したいこと(2)■
したいこと(1)がもし出来ないのであればGDI+での画像バッファがつくれるかどうか、その画像バッファのデバイスコンテキスト
は取得できるのかどうか教えていただきたいと思います

情報不足かもしれませんが、ご教授よろしくお願いいたします。

A 回答 (2件)

私も最近GDI+を使い始めて苦しんだので、わかる所を。


日本語のマニュアルを探すと.NETばかりですからね。MSDNで調べても良くわからなくて結局ヘッダを調べて作っています。

手順の(2)のところをこうして下さい。
Graphics Graph(hdc); //Graphics クラスのインスタンス
これで、Grpahを使ってラインや円などを描けるようになります。
四角に塗りつぶしなら、
SolidBrush brush( Color(255,0,0,0) ); //不透明の黒
Grpah.FillRectangle(&brush,0,0,100,100); //四角形
といった感じです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます、本当に助かりました。
しかし一つ不思議な事があります。
GDIではWM_CREATEメッセージの時点で描画したものが画像バッファに反映されているのですが、GDI+で同じようにWM_CREATEで、
 Graphics Graph(hdc);  //Graphics クラスのインスタンス
を実行してWM_CREATE内でGDI+描画するとバッファに反映されていないんです。
しかしWM_PAINTで
 Graphics Graph(hdc);  //Graphics クラスのインスタンス
を実行し、WM_PAINT内でバッファにGDI+で描画すると描画されます。

上記が一つ目の疑問点です。
それからもう一つ不思議な事があります。
画像バッファにGDI+で描画した図形にアンチエリアスをかけていたのですが、ウインドウを別のウィンドウで隠したりして再描画させると最初にGDI+で描画した図形にアンチエリアスがかかっていません。
 Graph.SetSmoothingMode( SmoothingModeAntiAlias );
上記のようにアンチエリアス指定してから描画しています。
普通にGDI+だけで直接ウィンドウのHDCに対してWM_PAINTで描画している時にはアンチエリアスがかかっているのですが、不思議です。

たびたびすみませんがご教授よろしくお願いいたします。

お礼日時:2007/11/24 21:28

日ごろMFC専門でWindowsAPIの生で組まないので、答えが間違ってるかも知れませんが。



>WM_CREATEメッセージの時点で描画したものが画像バッファに反映されているのですが
タイミング的にGDI+の初期化は完了していますか?

>画像バッファにGDI+で描画した図形にアンチエリアスをかけていたのですが、ウインドウを別のウィンドウで隠したりして再描画させると最初にGDI+で描画した図形にアンチエリアスがかかっていません。
それは経験したことがないですね。
Graph.SetSmoothingMode( SmoothingModeAntiAlias );
が何処かで取り消されているとしか思えません。

今回は、あくまで参考意見という事で。
    • good
    • 0

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