トップページ > 記事閲覧
ウインドウの最大化で意図していない挙動をしてしまう
名前:IRI 日時: 2022/11/16 01:10

VS2022Community DxLib Ver 3.23 環境で作業をしています。 下記の記述を行うとウインドウの最大化ボタンを押しても、フルスクリーンにならなくなり、 > // ウインドウ最大化の設定 > DxLib::SetWindowMaximizeButtonBehavior(1/* 従来の最大化処理を乗っ取るために1を設定。WindowBehavior::Tick で制御 */); > DxLib::SetUseASyncChangeWindowModeFunction(true, nullptr, nullptr); DxLib::CheckWindowMaximizeButtonInput() を使用して最大化ボタンを押したかをチェックし、好きなように挙動を実装することが可能になると思うのですが、 特定の操作を行うと、プライマリモニターでフルスクリーンになってしまい困っています。 フルスクリーンにする操作は、 ・ウインドウのタイトルバーをマウスで掴み、移動可能な状態にする ・モニターの上部にドラッグし、フルスクリーンにするガイドが出たらドロップする ・プライマリモニターでフルスクリーンになることを確認する 自分の想定としては、いかなる操作でもフルスクリーンにならず、ウインドウ状態のままウインドウサイズの変更を行いたいと考えています。。 ですので、上記の操作を行っても DxLib::CheckWindowMaximizeButtonInput() が true を返し、自分が実装した挙動を実行できればと思っています。
メンテ

Page: 1 |

Re: ウインドウの最大化で意図していない挙動をしてしまう ( No.1 )
名前:管理人 日時:2022/11/17 00:55

すみません、色々試してみたのですが SetWindowSizeChangeEnableFlag( TRUE ); が実行されていてユーザーが ウィンドウのサイズが変更できる状態の場合、件の操作( ウィンドウのバーをモニター上部に移動して離す )を するとウィンドウが最大化してしまうのは避けられないようです… 申し訳ありませんが、SetWindowSizeChangeEnableFlag( TRUE ); を実行しないようにしてソフトウェア独自の処理で ウィンドウのサイズをユーザーが変更できるようにする等の方法を検討してみてください m(_ _;m
メンテ
Re: ウインドウの最大化で意図していない挙動をしてしまう ( No.2 )
名前:IRI 日時:2022/11/17 23:48

管理人さん ご確認ありがとうございます。 > 申し訳ありませんが、SetWindowSizeChangeEnableFlag( TRUE ); を実行しないようにしてソフトウェア独自の処理で > ウィンドウのサイズをユーザーが変更できるようにする等の方法を検討してみてください m(_ _;m いまエディターを作成していまして、、、その都合上 SetWindowSizeChangeEnableFlag を false にして運用するのが難しいです。 幸い、ウインドウのスタイルを変更して最大化をできない状態にし、ウインドウの移動や最大化などを独自で実装すれば目的の挙動を実装できそうです。 こちらの方法で実装を行ってみたいと思います。 改めてご確認を頂きありがとうございました。
メンテ
Re: ウインドウの最大化で意図していない挙動をしてしまう ( No.3 )
名前:IRI 日時:2022/12/25 16:06

管理人さん >幸い、ウインドウのスタイルを変更して最大化をできない状態にし、ウインドウの移動や最大化などを独自で実装すれば目的の挙動を実装できそうです。 >こちらの方法で実装を行ってみたいと思います。 こちらについて色々と試していたのですが、ウィンドウメッセージを独自実装しなければならず、DxLib側でメッセージ処理を行っている以上、色々と無理がありそうでした。 そこで、ウインドウの最大化周りについていくつが要望があります。 ・ウインドウの最大化ボタンを押してもフルスクリーンにならず、画面サイズに合わせてウインドウを大きくする。(エクスプローラーの最大化と同じ挙動) ・マルチモニター環境で最大化ボタンを押したときは、ウインドウがあるモニターで最大化になる。  (現在は、サブモニターにあるウインドウを最大化すると、プライマリモニターでフルスクリーンになる) こちらの二つの機能を追加していただくことは可能でしょうか?ご検討を頂けると幸いです。
メンテ
Re: ウインドウの最大化で意図していない挙動をしてしまう ( No.4 )
名前:たろう 日時:2022/12/25 16:54

すみません、見当はずれでしたら無視してください。 最大化ボタンでwindowがあるモニタで最大化(※フルスクリーンではなく)する …という事でしょうか? であればこれ↓ではだめでしょうかm(__)m //////////////////////////////////////////////////////////////// #include "DxLib.h" int Wst=0; void MaxWinApi(int on) { if(on)//最大化 { 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//普通ウィンドウ { 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)); } } void MaxBtnChk(){ if(Wst==0){if(CheckWindowMaximizeButtonInput(1)){Wst=1;MaxWinApi(1);}}else if(Wst==1){if(CheckHitKey(KEY_INPUT_ESCAPE)){Wst=0;MaxWinApi(0);}} } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(1) ; SetWindowSizeChangeEnableFlag(1); ChangeWindowMode(1); SetWindowMaximizeButtonBehavior(1); DxLib_Init(); MaxWinApi(0); while( ProcessMessage() == 0 ) { int MI=GetMouseInput();if(Wst==1&&MI&MOUSE_INPUT_LEFT){MaxWinApi(0);Wst=0;} MaxBtnChk(); } DxLib_End() ; return 0 ; }
メンテ
Re: ウインドウの最大化で意図していない挙動をしてしまう ( No.5 )
名前:IRI 日時:2022/12/26 20:36

たろうさん 返信ありがとうございます。 ご提示いただいた方法でも最大化は可能だと思うのですが、 ウインドウのタイトルバーをつかんでディスプレイ上部でドロップすると強制的にフルスクリーンになる問題がありまして、 そちらの問題も併せて、ライブラリ側でまとめて回避する方法を追加してもらえないかという相談になります。 言葉足らずで申し訳ありませんでした。
メンテ
Re: ウインドウの最大化で意図していない挙動をしてしまう ( No.6 )
名前:たろう 日時:2022/12/26 21:12

こんにちは、 ディスプレイ上部でドロップするとフルスクリーンにならず、最大化になると思いますが これはIRIさん御所望の「エクスプローラーの最大化と同じ挙動」と同じだと思います。 私はwin11を使ってますが、環境が違うんでしょうか?
メンテ
Re: ウインドウの最大化で意図していない挙動をしてしまう ( No.7 )
名前:IRI 日時:2022/12/26 21:58

たろうさん 返信ありがとうございます。 たろうさんが記載されたコードを実行すると、ディスプレイ上部でドロップすると最大化になりますが、最大化ボタンを押すとフルスクリーンになってしまいます。 > SetWindowLongPtr(GetMainWindowHandle(), GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE); こちらのコードとライブラリ関数を組み合わせることで目的の挙動を実装することが出来ました。ありがとうございました。 ただ、できるならライブラリでこれらの処理をすべてラッパーしてくれると嬉しいと思っています。 ChangeWindowMode や SetWindowSizeChangeEnableFlag などウインドウを操作する関数がすでにあるので、出来るならウインドウに対する操作関数の呼び出し先をそろえたいなと思っています。
メンテ
Re: ウインドウの最大化で意図していない挙動をしてしまう ( No.8 )
名前:たろう 日時:2022/12/26 22:30

こんにちは、 分かりにくかったようですみません、あれはフルスクリーンにはなっておらず 最大化ボタンで枠を消す動作が入っているだけで「最大化」になっています。 ウィンドウスタイルはお好みで「if(on)//最大化」の部分をいじっていただければよいと思います。 ※サンプルを貼ろうと思ったのですが、ウィンドウスタイルの知識をかなり忘れてしまったのでごめんなさいm(__)m 追記: ちゃんと読んでいませんでした。解決できたうえで要望に変わっていたのですね、 失礼いたしましたm(__)m お任せして引っ込みます
メンテ
Re: ウインドウの最大化で意図していない挙動をしてしまう ( No.9 )
名前:管理人 日時:2022/12/29 04:23

> ・ウインドウの最大化ボタンを押してもフルスクリーンにならず、画面サイズに合わせてウインドウを大きくする。(エクスプローラーの最大化と同じ挙動) > ・マルチモニター環境で最大化ボタンを押したときは、ウインドウがあるモニターで最大化になる。 >  (現在は、サブモニターにあるウインドウを最大化すると、プライマリモニターでフルスクリーンになる) こちらについては DxLib_Init の前に SetWindowStyleMode( 7 ); という記述を追加すると、挙げられた条件に合致した動作になりますので、よろしければお試しください m(_ _)m #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int x, add ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; SetWindowStyleMode( 7 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ x = 0 ; add = 8 ; while( ProcessMessage() == 0 ) { // 移動 x += add ; if( x < 0 || x > 640 ) add = -add ; // 画面のクリア ClearDrawScreen() ; // 四角形の描画 DrawBox( x, 240 - 32, x + 64, 240 + 32, GetColor( 255,255,255 ), TRUE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: ウインドウの最大化で意図していない挙動をしてしまう ( No.10 )
名前:IRI 日時:2023/01/06 23:56

管理人さん ありがとうございます。使わせていただきます。
メンテ

Page: 1 |

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

   クッキー保存