トップページ > 記事閲覧
仮想フルスクリーンモード
名前:たろう 日時: 2014/11/15 18:53

バージョン3.10eを使い、SetUseASyncChangeWindowModeFunctionや SetWindowSizeChangeEnableFlagで、ウィンドウモードのまま 最大化することでフルスクリーン様の表示にしていたのですが、 最新のバージョン(Ver 3.13)に変えた所、最大化ボタンを押した瞬間に 本物のフルスクリーンモードに勝手になってしまうようになりました。 それでSetWindowStyleMode(7)で仮想フルスクリーンの状態にしようと しているのですが、ゲームのアスペクト比がデスクトップのそれと 同じサイズでない場合に、下のデスクトップがはみ出てしまいます。 さらに例え同じ比率にしたとしても、解像度が違うとやはりずれて 右や下に1ドットくらいはみ出ます。 3.10eを使っていた時は↓のページの一番下の方法を使うと (ttp://dixq.net/forum/viewtopic.php?f=3&t=8279) はみ出る部分は黒になるので下が見えてしまう事はありませんでした。 フルスクリーンモードはALT+TABなどで画面を切り替えて戻った時に makescreenで作った画像などが消えてしまい、それを多用している 都合もあり(※すみません、これは使い方が悪いのかもしれません)、 またソフトの縦横サイズも特殊で速度の恩恵を受けられず避けています。 SetWindowStyleMode(7)を使ってアスペクト比がデスクトップのそれと 異なる場合にウィンドウの下がはみ出ずに黒が表示されるような方法 はありますでしょうか?色々試しているのですがうまくいきません。 よろしければアドバイスをお願い致します。
メンテ

Page: 1 |

Re: 仮想フルスクリーンモード ( No.1 )
名前:管理人 日時:2014/11/16 00:44

最新バージョンで擬似フルスクリーンモードを実現するサンプルプログラムを作成してみましたので、 よろしければご覧ください なお、こちらで ALT + ENTER が押されたかどうかの判断に使用している GetInputSystemChar は 今回追加した関数なので、この関数を追加したこちらのバージョンをお使いください 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/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) #include "DxLib.h" #define SCREEN_SIZE_X (640) #define SCREEN_SIZE_Y (480) int NowWindowSizeX ; int NowWindowSizeY ; int FullScreenMode ; int WindowPositionX ; int WindowPositionY ; int DesktopSizeX ; int DesktopSizeY ; int DesktopColorBitDepth ; int DesktopRefreshRate ; int SubScreenHandle ; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, x, add ; int AltPlusEnter ; // デスクトップの情報を取得する GetDefaultState( &DesktopSizeX, &DesktopSizeY, &DesktopColorBitDepth, &DesktopRefreshRate ) ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // 最大化ボタン付きウインドウにする SetWindowStyleMode( 7 ) ; // ウインドウサイズにソフトの画面をフィットさせない設定にする SetWindowSizeChangeEnableFlag( FALSE, FALSE ) ; // ソフト画面のサイズはデスクトップと同じにする SetGraphMode( DesktopSizeX, DesktopSizeY, 32 ) ; // ウインドウのサイズはソフト画面のサイズにする SetWindowSize( SCREEN_SIZE_X, SCREEN_SIZE_Y ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { return -1 ; } // 初期状態はウインドウモード FullScreenMode = FALSE ; // ソフト画面描画用の描画対象に出来る画像を作成 SubScreenHandle = MakeScreen( SCREEN_SIZE_X, SCREEN_SIZE_Y, FALSE ) ; // 画像の読み込み handle = LoadGraph( "Test1.bmp" ) ; // メインループ x = 0 ; add = 8 ; while( ProcessMessage() == 0 ) { // 現在のウインドウのサイズを取得する GetWindowSize( &NowWindowSizeX, &NowWindowSizeY ) ; // ALT + ENTER が押されたかどうかを取得しておく AltPlusEnter = GetInputSystemChar( TRUE ) == CTRL_CODE_CR ; // ウインドウモードで、且つウインドウのサイズがソフト画面のサイズではなくなった場合( 最大化ボタンが押された場合 )か、 // 又は ALT + ENTER が押されたら擬似フルスクリーンモードにする if( FullScreenMode == FALSE && ( ( NowWindowSizeX != SCREEN_SIZE_X && NowWindowSizeY != SCREEN_SIZE_Y ) || AltPlusEnter ) ) { // 擬似フルスクリーンモードかどうかのフラグを立てる FullScreenMode = TRUE ; // ウインドウをクライアント領域以外何も無いタイプにする SetWindowStyleMode( 4 ) ; // ウインドウの位置をデスクトップの一番左上に移動 SetWindowPosition( 0, 0 ) ; // ウインドウサイズをデスクトップと同じにする SetWindowSize( DesktopSizeX, DesktopSizeY ) ; // 裏画面をクリア SetDrawScreen( DX_SCREEN_BACK ) ; ClearDrawScreen() ; } else // 擬似フルスクリーンモードで、且つ ALT + ENTER が押されたらウインドウモードにする if( FullScreenMode == TRUE && AltPlusEnter ) { // 擬似フルスクリーンモードかどうかのフラグを倒す FullScreenMode = FALSE ; // 最大化ボタン付きウインドウにする SetWindowStyleMode( 7 ) ; // ウインドウのサイズをソフト画面と等しくする SetWindowSize( SCREEN_SIZE_X, SCREEN_SIZE_Y ) ; // ウインドウの位置を元に戻す SetWindowPosition( WindowPositionX, WindowPositionY ) ; // 裏画面をクリア SetDrawScreen( DX_SCREEN_BACK ) ; ClearDrawScreen() ; } // ウインドウモードの場合はウインドウの座標を取得しておく if( FullScreenMode == FALSE ) { GetWindowPosition( &WindowPositionX, &WindowPositionY ) ; } // 描画先をソフト画面描画用のグラフィックハンドルにする SetDrawScreen( SubScreenHandle ) ; // 画面のクリア ClearDrawScreen() ; // 移動 x += add ; if( x < 0 || x > 640 ) add = -add ; // 画像の描画 DrawGraph( x, 0, handle, TRUE ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 擬似フルスクリーンモードかどうかで処理を分岐 if( FullScreenMode == TRUE ) { // 擬似フルスクリーンモードの場合 int ScalingSizeX ; int ScalingSizeY ; int DrawX ; int DrawY ; // 描画モードはバイリニア補間モードにする SetDrawMode( DX_DRAWMODE_BILINEAR ) ; // 裏画面への拡大描画のサイズを決定 ScalingSizeX = DesktopSizeY * SCREEN_SIZE_X / SCREEN_SIZE_Y ; if( ScalingSizeX < DesktopSizeX ) { ScalingSizeY = DesktopSizeY ; } else { ScalingSizeX = DesktopSizeX ; ScalingSizeY = DesktopSizeX * SCREEN_SIZE_Y / SCREEN_SIZE_X ; } // 裏画面の中央にソフト画面描画用のグラフィックハンドルを拡大して描画 DrawX = ( DesktopSizeX - ScalingSizeX ) / 2 ; DrawY = ( DesktopSizeY - ScalingSizeY ) / 2 ; DrawExtendGraph( DrawX, DrawY, DrawX + ScalingSizeX, DrawY + ScalingSizeY, SubScreenHandle, FALSE ) ; } else { // ウインドウモードの場合は等倍でソフト画面描画用のグラフィックハンドルを描画 DrawGraph( 0, 0, SubScreenHandle, FALSE ) ; } // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } このサンプルで行っていることはプログラムの注釈の通りですが、要約すると SetGraphMode でソフト画面のサイズをデスクトップと同じにして、 擬似フルスクリーンモードの場合はウインドウモードを 4 の枠無しウインドウにして、 ウインドウをデスクトップ一杯に表示しつつ、ゲームの画面をウインドウ中央に拡大して描画、 擬似フルスクリーンモードではない場合はウインドウモードを 7 の最大化ボタン付き ウインドウにして、ウインドウのサイズもゲームの画面と同じにして、ゲームの画面を等倍で描画 最大化ボタンが押されたか、ALT+ENTER が押されたら擬似フルスクリーンモードかどうかを切り替え ということをしています よろしければお試しください m(_ _)m
メンテ
Re: 仮想フルスクリーンモード ( No.2 )
名前:たろう 日時:2014/11/16 06:53

サンプルプログラムのおかげで、SetWindowSizeの存在を知り なんとか望みに近い形にできました。このような機能があるとは 全く調べが足りませんでした。すみませんm(_ _)m ソフトの横ドット数は固定で、デスクトップの縦横比に合わせて縦を伸縮。 この数値をSetGraphModeに入れてソフト画面サイズを設定して、 最大化時にSetWindowStyleModeを7から4に変えて直後に SetWindowSizeでデスクトップ解像度とウィンドウサイズを完全に 一致させて隙間が出ないようにするという方法にしました。 ALT+ENTERについてですが、私の文章の拙さから ひょっとして誤解が生まれてしまったかも知れません。 重ね重ね申し訳ございませんm(_ _)m フルスクリーンモード(本物)で、作ったゲームを実行中 に一旦別の作業をしたい時など、ALT+TABで別のソフトにアクティブ ウィンドウを切り替えて、もう一度フルスクリーン表示しているゲームに 戻るようなケースについて書かせて頂きました。 この時LoadGraphなどで読み込んだ画像は表示されるのですが、 MakeScreen関数で合成して作った画像が消えました。 (特殊な使い方なので異常ではないと思いますがご報告迄) お忙しいところ大変お手数をお掛けいたしました。 SetWindowSizeのようなことをウィンドウズのSetWindowPosなどで 試みて失敗し、手詰まりになって今回質問させていただきましたが 本当にずっと悩んでいたものですから助かりました。 ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存