トップページ > 記事閲覧
win api関数で描いた図形をdxライブラリの関数を用いて描写したい
名前:まりもり 日時: 2020/11/05 16:20

初めての質問させていただきます。 ・やりたい事 タイトルにもある通り、win api関数で描写した図形をdxライブラリの関数を用いて表示させたいです。 ※当初はdxライブラリの図形描画関数で描く予定でしたが、描きたい図形がdxライブラリの関数では実装が難しそうでしたので、win api関数を使いました。 ・考えている方針 ウインドウハンドルを取得し、winapi関数で図形を描画           ↓ winapi関数で描いた図形をビットマップデータに保存           ↓ ビットマップデータのグラフィックハンドルを取得           ↓    DrawGraph()を用いて描画 上記の考えている方針でプログラムを書いていますが、正直全然上手くいきません。。。 大変恐縮ですが、もし、上記の方針でやりたい事が実装出来るなら、 実際の処理(コード)を教えて頂けると嬉しいです。 よろしくお願いします。 また、他に上の方針よりも良い方法等ありましたら、教えていただけると嬉しいです。
メンテ

Page: 1 |

Re: win api関数で描いた図形をdxライブラリの関数を用いて描写したい ( No.1 )
名前:kanamaru 日時:2020/11/05 17:30

普通にdxlibの画面のウィンドウハンドルを取得したら直接描画できそうな気がしますが。 hdcはGetMainWindowHandleとGetDC関数を使えば取得できますし。 後はRectangleとかEllipseとかwinapiの描画関数が使えますし、リージョンもPaintRgn関数で描画できそうです 試したことはないのでわかりません。 少なくともたぶんいったん画像ファイルに保存する(書いてある仕組みはそういうことですよね)のは非効率な気がします。 ちなみにどんな図形を描画しようとしてるんですか? dxlibって結構いろんな図形描画できるのでもしかしたらdxlibで描画できるかもしれませんよ? (四角形、円、楕円、角丸長方形、三角形、扇形が描画できます。後はDrawLine使って多角形も行けます。以前星を書いている人もいました。)
メンテ
Re: win api関数で描いた図形をdxライブラリの関数を用いて描写したい ( No.2 )
名前:管理人 日時:2020/11/06 00:09

kanamaruさんの仰られる通り win api による描画は遅いのであまりお勧めできませんが 一応 MakeScreen などで作成したグラフィックハンドルにビットマップデータを転送する 非公開関数の BltBmpToGraph という関数があります // ビットマップの内容をグラフィックハンドルに転送 // BmpColorData : 転送するビットマップの色情報 // RgbBmp : 転送するビットマップ // AlphaBmp : 転送するビットマップのアルファチャンネル( 使用しない場合は NULL ) // CopyPointX, CopyPointY : 転送先のグラフィック内の座標 // GrHandle : ビットマップを転送されるグラフィックハンドル int BltBmpToGraph( COLORDATA *BmpColorData, HBITMAP RgbBmp, HBITMAP AlphaBmp, int CopyPointX, int CopyPointY, int GrHandle ) ; 因みにどんなビットマップでも良いというわけではなく、渡せるビットマップは CreateDIBSection で 作成できる DIB( Device-Independent Bitmap デバイス非依存ビットマップ )のみです これを使うと DIB に win api で図形を描画した後、DXライブラリのグラフィックハンドルに描画結果を 転送して、描画結果が転送されたグラフィックハンドルを DrawGraph で画面に描画することで まりもりさんの望む処理が実現します とりあえず画面左上に緑色の斜め線を win api で描画するサンプルを組んでみましたので よろしければご覧ください m(_ _)m #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int GrHandle ; BITMAPINFO BitmapInfo ; HBITMAP DIB ; HDC DC ; HPEN Pen, OldPen ; void *ImageBuffer = NULL ; COLORDATA ColorData ; // ウインドウモードに変更 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // デバイスコンテキストの作成 DC = CreateCompatibleDC( NULL ) ; // 縦横100ピクセルの 24ビットカラーのDIBを作成 memset( &BitmapInfo, 0, sizeof( BitmapInfo ) ) ; BitmapInfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER ) ; BitmapInfo.bmiHeader.biWidth = 100 ; BitmapInfo.bmiHeader.biHeight = -100 ; // 高さはマイナスの値にする BitmapInfo.bmiHeader.biPlanes = 1 ; BitmapInfo.bmiHeader.biBitCount = 24 ; BitmapInfo.bmiHeader.biCompression = BI_RGB ; DIB = CreateDIBSection( DC, &BitmapInfo, DIB_PAL_COLORS, ( void ** )&ImageBuffer, NULL, 0 ) ; // 色情報を 24ビットカラーに初期化 CreateFullColorData( &ColorData ) ; // デバイスコンテキストに DIB をセット SelectObject( DC, DIB ) ; // 線を描画する { Pen = CreatePen( PS_SOLID, 1, RGB( 0, 255, 0 ) ) ; // ペンの作成 OldPen = ( HPEN )SelectObject( DC, Pen ) ; // デバイスコンテキストにペンをセット MoveToEx( DC, 0, 0, NULL ) ; // 描画座標の移動 LineTo( DC, 100, 100 ) ; // 線の描画 SelectObject( DC, OldPen ) ; // デバイスコンテキストに元のペンをセット DeleteObject( Pen ) ; // ペンを削除 } // DIB と同じ大きさのグラフィックハンドルを作成 GrHandle = MakeScreen( 100, 100, TRUE ) ; // DIB を転送する前に透過色を黒にしておく SetTransColor( 0, 0, 0 ) ; // グラフィックハンドルに DIB の内容を転送 BltBmpToGraph( &ColorData, DIB, NULL, 0, 0, GrHandle ) ; // グラフィックハンドルの内容を描画 DrawGraph( 0, 0, GrHandle, TRUE ) ; // グラフィックハンドルを削除 DeleteGraph( GrHandle ) ; // デバイスコンテキストの削除 DeleteDC( DC ) ; // DIB の削除 DeleteObject( DIB ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 因みにサンプル中では DIB も GrHandle も用が済んだ時点で削除していますが、 もし毎フレーム同じ大きさの図形を描画する場合は、プログラムの最初に DIB と GrHandle を作成して、 プログラムを終了する前に DIB と GrHandle を削除するようにした方が良いです ( 作成・削除も時間のかかる処理なので… )
メンテ
Re: win api関数で描いた図形をdxライブラリの関数を用いて描写したい ( No.3 )
名前:まりもり 日時:2020/11/06 01:46

>>kanamaru様 >>管理人様 自分の質問に回答して頂きありがとうございます!! こちらからの返信が遅れてしまいました。すみません。 無事にwin apiで描いた図形を描画することが出来ました。 お二人からのご返信は大変勉強になりました。 本当にありがとうございましたm(_ _"m)。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存