トップページ > 過去ログ > 記事閲覧
ソフトウェア画像とデバイスロストとフルスク切り替え
名前:sy(サイ) 日時: 2012/04/09 19:57

ライブラリの機能に疑問があったので、質問させてください。 現在、フルスクリーン切り替え時の画像の消失は SetChangeScreenModeGraphicsSystemResetFlag( TRUE ); で防げると思います。 フルスク時にもデバイスロストが発生して、ライブラリ側でこの機能を使えば復帰できるように思います。 通常時にデバイスロストが起こった場合も自動的に復帰してると思います。 少し前にソフトウェア画像に対してもデバイスロスト対策がなされていると思います。 SetUseGraphBaseDataBackup( TRUE ); これを使用すれば内部のバックアップから自動的に復帰すると思います。 しかし、フルスクリーン切り替え時にはソフトウェア画像が復帰しませんが、これについても復帰は可能なのでしょうか? またフォントの画像はデバイスロスト時に復帰できなかったのを確認しました。 フルスクリーン時にタイマーで起動するアプリを開きました。一時的にデスクトップ画面に戻り、 ALT+Tab等で戻ると、文字の描画時にエラーでフリーズしました。 もし、ライブラリを最新にすれば可能なのであればごめんなさい。

Page: 1 |

Re: ソフトウェア画像とデバイスロストとフルスク切り替え ( No.1 )
名前:いっち 日時:2012/04/10 19:58

> しかし、フルスクリーン切り替え時にはソフトウェア画像が復帰しませんが、これについても復帰は可能なのでしょうか? 私の環境で以下のテストコードを実行し最大化を行った場合 gh1 と gh2 の画像は復帰します。 (DXライブラリは3.07dを使用しました。) > またフォントの画像はデバイスロスト時に復帰できなかったのを確認しました。 「フォントの画像」とはどういったものの事でしょうか? //- 以下、テストコード ("tex1.bmp""tex2.bmp"を使用) -// #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { ChangeWindowMode( TRUE ); SetWindowText( "DxLib:" DXLIB_VERSION_STR ); if ( DxLib_Init( ) == -1 ) return -1; SetUseASyncChangeWindowModeFunction( TRUE, 0, 0 ); SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); int white = GetColor( 255, 255, 255 ); int sh = MakeSoftImage( 64, 64 ); FillSoftImage( sh, 0, 0, 0, 255 ); DrawLineSoftImage( sh, 0, 0, 64, 64, 255, 0, 0, 255 ); int gh1 = CreateGraphFromSoftImage( sh ); DeleteSoftImage( sh ); int gh2 = LoadGraph( "tex1.bmp" ); SetUseGraphBaseDataBackup( FALSE ); int gh3 = LoadGraph( "tex2.bmp" ); SetUseGraphBaseDataBackup( TRUE ); SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); DrawFormatString( 0, 0, white, "TEST" ); DrawGraph( 0, 0, gh1, TRUE ); DrawGraph( 128, 0, gh2, TRUE ); DrawGraph( 256, 0, gh3, TRUE ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: ソフトウェア画像とデバイスロストとフルスク切り替え ( No.2 )
名前:sy(サイ) 日時:2012/04/10 23:37

>> しかし、フルスクリーン切り替え時にはソフトウェア画像が復帰しませんが、これについても復帰は可能なのでしょうか? > 私の環境で以下のテストコードを実行し最大化を行った場合 gh1 と gh2 の画像は復帰します。 > (DXライブラリは3.07dを使用しました。) 最大化時は大丈夫ですが、ChangeWindowModeでのウインドウモード変更時に飛びます。 >> またフォントの画像はデバイスロスト時に復帰できなかったのを確認しました。 > 「フォントの画像」とはどういったものの事でしょうか? デバイスロスト時にCreateFontToHandleなどで作ったフォントデータが飛びます。
Re: ソフトウェア画像とデバイスロストとフルスク切り替え ( No.3 )
名前:いっち 日時:2012/04/11 21:33

> 最大化時は大丈夫ですが、ChangeWindowModeでのウインドウモード変更時に飛びます。 > デバイスロスト時にCreateFontToHandleなどで作ったフォントデータが飛びます。 以下のようなテストコードで試してみたところやはり gh1 と gh2 については復旧しました。 フォントハンドルについては確かに無効になっていました。 //- 以下、テストコード ("tex1.bmp""tex2.bmp"を使用) -// // マウスホイールでウィンドウモードの切り替え #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { // ChangeWindowMode( TRUE ); SetWindowText( "DxLib:" DXLIB_VERSION_STR ); if ( DxLib_Init( ) == -1 ) return -1; SetUseASyncChangeWindowModeFunction( TRUE, 0, 0 ); SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); int white = GetColor( 255, 255, 255 ); int fh = CreateFontToHandle( NULL, 40, 3 ); int sh = MakeSoftImage( 64, 64 ); FillSoftImage( sh, 64, 64, 64, 255 ); DrawLineSoftImage( sh, 0, 0, 64, 64, 255, 0, 0, 255 ); int gh1 = CreateGraphFromSoftImage( sh ); DeleteSoftImage( sh ); int gh2 = LoadGraph( "tex1.bmp" ); SetUseGraphBaseDataBackup( FALSE ); int gh3 = LoadGraph( "tex2.bmp" ); SetUseGraphBaseDataBackup( TRUE ); SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { if ( GetMouseWheelRotVol( ) > 0 ) { ChangeWindowMode( (GetWindowModeFlag( ) ? FALSE : TRUE) ); } ClearDrawScreen( ); DrawFormatString( 0, 0, white, "TEST" ); DrawFormatStringToHandle( 0, 256, white, fh, "TEST" ); DrawGraph( 0, 0, gh1, TRUE ); DrawGraph( 64, 0, gh2, TRUE ); DrawGraph( 128, 0, gh3, TRUE ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: ソフトウェア画像とデバイスロストとフルスク切り替え ( No.4 )
名前:管理人 日時:2012/04/15 17:12

画面モードの切り替えで SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); をしていても フォントハンドルが無効になる現象を確認できました 修正版をアップしましたので、よろしければお試しになってみてください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) ただ、私の環境でもソフトウエア画像の復帰がされないというのは再現しませんでした いっちさんが No.3 に載せて下さったテストプログラムを実行しても現象は発生するのでしょうか? あと確認なのですが、画面モードの切り替えを行ってもグラフィックハンドルの初期化が 行われないようにするには SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); を実行しておく必要があります また、上記を実行していても SetUseGraphBaseDataBackup( FALSE ); の設定にされた状態で作成したグラフィックハンドルは画面モードの切り替えを行うと画像が壊れます そして SetUseGraphBaseDataBackup( TRUE ); の設定にした状態で作成したグラフィックハンドルも SetChangeScreenModeGraphicsSystemResetFlag の 設定が TRUE になっている場合はやはりグラフィックハンドルは初期化されます 上記の点を考慮した場合でも画面モードの変更でソフトウエア画像が削除されるのでしょうか?
Re: ソフトウェア画像とデバイスロストとフルスク切り替え ( No.5 )
名前:sy(サイ) 日時:2012/04/20 01:26

返信ありがとうございます。 SetChangeScreenModeGraphicsSystemResetFlag( FALSE ); 手違いで上記をTRUEにしてしまっていました^^; 無事復帰可能になりました。 フォントへの対応ありがとうございます!

Page: 1 |