トップページ > 記事閲覧
SetWindowStyleModeの挙動について
名前:Rounz 日時: 2021/11/18 22:52

初めまして、Rounzと申します。 リファレンスに載っていない関数の質問で恐縮なのですが、 よくわからない挙動をして困ったので質問させていただきます。 'DxLib_Init'の前に'SetWindowStyleMode(2)'を呼び出し、 途中でSetWindowStyleMode(0)などで変えようとすると反映されません。 ですが、そのあとに'SetWindowStyleMode(2)'を呼び出し、 'SetWindowStyleMode(0)'を呼び出すと反映されますのですがクライアント領域のサイズが維持されません。 (SetWindowSizeを呼び出しても変わりませんでした) 環境: DXライブラリ Ver3.22c Windows10 ( Build 19043 ) Visual Studio 2019 以下、検証用のソースコードです #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int Count = 0; ChangeWindowMode(TRUE); SetWindowStyleMode(2); if (DxLib_Init() == -1) { return -1; } SetWindowSize(640, 480); SetDrawScreen(DX_SCREEN_BACK); while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { switch (Count) { case 300: SetWindowStyleMode(0); printfDx("Test Mode=0\n"); break; case 600: SetWindowStyleMode(2); printfDx("Test Mode=2\n"); //SetWindowSize(640, 480); break; case 900: SetWindowStyleMode(0); printfDx("Test Mode=0\n"); //SetWindowSize(640, 480); break; } //ランダムに点を打つ for (int i = 0; i < 100; i++) { DrawPixel(GetRand(640), GetRand(480), GetColor(255, 255, 255)); } DrawFormatString(200, 0, GetColor(255, 255, 255), "%d", Count); Count++; ScreenFlip(); } DxLib_End(); return 0; } よろしくお願いします。
メンテ

Page: 1 |

Re: SetWindowStyleModeの挙動について ( No.1 )
名前:管理人 日時:2021/11/20 16:10

すみません、SetWindowStyleMode は基本的に DxLib_Init の実行前に使用するもので、 DxLib_Init の実行後に SetWindowStyleMode が使用されることは想定していません なので SetWindowStyleMode が DxLib_Init の実行後に正常に動作しないのは 仕様とさせてください m(_ _;m ただ、手元で試した限りでは以下のように一度別のサイズに変更してから 640x480 のサイズに 変更することでクライアント領域のサイズが維持されました case 900: SetWindowStyleMode(0); printfDx("Test Mode=0\n"); SetWindowSize(800, 600); SetWindowSize(640, 480); break; よろしければお試しください m(_ _)m
メンテ
Re: SetWindowStyleModeの挙動について ( No.2 )
名前:Rounz 日時:2021/11/23 21:02

管理人様 お忙しいところ、ありがとうございます。 想定していない使い方だったのですね、了解しました。 色々と調べたのですがWinAPIのSetWindowPosにSWP_FRAMECHANGEDフラグを渡して 呼び出したら反映させることができました。 クライアント領域が変わってしまうのはご提示いただいた方法を使おうかと思います。 #--------------2021/11/23追記 #確認不足でSetWindowPosを呼び出したら変わっていませんでした。 # 一つ質問があります。 SetWindowStyleModeを使おうと思ったのはボーダーレスウィンドウにしたく使った次第なのですが、 そのような関数のようなものはありますでしょうか。 よろしくお願いいたします。
メンテ
Re: SetWindowStyleModeの挙動について ( No.3 )
名前:管理人 日時:2021/11/23 07:11

> 色々と調べたのですがWinAPIのSetWindowPosにSWP_FRAMECHANGEDフラグを渡して > 呼び出したら反映させることができました。 ご情報ありがとうございます SetWindowStyleMode が呼ばれた際にも SetWindowPos に SWP_FRAMECHANGED フラグを渡して 呼び出す処理を追加してみました 少し試した限りでは正常に動作しているように見えますので、よろしければその処理を 追加したバージョンをお試しください 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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > SetWindowStyleModeを使おうと思ったのはボーダーレスウィンドウにしたく使った次第なのですが、 > そのような関数のようなものはありますでしょうか。 SetWindowStyleMode( 2 ); を DxLib_Init の前で呼ぶことでボーダーレスウィンドウにすることができますが、 実行の途中で通常のウィンドウとボーダーレスウィンドウを切り替える機能については今まではありませんでした 少し調べた所、SetWindowPos を使用する方法の他に、WM_NCCALCSIZE を使用してボーダーレス ウィンドウを実現する方法もありましたので、今回その方法でボーダーレスウィンドウの処理を行うか どうかを設定する関数 SetUseBorderlessWindowFlag を追加してみました // メインウインドウをボーダーレスウィンドウにするかどうかを設定する // ( Flag TRUE:ボーダーレスウィンドウ FALSE:通常ウィンドウ ) int SetUseBorderlessWindowFlag( int Flag ) ; DxLib_Init の実行前でも実行後でも使用することができますので、よろしければお試しください m(_ _)m
メンテ
Re: SetWindowStyleModeの挙動について ( No.4 )
名前:Rounz(解決) 日時:2021/11/23 21:00

管理人様 お忙しいところ、わざわざ関数まで追加してくださり、ありがとうございます。 SetWindowStyleModeでも正常に動作することを確認できました。 また、SetUseBorderlessWindowFlag関数を使う方法も正常に動作することができました。 正式に公開されたらこちらのほうを使いたいと思います。 > 少し調べた所、SetWindowPos を使用する方法の他に、WM_NCCALCSIZE を使用してボーダーレス > ウィンドウを実現する方法もありましたので、今回その方法でボーダーレスウィンドウの処理を行うか > どうかを設定する関数 SetUseBorderlessWindowFlag を追加してみました WindowStyleを変更する以外にWM_NCCALCSIZEを使用する方法があるのですね、初めて知りました。 目的のものが実現することができました。 管理人様、本当にありがとうございました。 ---------------追記 No.2の投稿で"クライアント領域が変わってしまう"と書きましたが、確認したところSetWindowPosを呼び出したら変わっていませんでした。 申し訳ありません。
メンテ

Page: 1 |

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

   クッキー保存