DxLib_Init前にSetWindowSizeを呼んでいると、Init後のSetGraphMode+SetWindowSizeでウィンドウが拡大されない
いつもDXライブラリを利用させていただいています。
DxLib_Init の前に SetWindowSize を呼んでいると、Init 後に SetGraphMode で論理画面を
拡大してから SetWindowSize を呼んでも、ウィンドウの大きさが変わらない現象を見つけましたので
報告いたします。描画先(GetDrawScreenSize)は新しい大きさになるため、描画先とウィンドウの
クライアント領域が食い違った状態になります。
ボーダレスウィンドウ(論理画面をデスクトップ解像度にして枠なしウィンドウを画面いっぱいに
広げる方式)へゲームの実行中に切り替えられるようにしようとして遭遇しました。
■ 確認環境
- DXライブラリ Ver 3.24f (VC++用)
- Windows 11 Home (Build 26200) / Direct3D 11
- デスクトップ解像度 1920x1080、拡大率100%
- Visual Studio 2026 / x64 / /MT
■ 再現コード
```cpp
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
ChangeWindowMode(TRUE);
SetGraphMode(1280, 960, 32);
SetWindowSize(1280, 960); // …(1) この行があると症状が出ます
if (DxLib_Init() < 0) return -1;
SetDrawScreen(DX_SCREEN_BACK);
// デスクトップ解像度へ論理画面とウィンドウを拡大する
int desk_w = 0, desk_h = 0, bit = 0;
GetDefaultState(&desk_w, &desk_h, &bit);
SetGraphMode(desk_w, desk_h, 32);
SetWindowSize(desk_w, desk_h);
while (!ProcessMessage() && !ClearDrawScreen()) {
int draw_w = 0, draw_h = 0;
GetDrawScreenSize(&draw_w, &draw_h);
int win_w = 0, win_h = 0;
GetWindowSize(&win_w, &win_h);
DrawFormatString(10, 10, GetColor(255, 255, 255), L"GetDrawScreenSize : %d x %d", draw_w, draw_h);
DrawFormatString(10, 40, GetColor(255, 255, 255), L"GetWindowSize : %d x %d", win_w, win_h);
ScreenFlip();
if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) break;
}
DxLib_End();
return 0;
}
```
■ 結果 (1920x1080のモニタの場合)
- 上のコードのまま実行:
GetDrawScreenSize は 1920x1080 になりますが、GetWindowSize と実際のウィンドウの
クライアント領域は 1280x960 のままです
- (1) の行を削除して実行:
ウィンドウも 1920x1080 になり、期待どおりの動作になります
(1) は Init 前の論理画面(1280x960)と同じサイズの指定なので、ウィンドウの大きさとしては
何も変えていないはずですが、この行の有無で Init 後の挙動が変わります。
■ 補足 (いずれも実測で確認しています)
- Init 後の拡大を SetWindowSize の代わりに SetWindowSizeExtendRate(1.0) にしても同様です
- SetChangeScreenModeGraphicsSystemResetFlag の設定有無には関係なく再現します
- ウィンドウの表示/非表示(SetWindowVisibleFlag)や SetWindowStyleMode の有無にも関係ありません
- SetWindowSize について、DxLib_Init 前の使用が想定外の使い方でしたら、その旨ご指摘いただければ幸いです
お手すきの際にご確認いただければ幸いです。