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
管理人さん
ありがとうございます。使わせていただきます。
|