トップページ > 記事閲覧
C#にてリサイズ可能なFormを描画先にした場合の挙動について
名前:のり 日時: 2023/12/19 17:21

C#でDXライブラリを使おうとしています。 リサイズ可能なFormを描画先にした時点からフォームサイズを変更した場合 の座標が思ったような挙動をしません。 以下ソース public Form1() { InitializeComponent(); // DXライブラリの描画ハンドルを本フォームにする DX.SetUserWindow(this.Handle); // 描画先画面を裏にする DX.SetDrawScreen(DX.DX_SCREEN_BACK); // ウインドウモードに変更 DX.ChangeWindowMode(DX.TRUE); DX.SetGraphMode(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Screen.PrimaryScreen.BitsPerPixel); // DXライブラリの初期化処理 if (DX.DxLib_Init() == -1) { Application.Exit(); } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // 描画可能領域のセット DX.SetDrawArea(0, 0, ClientSize.Width, ClientSize.Height); DX.SetDrawScreen(DX.DX_SCREEN_BACK); // 裏画面を初期化 DX.ClearDrawScreen(); int w, h; DX.GetWindowSize(out w, out h); DX.DrawLine(w, 0, 0, h, DX.GetColor(255, 0, 0)); DX.DrawLine(0, 0, w, h, DX.GetColor(0, 0, 255)); DX.ScreenFlip(); } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { DX.DxLib_End(); } フォームのサイズを変更しても赤線と青線がクロスして描画されると思っていましたが 動かしてみると座標が歪んでいるかのような動きをします。 なにか使用方法が間違っているのでしょうか? 開発環境は  VisualStudio2013 使用バージョンは  VisualC#用(Ver3.24b) です。
メンテ

Page: 1 |

Re: C#にてリサイズ可能なFormを描画先にした場合の挙動について ( No.1 )
名前:管理人 日時:2023/12/20 00:11

> フォームのサイズを変更しても赤線と青線がクロスして描画されると思っていましたが > 動かしてみると座標が歪んでいるかのような動きをします。 こちらの原因は、フォームのサイズが変わってもDXライブラリが描画対象としている 画面のサイズは Form1 のコンストラクタで行っている DX.SetGraphMode(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Screen.PrimaryScreen.BitsPerPixel); ↑ こちらのサイズから変化していないからです OnPaint の際にフォームのサイズと SetGraphMode で指定したサイズが異なっていたら SetGraphMode にフォームのサイズを渡して呼び出し、フォームのサイズとDXライブラリが 描画対象とする画面のサイズを一致させるようにすれば意図された挙動となるかもしれません public int WindowSizeX; public int WindowSizeY; protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); int w, h; // 現在のウィンドウサイズを取得 DX.GetWindowSize(out w, out h); // サイズが今までと違ったら SetGraphMode を呼ぶ if( w != WindowSizeX || h != WindowSizeY ) { // DXライブラリが描画対象とする画面のサイズをウィンドウのサイズと一致するように変更 DX.SetGraphMode( w, h, 32 ); // 今回のサイズを記憶しておく WindowSizeX = w; WindowSizeX = h; } // 描画先を裏画面に変更 DX.SetDrawScreen(DX.DX_SCREEN_BACK); // 描画可能領域のセット DX.SetDrawArea(0, 0, ClientSize.Width, ClientSize.Height); // 裏画面を初期化 DX.ClearDrawScreen(); DX.DrawLine(w, 0, 0, h, DX.GetColor(255, 0, 0)); DX.DrawLine(0, 0, w, h, DX.GetColor(0, 0, 255)); DX.ScreenFlip(); }
メンテ
Re: C#にてリサイズ可能なFormを描画先にした場合の挙動について ( No.2 )
名前:のり 日時:2023/12/20 10:40

早速のご回答ありがとうございました。 ご教授いただいたように OnPaint を変更してみましたが 結果は同じでした。 (DX.SetGraphModeの戻り値もDX.DX_CHANGESCREEN_OKになっています) DX.SetUserWindow を使用して描画ハンドルを指定した場合のSetGraphMode の指定方法が間違っているのでしょうか?
メンテ
Re: C#にてリサイズ可能なFormを描画先にした場合の挙動について ( No.3 )
名前:管理人 日時:2023/12/21 01:17

駄目でしたか… 直接動作を確認できれば何が原因で意図した通りに動作していないのかが分かるかもしれませんので、 よろしければのりさんが試されているVisualC#のプロジェクトを丸ごと zip圧縮して、こちらのメールアドレス BQE00322(あっとまーく)nifty.com ( (あっとまーく) を @ に置き換えてください ) に送っていただけないでしょうか? m(_ _)m
メンテ
Re: C#にてリサイズ可能なFormを描画先にした場合の挙動について ( No.4 )
名前:のり 日時:2023/12/25 11:23

プロジェクトを添付したメールをお送りさせていただきました。 何かのヒントになるかもしれませんのでご報告いたします。 以下のPCでは意図したような動作をしました。 以下、動作したPCの情報 ---------------------------------------- デバイス名 XXXXXXXXXXXX プロセッサ Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz 3.00 GHz 実装 RAM 7.00 GB (2.96 GB 使用可能) デバイス ID XXXXXXXXXXXXXXXXXXXXXXXX プロダクト ID 00330-80000-00000-AA504 システムの種類 32 ビット オペレーティング システム、x64 ベース プロセッサ ペンとタッチ このディスプレイでは、ペン入力とタッチ入力は利用できません エディション Windows 10 Pro バージョン 22H2 インストール日 ‎2021/‎02/‎17 OS ビルド 19045.3803 エクスペリエンス Windows Feature Experience Pack 1000.19053.1000.0 どのような条件の場合動作するのか? お忙しいとは思いますがよろしくお願い致します。
メンテ
Re: C#にてリサイズ可能なFormを描画先にした場合の挙動について ( No.5 )
名前:管理人 日時:2023/12/25 22:33

メールありがとうございます、手元でも現象を確認できました DXライブラリはデフォルトでは Direct3D 11 を使用するのですが、どうも Direct3D 11 を 使用すると現状ではうまく表示できないようなので、代わりに Direct3D 9 を使用するようにしてみてください 具体的には、DX.DxLib_Init() の呼び出しより前の行に DX.SetUseDirect3DVersion( DX.DX_DIRECT3D_9EX ); という記述を追加してください こちらの記述がありますと、DXライブラリが使用する Direct3D のバージョンが 9 になります あと、Direct3D 9 を使用する場合は前回のご返信でお話した 『現在のウィンドウサイズに合わせて SetGraphMode を呼び出す』 は行わなくても大丈夫ですので // サイズが今までと違ったらSetGraphModeを呼ぶ if (w != WindowSizeX || h != WindowSizeY) { // DXライブラリが描画対象とする画面のサイズをウィンドウのサイズと一致するように変更 int ret = DX.SetGraphMode(w, h, 32); switch (ret) { case DX.DX_CHANGESCREEN_OK: System.Diagnostics.Debug.WriteLine("OK"); break; case DX.DX_CHANGESCREEN_RETURN: System.Diagnostics.Debug.WriteLine("RETUREN"); break; case DX.DX_CHANGESCREEN_DEFAULT: System.Diagnostics.Debug.WriteLine("DEFAULT"); break; } // 保存 WindowSizeX = w; WindowSizeY = h; } ↑ こちらの部分は丸ごとコメントアウト or 削除していただいて大丈夫です よろしければお試しください m(_ _)m
メンテ
Re: C#にてリサイズ可能なFormを描画先にした場合の挙動について ( No.6 )
名前:のり 日時:2023/12/26 10:38

早速のご対応、ありがとうございました。 お教えいただいたように変更しましたら、意図した結果になりました。 動作したPCは偶然にもDirect3Dのバージョンが古かったのですね。 こちらをもって解決とさせていただきます。 お忙しいところ本当にありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存