トップページ > 記事閲覧
複数のPictureBoxコントロールへの描画
名前:コムコム 日時: 2022/06/27 17:30

C#でDXライブラリを使用しています。 やりたいことはPictureBox1とPictureBox2にそれぞれ違う画像をDXライブラリで 読み込んで表示させたいのですが、PictureBox2にしか描画されません。 これはなんとなく、以下の2つの事象が影響していると考えています。 1.裏画面は1つしかないのでPictureBox1には描画しているが、 PictureBox2に描画する際、PictureBox1の画像情報は裏画面から 消えているので描画されないのではと推測しています。 2.ScreenFlip()関数はあくまで裏画面を表画面に入れ替えるだけなので 入れ替え先がPictureBox2に変わった時点でPictureBox1には入れ替えないので 描画されない。 これをPictureBox1とPictureBox2の両方できちんと描画されるように する方法はありますでしょうか? (※無理やりDxDll.cs内のDXクラスの静的(static)を外して複数のDXクラスインスタンス を生成してPictureBox1とPictureBox2に割り当てたのですが、ダメでした。やはりその先の DXライブラリのDLLがstaticでの呼び出しなので複数インスタンスを生成してもDXライブラリ 本体側は1つのようです。 ※そもそもの話なんですが、普通はmain()関数にwhileループでWinメッセージを受信しながら DXライブラリで描画すると思うんですが、C#ではProgram.csファイルのMain()関数内で それを実行するとフォーム自体が上がって来ないのでForm_Loadイベントで必要な処理のみ 実装してます。実際のwhileループに当たる処理はC#ではフォームのPaint()イベントに相当するのでしょうか?) よろしくおねがいします。 以下は実際にサンプル的に作成してみたコードです。 private void frmDirectX_Load(object sender, EventArgs e) { int imgHandle; int ret; try { // ---------------------------------- // PictureBox1に描画 // ---------------------------------- // 描画先ウィンドウ指定 DX.SetUserWindow(PictureBox1.Handle); // DXライブラリ初期化 ret = DX.DxLib_Init(); if (ret == 0) { // 裏画面クリア DX.ClearDrawScreen(); // 裏画面に四角形塗りつぶし DX.DrawBox(0, 0, PictureBox1.Width, PictureBox1.Height, DX.GetColor(255, 255, 255), DX.TRUE); // 画像を読み込み、裏画面に描画 imgHandle = DX.LoadGraph(@"D:\サンプルプログラム\DirectX\画像\image1.jpg"); DX.DrawGraph(0, 0, imgHandle, 0); // フリップ処理(裏画面を表画面(PictureBox1)に入れ替え) DX.ScreenFlip(); // 画像ハンドル解放 DX.DeleteGraph(imgHandle); // ---------------------------------- // PictureBox2に描画 // ---------------------------------- // 描画先ウィンドウ指定 DX.SetScreenFlipTargetWindow(PictureBox2.Handle); // 裏画面クリア DX.ClearDrawScreen(); // 画像を読み込み、裏画面に描画 imgHandle = DX.LoadGraph(@"D:\サンプルプログラム\DirectX\画像\image2.jpg"); DX.DrawGraph(0, 0, imgHandle, 0); // フリップ処理(裏画面を表画面(PictureBox2)に入れ替え) DX.ScreenFlip(); // 画像ハンドル解放 DX.DeleteGraph(imgHandle); } else { MessageBox.Show("DXライブラリの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch(Exception ex) { MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); } } private void frmDirectX_FormClosing(object sender, EventArgs e) { try { // DXライブラリ解放 DX.DxLib_End(); } catch(Exception ex) { MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
メンテ

Page: 1 |

Re: 複数のPictureBoxコントロールへの描画 ( No.1 )
名前:管理人 日時:2022/06/27 23:27

SetScreenFlipTargetWindow の設定は残り続けますので、一度 DX.SetScreenFlipTargetWindow(PictureBox2.Handle); を実行した後は何回 ScreenFlip をしても PictureBox2 の方にしか 画像が転送されないのが原因ではないかと思います PictureBox1 用の ScreenFlip の前に DX.SetScreenFlipTargetWindow(PictureBox1.Handle); を実行するようにしてみてください m(_ _)m
メンテ
Re: 複数のPictureBoxコントロールへの描画 ( No.2 )
名前:コムコム 日時:2022/06/28 08:53

ご回答ありがとうございます。 >PictureBox1 用の ScreenFlip の前に >DX.SetScreenFlipTargetWindow(PictureBox1.Handle); >を実行するようにしてみてください m(_ _)m さっそく実行してみたのですが、事象が変わりませんでした(´;ω;`) 2つ以上のPictureBoxに描画するのは難しいですかね(;^_^A ちょっと違う視点で再検討します。
メンテ
Re: 複数のPictureBoxコントロールへの描画 ( No.3 )
名前:管理人 日時:2022/06/29 23:29

ご返信が遅くなり申し訳ありません 駄目でしたか… すみません、もし不都合が無ければ 『PictureBox2つに SetScreenFlipTargetWindow で画像を出力する』 プロジェクトをzipなどで圧縮してこちらのメールアドレスに BQE00322(あっとまーく)nifty.com ( (あっとまーく)を@に置き換えてください 送っていただけないでしょうか? m(_ _)m 複数の Window に画像を出力するのは特に難しい事ではないはずなので、 何か少し変更すれば出力できるようになると思いますので…
メンテ

Page: 1 |

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

   クッキー保存