トップページ > 記事閲覧
フルスクリーンとウィンドウモードの切り替えについて
名前:たろう 日時: 2021/04/28 09:01

繰り返しすみません、たろうです 下のプログラムを、左1080x1920(ウィンドウズのディスプレイ設定で横倒し) と 右1920x1080(メイン) という状態で実行させるのですが、 A(ウィンドウ)S(最大化)D(フルスクリーン)キーで各モードを切り替えるようになっています。 始めはS(最大化)状態で、AとSを切り替えても問題なく表示されますが これを一旦D(フルスクリーン)を経由すると、そのあと左モニタでS(最大化)すると、 下半分が表示されなくなってしまいます。おそらくSetGraphModeを呼ぶと、縦が右モニタの1080になってしまい その後SetGraphModeで1080よりも大きい数字を指定しても元に戻らないのが原因のように思います。 そして、SetChangeScreenModeGraphicsSystemResetFlag(0);を使わなければこの問題は発生しないようなのですが モードを切り替える都合上使わないわけにもいかないですし これには解決法はありますでしょうか? アドバイスを頂けると助かります。 宜しくお願いいたします<(_ _)> ----------------------------------------------------------------------------------- #include "DxLib.h" int WIx=1920,WIy=1080; //結果的に使うwinサイズ int MOx=WIx/2 ,MOy=WIy/2; //ウィンドウモード時の開始時winサイズ int mxWIx=0,mxWIy=0; //全モニタ最大サイズ int pWIx=1920,pWIy=1080; //プライマリwinサイズ int Wst=0; //WIN状態 (2fullscreen 1windowfull 0window) void GetMonitor() { int Monitors=GetDisplayNum(),MINx,MINy; for(int i=0;i<(Monitors);i++) { int x,y,dx,dy,Prm; GetDisplayInfo(i, &x,&y, &dx,&dy ,&Prm); if(Prm==TRUE){pWIx=dx;pWIy=dy;} if(mxWIx<dx)mxWIx=dx;if(mxWIy<dy)mxWIy=dy; if(i==0){MINx=dx;MINy=dy;}else{if(MINx>dx)MINx=dx;if(MINy>dy)MINy=dy;} } if(Wst==2){WIx=pWIx;WIy=pWIy;}else{WIx=mxWIx;WIy=mxWIy;} MOx=MINx*0.75;MOy=MINy*0.75; } void CTRL() { static int st=-1; if(Wst==2)//フルスクリーン { if(st!=2){ChangeWindowMode(FALSE);SetGraphMode( pWIx, pWIy,16);st=2; SetMouseDispFlag(TRUE);}//SetChangeScreenModeGraphicsSystemResetFlag(FALSE);をDxLib_Init()前に呼ぶ } else if(Wst==1)//最大化 { if(st!=1) { if(st==2){ChangeWindowMode(TRUE); SetGraphMode(mxWIx,mxWIy,16);}st=1; SetWindowLongPtr(GetMainWindowHandle(),GWL_EXSTYLE,WS_EX_TOOLWINDOW); SetWindowLongPtr(GetMainWindowHandle(),GWL_STYLE,WS_POPUP | WS_SYSMENU | WS_VISIBLE) ; SetWindowPos( GetMainWindowHandle(),NULL,0,0,0,0, (SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED) ); ShowWindow( GetMainWindowHandle(),SW_MAXIMIZE ); } } else if(Wst==0)//ウィンドウ { if(st!=0) { if(st==2){ChangeWindowMode(TRUE); SetGraphMode( mxWIx,mxWIy,16);}st=0; ShowWindow( GetMainWindowHandle(),SW_RESTORE); SetWindowLongPtr(GetMainWindowHandle(),GWL_EXSTYLE,WS_EX_LEFT) ; SetWindowLongPtr(GetMainWindowHandle(),GWL_STYLE,WS_OVERLAPPEDWINDOW | WS_VISIBLE) ; SetWindowPos( GetMainWindowHandle(),NULL,0,0,0,0, (SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED) ); } } } int FRST() { GetMonitor(); if(Wst<2){ChangeWindowMode(1);SetGraphMode(WIx ,WIy ,16);} else { SetGraphMode(pWIx,pWIy,16);} SetWindowSizeChangeEnableFlag(1,0); if(Wst<2){SetWindowSize(MOx,MOy);} if( DxLib_Init()<0)return -1; SetChangeScreenModeGraphicsSystemResetFlag(0); SetDrawScreen( DX_SCREEN_BACK ); CTRL(); return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { Wst=1;//WIN状態 (2fullscreen 1maxwin 0win) FRST(); int mx,my,i=0; while( ProcessMessage() == 0 ) { ClearDrawScreen() ;GetMousePoint(&mx,&my) ; for(int i=0;i<50;i++){for(int i2=0;i2<50;i2++){if((i+i2)%1==0)DrawBox(100*i,100*i2,100*i+50,100*i2+50,GetColor(255,0,0),1);}} DrawFormatString( 0,10,GetColor(255,255,255),u8"x(%d) y(%d) Wst(%d)",mx,my,Wst); ScreenFlip(); if(CheckHitKey(KEY_INPUT_A)&&i<0){Wst=0;CTRL();i=15;} if(CheckHitKey(KEY_INPUT_S)&&i<0){Wst=1;CTRL();i=15;} if(CheckHitKey(KEY_INPUT_D)&&i<0){Wst=2;CTRL();i=15;}i--; if(CheckHitKey(KEY_INPUT_ESCAPE)){break;} } DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: フルスクリーンとウィンドウモードの切り替えについて ( No.1 )
名前:管理人 日時:2021/04/29 01:18

DXライブラリの内部でプライマリディスプレイのサイズ以上の解像度を SetGraphMode で 指定できないようにしている処理がありましたので、ウィンドウモードの場合は 全てのディスプレイの解像度よりも大きなサイズを SetGraphMode で指定している 場合のみエラーとするようにしました 手元では載せて頂いたコードで正常に動作することが確認できましたので、 よろしければその変更を加えたこちらのバージョンをお試しになってみてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: フルスクリーンとウィンドウモードの切り替えについて ( No.2 )
名前:たろう 日時:2021/04/29 11:35

お忙しい所、いつもありがとうございます。 @修正版を試してみましたが、私の環境では何も変わらず 下半分がカットされた状態のままでした… Aまた、修正版で下のプログラムを実行すると、何も表示されないようになってしまいます。。 2021.04.02(DXライブラリ)のバージョンで起動すると赤い四角がたくさん表示されるプログラムですので その間のどこかで何か関連する修正がありましたでしょうか? 何度もすみません、ご確認いただけると助かります 宜しくお願いいたします<(_ _)> ------------------------------------------------------------------------------- #include "DxLib.h" int WIx=1920,WIy=1080,WIxh=WIx/2,WIyh=WIy/2; int MKx=2200,MKy=2200,MKxh=MKx/2,MKyh=MKy/2; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(1); SetGraphMode(1920,1080,16); SetWindowSizeChangeEnableFlag(1,0); if( DxLib_Init()<0)return -1; SetUsePremulAlphaConvertLoad(1); SetFontCacheUsePremulAlphaFlag(1); SetChangeScreenModeGraphicsSystemResetFlag(0); SetDrawScreen( DX_SCREEN_BACK ); if( DxLib_Init()<0)return -1; int MK=MakeScreen(MKx,MKy,1); while( ProcessMessage() == 0 ) { ClearDrawScreen() ; SetDrawScreen(MK); for(int i=0;i<50;i++){for(int i2=0;i2<50;i2++){if((i+i2)%1==0)DrawBox(100*i,100*i2,100*i+50,100*i2+50,GetColor(255,0,0),1);}} SetDrawScreen(DX_SCREEN_BACK); DrawRotaGraph2F(WIxh,WIyh, MKxh,MKyh, 1.0,0, MK,1); SetDrawScreen(MK); ClearDrawScreen(); SetDrawScreen(DX_SCREEN_BACK); ScreenFlip(); if(CheckHitKey(KEY_INPUT_ESCAPE)){break;} } DxLib_End(); return 0; }
メンテ
Re: フルスクリーンとウィンドウモードの切り替えについて ( No.3 )
名前:管理人 日時:2021/04/30 01:54

うーん駄目でしたか… Aの現象については確認したところ、ご指摘の通り最近DXライブラリのコードに加えた変更が原因でした 修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) この変更で@にも変化があると良いのですが…
メンテ
Re: フルスクリーンとウィンドウモードの切り替えについて ( No.4 )
名前:たろう 日時:2021/04/30 07:32

修正版をありがとうございます。 @は、下半分が消える症状に変わりありませんでしたが Aの症状は完全に回復していました。ありがとうございます そうなりますと、@については SetChangeScreenModeGraphicsSystemResetFlag(0);は使用せずに、 デバイスロストや、ウィンドウモードの切り替えのタイミングで、 InitGraph();で読んだ画像を全て削除をして もう一度全て読み直す仕組みで対応する感じでしょうか?
メンテ
Re: フルスクリーンとウィンドウモードの切り替えについて ( No.5 )
名前:管理人 日時:2021/05/01 22:29

Aは直ったようで何よりです > そうなりますと、@については > SetChangeScreenModeGraphicsSystemResetFlag(0);は使用せずに、 > デバイスロストや、ウィンドウモードの切り替えのタイミングで、 > InitGraph();で読んだ画像を全て削除をして > もう一度全て読み直す仕組みで対応する感じでしょうか? そちらの方法でも問題ありませんが、@についても修正できると思います ただ、私の手元にたろうさんの現象を再現するための環境が無いので原因の究明が難しい状態です… よろしければ『下半分がカットされた状態』になった際に GetScreenState で画面のサイズを取得して、 得られる値はどのようになっているか( たろうさんの意図した画面サイズになっているか ) ご確認の上、教えていただけないでしょうか? m(_ _;m
メンテ
Re: フルスクリーンとウィンドウモードの切り替えについて ( No.6 )
名前:たろう 日時:2021/05/02 00:09

ありがとうございます、 GetScreenStateの値を調べましたところ @S(最大化) SCx=1920 SCy=1920(※左モニタいっぱいに赤い四角) ↓ AA(ウィンドウ) SCx=1920 SCy=1920 ↓ BD(フルスクリーン) SCx=1920 SCy=1080 ↓ CA(ウィンドウ) SCx=1920 SCy=1080 ↓ DS(最大化) SCx=1920 SCy=1080(※ウィンドウが左モニタに最大化されるが赤い四角は下半分は表示されない) という状態でした 私が意図しているのはCDでxyとも1920(xは右モニタの1920、yは左モニタ(※横倒し)の1920が最大値なので)となる状態です 以下がチェック用に修正したプログラムです。よろしくお願いいたします<(_ _)> #include "DxLib.h" int WIx=1920,WIy=1080; //結果的に使うwinサイズ int MOx=WIx/2 ,MOy=WIy/2; //ウィンドウモード時の開始時winサイズ int mxWIx=0,mxWIy=0; //全モニタ最大サイズ int pWIx=1920,pWIy=1080; //プライマリwinサイズ int Wst=0; //WIN状態 (2fullscreen 1windowfull 0window) void GetMonitor() { int Monitors=GetDisplayNum(),MINx,MINy; for(int i=0;i<(Monitors);i++) { int x,y,dx,dy,Prm; GetDisplayInfo(i, &x,&y, &dx,&dy ,&Prm); if(Prm==TRUE){pWIx=dx;pWIy=dy;} if(mxWIx<dx)mxWIx=dx;if(mxWIy<dy)mxWIy=dy; if(i==0){MINx=dx;MINy=dy;}else{if(MINx>dx)MINx=dx;if(MINy>dy)MINy=dy;} } if(Wst==2){WIx=pWIx;WIy=pWIy;}else{WIx=mxWIx;WIy=mxWIy;} MOx=MINx*0.75;MOy=MINy*0.75; } void CTRL() { static int st=-1; if(Wst==2)//フルスクリーン { if(st!=2){ChangeWindowMode(FALSE);SetGraphMode( pWIx, pWIy,16);st=2; SetMouseDispFlag(TRUE);}//SetChangeScreenModeGraphicsSystemResetFlag(FALSE);をDxLib_Init()前に呼ぶ } else if(Wst==1)//最大化 { if(st!=1) { if(st==2){ChangeWindowMode(TRUE); SetGraphMode(mxWIx,mxWIy,16);}st=1; SetWindowLongPtr(GetMainWindowHandle(),GWL_EXSTYLE,WS_EX_TOOLWINDOW); SetWindowLongPtr(GetMainWindowHandle(),GWL_STYLE,WS_POPUP | WS_SYSMENU | WS_VISIBLE) ; SetWindowPos( GetMainWindowHandle(),NULL,0,0,0,0, (SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED) ); ShowWindow( GetMainWindowHandle(),SW_MAXIMIZE ); } } else if(Wst==0)//ウィンドウ { if(st!=0) { if(st==2){ChangeWindowMode(TRUE); SetGraphMode( mxWIx,mxWIy,16);}st=0; ShowWindow( GetMainWindowHandle(),SW_RESTORE); SetWindowLongPtr(GetMainWindowHandle(),GWL_EXSTYLE,WS_EX_LEFT) ; SetWindowLongPtr(GetMainWindowHandle(),GWL_STYLE,WS_OVERLAPPEDWINDOW | WS_VISIBLE) ; SetWindowPos( GetMainWindowHandle(),NULL,0,0,0,0, (SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED) ); } } } int FRST() { GetMonitor(); if(Wst<2){ChangeWindowMode(1);SetGraphMode(WIx ,WIy ,16);} else { SetGraphMode(pWIx,pWIy,16);} SetWindowSizeChangeEnableFlag(1,0); if(Wst<2){SetWindowSize(MOx,MOy);} if( DxLib_Init()<0)return -1; SetChangeScreenModeGraphicsSystemResetFlag(0); SetDrawScreen( DX_SCREEN_BACK ); CTRL(); return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { Wst=1;//WIN状態 (2fullscreen 1maxwin 0win) FRST(); int mx,my,i=0,SCx,SCy,SCb=0; while( ProcessMessage() == 0 ) { ClearDrawScreen() ;GetMousePoint(&mx,&my) ;GetScreenState(&SCx,&SCy,&SCb) ; for(int i=0;i<50;i++){for(int i2=0;i2<50;i2++){if((i+i2)%1==0)DrawBox(100*i,100*i2,100*i+50,100*i2+50,GetColor(255,0,0),1);}} DrawFormatString( 0,10,GetColor(255,255,255),u8"x(%d) y(%d) Wst(%d)",mx,my,Wst); DrawFormatString( 0,30,GetColor(255,255,255),u8"SCx(%d) SCy(%d) Wst(%d)",SCx,SCy,SCb); ScreenFlip(); if(CheckHitKey(KEY_INPUT_A)&&i<0){Wst=0;CTRL();i=15;} if(CheckHitKey(KEY_INPUT_S)&&i<0){Wst=1;CTRL();i=15;} if(CheckHitKey(KEY_INPUT_D)&&i<0){Wst=2;CTRL();i=15;}i--; if(CheckHitKey(KEY_INPUT_ESCAPE)){break;} } DxLib_End(); return 0; }
メンテ
Re: フルスクリーンとウィンドウモードの切り替えについて ( No.7 )
名前:管理人 日時:2021/05/02 01:31

ご確認ありがとうございます 頂いたご情報を元に少しプログラムを変更してみましたので よろしければこちらの変更版を試してみてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: フルスクリーンとウィンドウモードの切り替えについて ( No.8 )
名前:たろう(解決) 日時:2021/05/02 07:08

変更版をありがとうございます。 先ほど試して、期待した動作が得られることを確認いたしました お忙しい中ご対応いただきありがとうございました <(_ _)>
メンテ

Page: 1 |

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

   クッキー保存