Re: フルスクリーンとウィンドウモードの切り替えについて ( No.1 ) |
- 名前:管理人 日時:2021/04/29 01:18
|
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
|
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
|
Re: フルスクリーンとウィンドウモードの切り替えについて ( No.8 ) |
- 名前:たろう(解決) 日時:2021/05/02 07:08
変更版をありがとうございます。
先ほど試して、期待した動作が得られることを確認いたしました
お忙しい中ご対応いただきありがとうございました
<(_ _)>
|
Re: フルスクリーンとウィンドウモードの切り替えについて ( No.9 ) |
- 名前:たろう 日時:2021/05/24 23:31
すみません、解決をつけたスレッドですが
関連して追加で質問させてください<(_ _)>
下に貼ったものはNo.6の赤い四角の表示部分だけ変えたプログラムですが
3840x2160の解像度のモニタで150%(ウィンドウズの拡大縮小とレイアウトの表示スケール)で表示させたところ、
変な事になりました。
WinMain内の始めのWstを変える事で、起動時のウィンドウの状態を設定する仕組みになっているのですが
これを1にして起動すると、ウィンドウ最大化から始まって、D(フルスクリーン)S(最大化)キーと
ウィンドウ状態を何度切り替えても、D、S共に1000pxサイズの赤い四角が横に4個弱(3840なので)表示されます
ですがこれを2にしてのフルスクリーン状態から起動すると、S(最大化)に切り替えた時点で
四角は3個弱になってしまいます。このときGetScreenStateで得られるSCx,SCyは3840x2160になっていますが
表示だけはウィンドウズの表示スケール150パーセントが適用されてしまっているように思います
同じくフルスクリーン→最大化を経由しているのに、起動時にフルスクリーンだったか最大化だったかで
ウィンドウズの表示スケールが適用されたりされなかったりしています
これはDXライブラリ側ではなく、ウィンドウズの仕様の問題なのかもしれませんが、
なにか解決策があればアドバイスを頂けますでしょうか?
お忙しいところすみません、宜しくお願いいたします。
-------------------------------------------------------------------------------------
#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);}
}
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=2;//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(1000*i,1000*i2,1000*i+990,1000*i2+990,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) SCb(%d)",SCx,SCy,SCb);
DrawFormatString( 0,50,GetColor(255,255,255),u8"WIx(%d) WIy(%d)",WIx,WIy);
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.10 ) |
- 名前:管理人 日時:2021/06/09 22:26
ご返信が大変遅くなり申し訳ありません
DXライブラリは最近 DPI設定が 100% 以外のときに内部で自動で
SetWindowSizeExtendRate を実行して DPI設定が 100% のときと同じ
見た目の大きさで表示されるようにしましたので、それが関係していると思います
DxLib_Init の呼び出し前に
SetWindowSizeExtendRate( 1.0 );
という記述を追加することでDXライブラリ内部での自動設定が
行われなくなりますので、よろしければお試しください m(_ _)m
( 手元ではこれで Wst の値を 1 にしても 2 にしても問題なく
動作するようになりました )
# < 他スレッドの方へ >
# 現在作業時間が非常に少なくなっています
# 投稿の順番でご返信しますので今暫くお待ち下さい m(_ _)m
|
Re: フルスクリーンとウィンドウモードの切り替えについて ( No.11 ) |
- 名前:たろう(解決) 日時:2021/06/10 21:47
いつもありがとうございます。
教えていただいた方法で
無事希望通りの表示が得られました。
お忙しい所お手数をおかけいたしました
ありがとうございました<(_ _)>
|
|