いつもお世話になっております。
今回教えていただきたいことは、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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- Illustrator(イラストレーター) ワードに貼った画像のキャンバスと画像本体のサイズの調整 2 2022/05/19 18:31
- 美術・アート ペンタブとオフィス系ソフト 1 2022/10/08 19:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- その他(法律) 意味不明な法律について ・ なぜ、著作権と肖像権と言う余計な法律があるんですか? 意味が分からねー! 4 2023/05/22 20:05
- CAD・DTP 「機能ブロック図」の描画用フリーソフトを教えてください 1 2022/09/23 16:12
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 画像編集・動画編集・音楽編集 medibang paint を使っているのですが、 [画像をレイヤーとして開く]で写真をトレースし 2 2023/03/18 04:36
- Windows 8 Route Generator の使い方 1 2023/05/03 00:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
[VB.net] DataGridViewの列ヘッ...
-
画面全体を再描画させたい
-
MFC ビットマップ描画で残像が残る
-
エクセルでガンチャートを作成...
-
ちらつきを何とかしたい
-
Wave波形の描画について
-
TextBoxに文字を書いても表示さ...
-
OneNote 2010 文字と描画がずれる
-
C++にて、塗りつぶされた円を描...
-
楕円を描くプログラミング
-
陰関数のグラフを表示させるには
-
FlexGridの一部のみ表示を更新...
-
MFC DrawText 背景色とフォント
-
OpenGLでの描画のタイミング
-
ピクチャーコントロールへの描...
-
DirectXとGDIの違い
-
InvalidateRectの使い方について
-
塗りつぶしモード ALTERNATEと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
NVIDIAのシェーダーキャッシュ
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
UpdateData( FALSE); による文...
-
TextBoxに文字を書いても表示さ...
-
VC++プログラムをつかったBMP画...
-
MFCでOnPaintのタイミング
-
エクセルでガンチャートを作成...
-
InvalidateRectの使い方について
-
FlexGridの一部のみ表示を更新...
-
VB.NETでPictureBoxへの描画に...
-
MFCのタイマーのつかい方を教え...
-
CStaticコントロールの静的イメ...
-
VBAにGDI+を参照させる方法
-
画面全体を再描画させたい
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
panelのスクロール表示について
-
CScrollViewの使用方法について
おすすめ情報