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);
}
}