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; }
}