トップページ > 記事閲覧
マルチモニタで任意のモニタに枠なしでウィンドウを最大化する方法について
名前:たろう 日時: 2020/09/23 20:46

いつもおせわになっております。 次々とすみません、またたろうです マルチモニタで使用している際、 SetWindowStyleMode( 7 ) ;で最大化ボタンを追加して、ボタンを押すと ウィンドウが右モニタにある時は右で最大化、左なら左で最大化されますが このときSetWindowStyleMode( 4 ) ;で枠なしにしようとすると、ウィンドウが右(メイン)の中央に移動してしまい 最大化させたい方のモニタで最大化させるというウィンドウズの(便利な?)挙動が失われてしまいます。 それを修正するために作ったのが下のプログラムですが、 一度最大化されたものをSetWindowStyleMode( 4 ) ;で元に戻されて位置も中心に寄せられ それをもう一度正しい位置に戻して、SendMessageでもう一度最大化するようにwindowsに伝えて最大化する という、行ったり来たりの処理が必要になっています。 そもそもSetWindowStyleMode( 4 ) ;でウィンドウサイズや位置がリセットされなければ問題ないのですが これはDXライブラリ側であえて必要な処理なのでしょうか? 不要であれば、その処理をオフにできる方法があると助かります<(_ _)> 宜しくお願いいたします。 --------------------------------------------------------------------------------------------------------------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int WIN_X=1920,WIN_Y=1080; ChangeWindowMode( TRUE ); SetGraphMode(WIN_X,WIN_Y,16); SetWindowSize( WIN_X*0.8,WIN_Y*0.8 ) ;//SetWindowMaximizeButtonBehavior( 1 ); if( DxLib_Init() < 0 ) return -1; SetWindowSizeChangeEnableFlag(TRUE); SetWindowStyleMode(7); int wx=0,wy=0,mxmz=0;RECT recDisplay;int px=0,py=0; while( ProcessMessage() == 0 ) { GetWindowSize(&wx,&wy); if(mxmz==0&&wx>WIN_X*0.9&&wx>WIN_Y*0.9){mxmz=1;GetWindowRect( GetMainWindowHandle(),&recDisplay);SetWindowStyleMode(4);px=recDisplay.left,py=recDisplay.top;SetWindowPos(GetMainWindowHandle(),NULL, px,py, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);} if(mxmz==1){mxmz=2;SendMessage( GetMainWindowHandle(), WM_SYSCOMMAND, SC_MAXIMIZE, 0 );} if(mxmz==2&&CheckHitKey(KEY_INPUT_C)){mxmz=0;SetWindowSizeChangeEnableFlag(TRUE);SetWindowSize( WIN_X*0.8,WIN_Y*0.8 ) ;SetWindowStyleMode( 7 ) ;SetWindowPos(GetMainWindowHandle(),NULL,px,py, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);} ClearDrawScreen();DrawBox(100,100,WIN_X-100,WIN_Y-100,GetColor(255,0,0),1); DrawFormatString( 10,250,GetColor(255,255,255),"px(%d) py(%d)",(int)px,(int)py); ScreenFlip(); } DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: マルチモニタで任意のモニタに枠なしでウィンドウを最大化する方法について ( No.1 )
名前:管理人 日時:2020/09/23 23:53

> そもそもSetWindowStyleMode( 4 ) ;でウィンドウサイズや位置がリセットされなければ問題ないのですが > これはDXライブラリ側であえて必要な処理なのでしょうか? SetWindowStyleMode を実行すると、設定に沿ったウィンドウのサイズに補正され、その際に位置も補正されます 位置の補正は簡単にOFFにすることができますが、サイズの補正はOFFにすることはできません ( OFFにできるようにすると、それはそれで何かバグが発生しそうな気がするのであまり手を加えたくありません… (- -;; ) 位置を SetWindowPos で指定されているように、枠の有り無しも SetWindowStyleMode( 4 ); を実行する代わりに SetWindowLong を直接呼んでしまうというのは如何でしょうか? SetWindowLong( GetMainWindowHandle(), GWL_EXSTYLE , WS_EX_TOOLWINDOW ) ; SetWindowLong( GetMainWindowHandle(), GWL_STYLE , WS_POPUP | WS_SYSMENU | WS_VISIBLE ) ;
メンテ
Re: マルチモニタで任意のモニタに枠なしでウィンドウを最大化する方法について ( No.2 )
名前:たろう 日時:2020/09/24 15:39

ご返信いただきありがとうございます すみません、以下一度載せた物を、その後色々分かって手直ししましたので大幅に修正しました<(_ _)> ----------------------------------------------------------------------------------------------- SetWindowLongPtr(64bitの場合はSetWindowLongPtrにするようで、念のためこちらにしました)を使う方法に変えて 望みの動作が得られました。ありがとうございます<(_ _)> 結果以下のプログラムになり、手元の環境では問題ないのですが、最大化のタイミングで SetWindowSizeChangeEnableFlag(FALSE);はwindows10以外での起動を考えると必要でしょうか? (※これを使うと位置が変更され、元に戻す必要がありますので一瞬メインに表示される格好悪さがあります) その他、もし明らかな間違いがあればご指摘いただけると有難いです。 いつもすみません、よろしくお願いいたします<(_ _)> -------------------------------------------------------------------------------------------------------------- #include "DxLib.h" int WIN_X=1920,WIN_Y=1080; void WInMx(int on) { static int px=0,py=0; if(on==1) { GetWindowPosition( &px,&py ); 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) ); //SetWindowStyleMode(4); //SetWindowPosition(px,py); ShowWindow( GetMainWindowHandle(), SW_MAXIMIZE ); } else if(on==0) { ShowWindow( GetMainWindowHandle(), SW_RESTORE ); SetWindowSize( WIN_X*0.8,WIN_Y*0.8 ); 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) ); //SetWindowStyleMode(7); SetWindowPosition(px,py);//なぜかたまに主モニタに移動するので念のため必要; } } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE );SetAlwaysRunFlag( TRUE ) ; SetGraphMode(WIN_X,WIN_Y,16); SetWindowSize( WIN_X*0.8,WIN_Y*0.8 ) ; if( DxLib_Init() < 0 ) return -1; SetWindowSizeChangeEnableFlag(TRUE); SetWindowStyleMode(7); int wx=0,wy=0,mxmz=0;RECT recDisplay;int px=0,py=0; while( ProcessMessage() == 0 ) { GetWindowSize(&wx,&wy); if(mxmz==0&&wx>WIN_X*0.9&&wx>WIN_Y*0.9) { mxmz=1;WInMx(1); } if(mxmz==1&&CheckHitKey(KEY_INPUT_C)) { mxmz=0;WInMx(0); } ClearDrawScreen();DrawBox(10,10,WIN_X-10,WIN_Y-10,GetColor(255,0,0),1); DrawFormatString( 10,250,GetColor(255,255,255),"px(%d) py(%d)",(int)px,(int)py); ScreenFlip(); } DxLib_End(); return 0; }
メンテ
Re: マルチモニタで任意のモニタに枠なしでウィンドウを最大化する方法について ( No.3 )
名前:管理人 日時:2020/09/24 23:31

> 結果以下のプログラムになり、手元の環境では問題ないのですが、最大化のタイミングで > SetWindowSizeChangeEnableFlag(FALSE);はwindows10以外での起動を考えると必要でしょうか? 手元で簡単に windows10 以外を試せる環境が無いので確認はできていませんが、 すみません、何故 windows10 以外では SetWindowSizeChangeEnableFlag(FALSE); が 必要かも、と思われたのでしょうか?
メンテ
Re: マルチモニタで任意のモニタに枠なしでウィンドウを最大化する方法について ( No.4 )
名前:たろう 日時:2020/09/24 23:58

ご返信ありがとうございます ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4903 ←このスレで SetWindowSizeChangeEnableFlag(TRUE);のままだと枠線が残ってしまうというような一文を見たので その症状が出ないのはそもそも枠線がないwindows10だからなのかなと考えました。 全て読んで内容を理解していたわけではないので、誤解していたかもしれません。 すみません<(_ _)>
メンテ
Re: マルチモニタで任意のモニタに枠なしでウィンドウを最大化する方法について ( No.5 )
名前:管理人 日時:2020/09/26 00:10

> ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4903 ←このスレで > SetWindowSizeChangeEnableFlag(TRUE);のままだと枠線が残ってしまうというような一文を見たので なるほどそういうことでしたか 『SetWindowSizeChangeEnableFlag(TRUE); のままではまずいこと』は SetWindowLong に渡されるパラメータにありますので、 SetWindowLong を自前で呼んでしまう場合は SetWindowSizeChangeEnableFlag(TRUE); のままでも問題ありません
メンテ
Re: マルチモニタで任意のモニタに枠なしでウィンドウを最大化する方法について ( No.6 )
名前:たろう(解決) 日時:2020/09/26 00:47

いつもありがとうございます。 この件はおかげさまで完全に望みの動作が得られました。 いつもお手数をお掛けして申し訳ございません ありがとうございました <(_ _)>
メンテ

Page: 1 |

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

   クッキー保存