
いつもお世話になっております。
今回教えていただきたいことは、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+での画像バッファがつくれるかどうか、その画像バッファのデバイスコンテキスト
は取得できるのかどうか教えていただきたいと思います
情報不足かもしれませんが、ご教授よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
私も最近GDI+を使い始めて苦しんだので、わかる所を。
日本語のマニュアルを探すと.NETばかりですからね。MSDNで調べても良くわからなくて結局ヘッダを調べて作っています。
手順の(2)のところをこうして下さい。
Graphics Graph(hdc); //Graphics クラスのインスタンス
これで、Grpahを使ってラインや円などを描けるようになります。
四角に塗りつぶしなら、
SolidBrush brush( Color(255,0,0,0) ); //不透明の黒
Grpah.FillRectangle(&brush,0,0,100,100); //四角形
といった感じです。
ご回答ありがとうございます、本当に助かりました。
しかし一つ不思議な事があります。
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で描画している時にはアンチエリアスがかかっているのですが、不思議です。
たびたびすみませんがご教授よろしくお願いいたします。
No.2
- 回答日時:
日ごろMFC専門でWindowsAPIの生で組まないので、答えが間違ってるかも知れませんが。
>WM_CREATEメッセージの時点で描画したものが画像バッファに反映されているのですが
タイミング的にGDI+の初期化は完了していますか?
>画像バッファにGDI+で描画した図形にアンチエリアスをかけていたのですが、ウインドウを別のウィンドウで隠したりして再描画させると最初にGDI+で描画した図形にアンチエリアスがかかっていません。
それは経験したことがないですね。
Graph.SetSmoothingMode( SmoothingModeAntiAlias );
が何処かで取り消されているとしか思えません。
今回は、あくまで参考意見という事で。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VB.net] DataGridViewの列ヘッ...
-
MFCタブコントロールのグラデー...
-
pset関数について
-
Form1 Load で実行されない。
-
VB6,リストボックスの特定行の...
-
ウインドウサイズを変更しても...
-
DirectXとGDIの違い
-
MFCでOnPaintのタイミング
-
word
-
逐次的なグラフ表示の方法
-
WM_PAINTとBitBlt
-
GDI+で高速な描画
-
Minecraft 統合版(PC)の描画距...
-
.net の ImageList について
-
文字の行間
-
ワードの図形で重なり部分の色...
-
ダイアログベースの再描画について
-
CStaticコントロールの静的イメ...
-
win32api 画面のちらつき
-
「アイテムは収集されました」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
google Colabでmatplotlibの描...
-
panelのスクロール表示について
-
VB.netでのライン描画方法がわ...
-
VB6,リストボックスの特定行の...
-
UpdateData( FALSE); による文...
-
TextBoxに文字を書いても表示さ...
-
CStaticコントロールの静的イメ...
-
VBAにGDI+を参照させる方法
-
MFCでOnPaintのタイミング
-
InvalidateRectの使い方について
-
VC++プログラムをつかったBMP画...
-
GetGlyphOutline() ご利用経験...
-
NVIDIAのシェーダーキャッシュ
-
Form1 Load で実行されない。
-
FlexGridの一部のみ表示を更新...
-
C#のタブコントロールについて...
-
WM_SIZEとWM_SIZINGの違い (Win...
おすすめ情報