GameProgrammar's Night

ゲームプログラム系の覚え書き

ウインドウスタイルの動的変更

 ゲーム動作中に、ウインドウモードとフルスクリーンモードの切り替えを実装しておくとユーザーフレンドリーです。
 フルスクリーンというのは、ようは画面全体にウインドウを広げる処理です。ただし、この時、キャプションやウインドウの枠などを消す必要があります。
 キャプションやウインドウの枠などは、Windows上ではウインドウスタイル(以下スタイルとします)と呼ばれています。スタイルをゲーム実行中に変更するには、SetWindowLong関数を使います。
 スタイルをすべて消すには、以下のように関数を呼びます。

SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);

 しかし、SetWindowLong関数を呼んだだけでは上手く行きません。
 以下のような感じで、元々スタイルがあった場所になぞのスペースが生まれていまいます。

f:id:katze_7514:20131005223749p:plain

 MSDNによると、「SetWindowLong関数でスタイルを変更した後はSetWindowPos関数をSWP_FRAMECHANGEフラグを指定して呼び出す必要がある」とありますが、どうもSetWindowPos関数自体は呼ぶ必要は無いようです。
 本当に呼ぶべきは、ShowWindow関数です。ShowWindow関数でウインドウ全体を再描画させます。

SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);
ShowWindow(hWnd, SW_SHOW);

と、呼ぶことで、無事

f:id:katze_7514:20131005223927p:plain

スタイル無しで表示することができます。
 フルスクリーンからウインドウモードへ変更する時は、スタイルを復元しないといけませんが、復元も同じです。

 ちなみに、SetWindowPos関数でもShowWindow関数と同じことができますので、MSDN通りにするのであれば、

SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);
SetWindowPos(hWnd,NULL,0,0,0,0, SWP_NOPOS | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_SHOWWINDOW);

のように、SWP_SHOWWINDOWフラグを指定して呼びます。