トップページ > 記事閲覧
SetWindowStyleModeとGetWindowEdgeWidth
名前:あいおい? 日時: 2020/05/09 18:58

Windows 10 Ver.2004 で、SetWindowStyleMode(2)やSetWindowStyleMode(4)を使用すると、 「ゲーム画面以外何も表示されなくなる」という挙動ではなく 「タイトルバーがない、縁のついたウィンドウ」になります。 これが正しい挙動なのか、それともWindowsのバージョンアップによって変わってしまった挙動なのか知りたいです。 cdn.discordapp.com/attachments/542364337151672337/708615897736151091/unknown.png ↑参考画像です 〜〜〜〜〜〜 GetWindowEdgeWidth()について、こちらはDxLib_Init()前に使える物なのでしょうか? 仮想フルスクリーンを実現しようとして、自前でWindowed()とFullScreen()というメソッドを作成し、 設定ファイルからフルスクリーンにするかどうかを読み取り、Windowed()かFullScreen()どちらかを呼び出すようにしてる……のですが、 DxLib_Init()前にGetWindowEdgeWidth()を呼び出しているからか、ウィンドウの縁の幅を取得できず(?)に、仮想フルスクリーンが実現できません。 (SetWindowStyleMode(2)によって完全な縁なしウィンドウが作れれば、このようなことせずに実現できるんですが、こちらも上手くいかずにつまずいてます。) また、DxLib_Init後にこのメソッドを呼び出しても、何故かWindows 2000のようなタイトルバーが表示されてやはり正常な仮想フルスクリーンになりません……。 起動時に限り、画面のサイズと同じサイズのウィンドウを出せば、どんなウィンドウのスタイルでもDxLibが計算して(?)自動的に仮想フルスクリーン、のようなことができたんですが、 タスクバーを移動させると、その計算が狂うようなので、自前で実装するに至りました。 〜〜〜〜〜〜 仮想フルスクリーンを操作するときのクラスがこちらになります。 /// <summary> /// ウィンドウ管理。 /// </summary> internal static class Window { /// <summary> /// フルスクリーンにする。 /// </summary> internal static void FullScreen() { // ボーダーレス DX.SetWindowStyleMode(2); var size = GetScreenSize(); // ウィンドウサイズ DX.SetWindowSize(size.width, size.height); var edge = GetWindowEdge(); // 位置調整 DX.SetWindowPosition(-edge.left, -edge.top); IsFullScreen = true; } /// <summary> /// ウィンドウモードにする。 /// </summary> internal static void Windowed() { // 最大化ボタンあり DX.SetWindowStyleMode(7); var extendRate = (設定から読み取って計算してます) var windowWidth = (設定から読み取って計算してます) // ウィンドウサイズ DX.SetWindowSize((int)windowWidth, (設定から読み取って計算してます)); var size = GetScreenSize(); // 位置調整 DX.SetWindowPosition((int)((size.width - windowWidth) / 2), (int)((size.height - (設定から読み取って計算してます)) / 2)); IsFullScreen = false; } /// <summary> /// フルスクリーン状態を切り替える。 /// </summary> internal static void Switch() { if (IsFullScreen) { Windowed(); } else { FullScreen(); } } /// <summary> /// スクリーンサイズを得る。 /// </summary> /// <returns>横、縦</returns> internal static (int width, int height) GetScreenSize() { DX.GetDefaultState(out var x, out var y, out _, out _, out _, out _, out _, out _, out _, out _); return (x, y); } /// <summary> /// ウィンドウの縁の大きさを得る。 /// </summary> /// <returns>縁の大きさ。</returns> internal static (int left, int right, int top, int bottom) GetWindowEdge() { DX.GetWindowEdgeWidth(out var left, out var right, out var top, out var bottom); return (left, right, top, bottom); } internal static bool IsFullScreen { get; private set; } }
メンテ

Page: 1 |

Re: SetWindowStyleModeとGetWindowEdgeWidth ( No.1 )
名前:管理人 日時:2020/05/10 23:00

> Windows 10 Ver.2004 で、SetWindowStyleMode(2)やSetWindowStyleMode(4)を使用すると、 > 「ゲーム画面以外何も表示されなくなる」という挙動ではなく > 「タイトルバーがない、縁のついたウィンドウ」になります。 私も Windows 10 Ver.2004 にアップデートした後以下のようなプログラムを実行してみましたが、 正常に「縁の無いウィンドウ」が表示されました #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; SetWindowStyleMode( 2 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } あいおい?さんの環境では上記のようなシンプルなプログラムでも縁のついたウィンドウに なってしまうのでしょうか? > GetWindowEdgeWidth()について、こちらはDxLib_Init()前に使える物なのでしょうか? いえ、使えません > 起動時に限り、画面のサイズと同じサイズのウィンドウを出せば、どんなウィンドウのスタイルでもDxLibが計算して(?)自動的に仮想フルスクリーン、のようなことができたんですが、 > タスクバーを移動させると、その計算が狂うようなので、自前で実装するに至りました。 現在のDXライブラリのフルスクリーンはデフォルトで仮想フルスクリーンとなっていますので 自前で仮想フルスクリーンを実装していただく必要はありません ( DxLib_Init の呼び出し前に SetFullScreenResolutionMode( DX_FSRESOLUTIONMODE_NATIVE ) ; という 記述を増やすと通常のフルスクリーンモードで起動することができます )
メンテ
Re: SetWindowStyleModeとGetWindowEdgeWidth ( No.2 )
名前:motoYo 日時:2020/05/10 23:45

横からになりますが、 SetWindowSizeChangeEnableFlagでウィンドウサイズを変更できる状態にすると、 SetWindowStyleModeを2or4にしても、細い枠が発生するようです。 また、SetWindowStyleModeを4にした状態でウィンドウサイズを変更できる状態にした時、 "何故かクラシックスタイルのタイトルバーのようなものが出現する時がある"という現象を確認しました。
メンテ
Re: SetWindowStyleModeとGetWindowEdgeWidth ( No.3 )
名前:あいおい? 日時:2020/05/11 00:09

> あいおい?さんの環境では上記のようなシンプルなプログラムでも縁のついたウィンドウに > なってしまうのでしょうか? こちらのソースコードを実行してみたところ、縁のつかないウィンドウが生成されました。 > 現在のDXライブラリのフルスクリーンはデフォルトで仮想フルスクリーンとなっていますので > 自前で仮想フルスクリーンを実装していただく必要はありません フルスクリーンって、ChangeWindowMode(FALSE)のことだと思いますけど、こちらの環境でこれを使用した場合、明らかに通常のフルスクリーンと同じ挙動をします…… (毎回画面の解像度が変わるような挙動になります) 〜〜〜〜〜〜〜〜 > SetWindowSizeChangeEnableFlagでウィンドウサイズを変更できる状態にすると、 > SetWindowStyleModeを2or4にしても、細い枠が発生するようです。 > また、SetWindowStyleModeを4にした状態でウィンドウサイズを変更できる状態にした時、 > "何故かクラシックスタイルのタイトルバーのようなものが出現する時がある"という現象を確認しました。 ナルホド、確かにプログラム中でSetWindowSizeChangeEnableFlagを使用しています。情報感謝ですm(__)m ボーダーレスにする前にSetWindowSizeChangeEnableFlag(FALSE)を実行してみたところ、期待していた挙動になりました。 DXライブラリ側で仮想フルスクリーンの機能が用意されているということであれば、そちらを使うべきなのでしょうが、とりあえずはこの状態のままで使用させてもらいますm(__)m
メンテ
Re: SetWindowStyleModeとGetWindowEdgeWidth ( No.4 )
名前:あいおい? 日時:2020/05/11 19:40

> DXライブラリ側で仮想フルスクリーンの機能が用意されているということであれば、そちらを使うべきなのでしょうが、とりあえずはこの状態のままで使用させてもらいますm(__)m 自己レスになりますが、どうやらこの方法ではタスクバーが下以外の位置にあった場合、 0, 0にウィンドウを置いても正しい位置に配置されずに仮想フルスクリーンが成り立たないようです……。 ChangeWindowModeでは、画面が暗転して、リフレッシュレートが変化して、正しく仮想フルスクリーンにならないので、 正しい仮想フルスクリーンのやり方をご教授いただければとm(__)m
メンテ
Re: SetWindowStyleModeとGetWindowEdgeWidth ( No.5 )
名前:にこよう 日時:2020/05/11 22:02

横から失礼します >現在のDXライブラリのフルスクリーンはデフォルトで仮想フルスクリーンとなっていますので >自前で仮想フルスクリーンを実装していただく必要はありません >( DxLib_Init の呼び出し前に SetFullScreenResolutionMode( DX_FSRESOLUTIONMODE_NATIVE ) ; という >記述を増やすと通常のフルスクリーンモードで起動することができます ) 初めて知りました いつ頃実装されたのか教えていただくことは可能でしょうか? また、試してみたのですが、フルスクリーンに切り替わる際に古いWindowsのウィンドウに様な青いバーが一瞬描画されて 一瞬固まってしまいます 仮想フルスクリーン特有のスマートな切り替わりではないのが気になるのですが、こちらは意図した挙動でしょうか? また、仮想フルスクリーン状態でWindowsキーを押下するとスクリーンがずれる or スクリーンがタスクバーに収納されてしまいます 本来ならばゲーム画面上に下からWindowsのあれが出現するはずだと思うのですが,,,, 以前いただいた仮想フルスクリーンの関数をずっと使っていたのですが、 その関数では上に書いたようなことは起こりません 他の方と違い、このあたりの知識がないので細かいことは分かりませんが、一応報告させていただきますm(__)m
メンテ
Re: SetWindowStyleModeとGetWindowEdgeWidth ( No.6 )
名前:green 日時:2020/05/11 22:37

motoYoさん >SetWindowSizeChangeEnableFlagでウィンドウサイズを変更できる状態にすると、 >SetWindowStyleModeを2or4にしても、細い枠が発生するようです。 なるほどです、確かに細くなったタイトルバーのような感じのものが表示されますね #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( true ) ; SetGraphMode(640,480, 32 ) ; SetWindowStyleMode( 2 ) ; SetWindowSizeChangeEnableFlag(true,true); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; while ( ProcessMessage() == 0 ) { ClearDrawScreen(); ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: SetWindowStyleModeとGetWindowEdgeWidth ( No.7 )
名前:管理人 日時:2020/05/12 00:28

> motoYoさん > SetWindowSizeChangeEnableFlagでウィンドウサイズを変更できる状態にすると、 > SetWindowStyleModeを2or4にしても、細い枠が発生するようです。 私も手元で確認しました どうやらウィンドウのサイズを変更できるようにした場合は全く縁の無い状態にはできないようです ( ウィンドウ端を掴んでウィンドウサイズを変更できるようにするための必須のフラグを一つ追加しただけで必ず表示されてしまうので… ) > また、SetWindowStyleModeを4にした状態でウィンドウサイズを変更できる状態にした時、 > "何故かクラシックスタイルのタイトルバーのようなものが出現する時がある"という現象を確認しました。 こちらは確認できませんでした 何回か実行していると一定確率で発生する、というような現象でしょうか? > あいおい?さん > フルスクリーンって、ChangeWindowMode(FALSE)のことだと思いますけど、こちらの環境でこれを使用した場合、明らかに通常のフルスクリーンと同じ挙動をします…… > (毎回画面の解像度が変わるような挙動になります) > DXライブラリ側で仮想フルスクリーンの機能が用意されているということであれば、そちらを使うべきなのでしょうが、とりあえずはこの状態のままで使用させてもらいますm(__)m 大変失礼しました 勘違いしていて、現在のデフォルトの SetFullScreenResolutionMode( DX_FSRESOLUTIONMODE_DESKTOP ) ; は 『モニタの解像度はデスクトップの解像度のまま変更しないけど、フルスクリーンモードにはする』でした m(_ _;m ( モニタの解像度が指定した通りにならない、という部分だけの『仮想』でした ) > 自己レスになりますが、どうやらこの方法ではタスクバーが下以外の位置にあった場合、 > 0, 0にウィンドウを置いても正しい位置に配置されずに仮想フルスクリーンが成り立たないようです……。 > ChangeWindowModeでは、画面が暗転して、リフレッシュレートが変化して、正しく仮想フルスクリーンにならないので、 > 正しい仮想フルスクリーンのやり方をご教授いただければとm(__)m 過去ログに仮想フルスクリーンを実現していたスレッドがありました <描画回数を減らすモードと仮想フルスクリーン> https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4179 ↑こちらの No.3 にあるサンプルコードが『スペースキーを押すと仮想フルスクリーンモードとウィンドウモードの切り替えをする』というものになっています よろしければご覧ください m(_ _)m > にこようさん > 初めて知りました > いつ頃実装されたのか教えていただくことは可能でしょうか? すみません、実装されていませんでした m(_ _;m > 以前いただいた仮想フルスクリーンの関数をずっと使っていたのですが、 <描画回数を減らすモードと仮想フルスクリーン> https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4179 ↑それはこちらのスレッドでのお話でしょうか? ( こちらのスレッドの『にこよん』さんはにこようさんですよね? ) > greenさん > なるほどです、確かに細くなったタイトルバーのような感じのものが表示されますね ご確認ありがとうございます ウィンドウサイズを変更できるようにした場合は表示されてしまうようです…
メンテ
Re: SetWindowStyleModeとGetWindowEdgeWidth ( No.8 )
名前:あいおい?(解決) 日時:2020/05/12 01:24

>↑こちらの No.3 にあるサンプルコードが『スペースキーを押すと仮想フルスクリーンモードとウィンドウモードの切り替えをする』というものになっています > よろしければご覧ください m(_ _)m 自分の理想通りの仮想フルスクリーンが実現できました。 SetWindowSizeChangeEnableFlagを使った場合でも、フルスクリーンにする前にFALSEにすれば縁が出ないということが分かったので、実装前の機能性を失わずにできました。 ありがとうございますm(__)m
メンテ

Page: 1 |

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

   クッキー保存