ウインドウスタイルの動的変更
ゲーム動作中に、ウインドウモードとフルスクリーンモードの切り替えを実装しておくとユーザーフレンドリーです。
フルスクリーンというのは、ようは画面全体にウインドウを広げる処理です。ただし、この時、キャプションやウインドウの枠などを消す必要があります。
キャプションやウインドウの枠などは、Windows上ではウインドウスタイル(以下スタイルとします)と呼ばれています。スタイルをゲーム実行中に変更するには、SetWindowLong関数を使います。
スタイルをすべて消すには、以下のように関数を呼びます。
SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);
しかし、SetWindowLong関数を呼んだだけでは上手く行きません。
以下のような感じで、元々スタイルがあった場所になぞのスペースが生まれていまいます。
MSDNによると、「SetWindowLong関数でスタイルを変更した後はSetWindowPos関数をSWP_FRAMECHANGEフラグを指定して呼び出す必要がある」とありますが、どうもSetWindowPos関数自体は呼ぶ必要は無いようです。
本当に呼ぶべきは、ShowWindow関数です。ShowWindow関数でウインドウ全体を再描画させます。
SetWindowLong(hWnd, GWL_STYLE, WS_POPUP); ShowWindow(hWnd, SW_SHOW);
と、呼ぶことで、無事
スタイル無しで表示することができます。
フルスクリーンからウインドウモードへ変更する時は、スタイルを復元しないといけませんが、復元も同じです。
ちなみに、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フラグを指定して呼びます。