トップページ > 記事閲覧
(C#)SetUserWindowが2回目だけ反映されない
名前:SAT 日時: 2016/07/02 03:22

いつもDXライブラリを使わせて頂いております。 不具合?と思われる現象を確認しましたので報告させて頂きます。 C#のフォームアプリケーションでRPGを作るためのツールを開発していて、 タブを切り替えて、マップ/アニメーションと2つの編集をできるようにしています。 これらの描画にDXライブラリを使っていて、描画先の切り替えにSetUserWindow関数を呼び出しています。 今までは 3.13d のバージョンを使っていて特に問題なかったのですが、 最新バージョンでサウンド関係の機能に追加があったため更新したところ、 SetUserWindow関数で描画先を切り替えてもそれが反映されないケース(2回目のみ)が出てきてしまいました。 実際にその現象を確認したのは、3.15e と 3.16d のバージョンです。 DXLib_Init+初回のSetUserWindowは正常反映。 2回目のSetUserWindowのみ反映されない。 3回目のSetUserWindow以降は正常反映。 簡略ながら、処理手順の概要を以下に示します。 1. マップ編集画面のPanelコントロールに描画先を当てる DX.SetScreenFlipTargetWindow(...); DX.SetUserWindow(...); DX.SetDrawScreen(DX.DX_SCREEN_BACK); DX.DxLib_Init(); // ここでの描画処理は正常に反映される DX.ScreenFlip(); 2. アニメーション編集画面のPanelコントロールに描画先を当てる DX.SetScreenFlipTargetWindow(...); DX.SetUserWindow(...); // ここで描画処理をすると、その結果が反映されない DX.ScreenFlip(); 3. 再度、マップ編集画面に描画先を当てる DX.SetScreenFlipTargetWindow(...); DX.SetUserWindow(...); // これ以降、描画先を変更しても正常に反映される DX.ScreenFlip(); ※ マップ編集画面とアニメーション編集画面を切り替える順序を入れ替えても同様のことが起こりました。 C++や他のバージョンでは確認していないので恐縮ですが、ご確認頂けたら幸いです。 何卒、よろしくお願い申し上げます。
メンテ

Page: 1 |

Re: (C#)SetUserWindowが2回目だけ反映されない ( No.1 )
名前:管理人 日時:2016/07/03 13:35

描画先の切り替えは SetScreenFlipTargetWindow のみ実行すれば良いように なっていますので、処理の内容を以下のように変更してみていただけないでしょうか? 1. マップ編集画面のPanelコントロールに描画先を当てる DX.SetUserWindow(...); DX.DxLib_Init(); DX.SetDrawScreen(DX.DX_SCREEN_BACK); DX.ScreenFlip(); 2. アニメーション編集画面のPanelコントロールに描画先を当てる DX.SetScreenFlipTargetWindow(...); DX.SetDrawScreen(DX.DX_SCREEN_BACK); DX.ScreenFlip(); 3. 再度、マップ編集画面に描画先を当てる DX.SetScreenFlipTargetWindow(...); DX.SetDrawScreen(DX.DX_SCREEN_BACK); DX.ScreenFlip(); 変更点は以下の通りです ・SetDrawScreen( DX_SCREEN_BACK ); は DxLib_Init の後に実行、その他にも  SetScreenFlipTargetWindow の後に SetDrawScreen( DX_SCREEN_BACK ); を実行 ・1の時点では SetUserWindow のみ使用 ・2,3では SetScreenFlipTargetWindow のみ使用
メンテ
Re: (C#)SetUserWindowが2回目だけ反映されない ( No.2 )
名前:SAT 日時:2016/07/03 18:51

ご返信ありがとうございます。 なるほど、2回目以降はSetScreenFlipTargetWindowの実行だけで良かったのですね。 しかし、指示のあった通りに修正を試みたのですが、依然として同様の現象が起きています…。 一行ずつ実行してみても、特に必要な処理が行われていないわけでもないようです。 描画処理を行ってからScreenFlipしているが、それが画面に反映されない、といった具合です。 実際に動かしている動画をアップしましたので、お時間がありましたらご覧下さい。 初回はマップ画面に描画先が当てられており、2回目にアニメーション画面へと移しています。 https://youtu.be/uVU3bPYPDVU 描画先を切り替える処理を行っている部分のコード(修正後)を以下に載せます。 描画とScreenFlipはこの後にTimerを使って行っています。 /// <summary> /// DXライブラリを初期化します。 /// 描画領域のサイズは、初期化に使用した宛先コントロールの初期サイズで固定されます。 /// </summary> public static void Init(IntPtr dest) { DXLibrary.DrawTask.Enabled = false; //リソース初期化 DXLibrary.ClearResources(); if(DX.DxLib_IsInit() == DX.TRUE) { DX.SetScreenFlipTargetWindow(dest); } else { //無効にする DX.SetUseDirectInputFlag(DX.FALSE); //有効にする DX.SetDoubleStartValidFlag(DX.TRUE); DX.SetUseVramFlag(DX.TRUE); DX.SetUseIMEFlag(DX.TRUE); DX.ChangeWindowMode(DX.TRUE); //その他 DX.ChangeFontType(DX.DX_FONTTYPE_ANTIALIASING); DX.SetUserWindow(dest); //初期化実行 if(DX.DxLib_Init() == -1) { MessageBox.Show(Resources.MsgE_Failed.Replace("$", "描画エリアの設定"), Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); return; //初期化に失敗 } } DX.SetDrawScreen(DX.DX_SCREEN_BACK); //定期的に描画処理を行う if(DXLibrary.Setupped == false) { DXLibrary.Setupped = true; DXLibrary.DrawTask.Tick += DXLibrary.Draw; DXLibrary.DrawTask.Interval = 10; } }
メンテ
Re: (C#)SetUserWindowが2回目だけ反映されない ( No.3 )
名前:管理人 日時:2016/07/04 01:04

動画と参考コードのご提供ありがとうございます 手元でも1回目の SetScreenFlipTargetWindow のみ正常に機能しない現象を 再現することができました 修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: (C#)SetUserWindowが2回目だけ反映されない ( No.4 )
名前:SAT(解決) 日時:2016/07/04 08:30

アップロード頂いた修正版で無事、正常動作しました! 迅速なご対応、本当にありがとうございました。 これにて解決とさせて頂きます。
メンテ

Page: 1 |

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

   クッキー保存