ゲーム エンジンとしてすごく基本的な機能の実装をずいぶんと後回しにしてきました。フルスクリーン表示用のディスプレイ解像度の変更機能を検討しています。
アリスの街 147(リメイク版)では Win32API の ChangeDisplaySettings API を使用していました。この他の方法として DirectX の IDirectDraw::SetDisplayMode メソッドを使用する方法があります。んー。両方実装するのは面倒なので、どちらかの実装でまとめてしまおうと思うのですが、どちらが良いんでしょう。
- Win32API による解像度変更
- 事前処理なしで ChangeDisplaySettings API を呼び出すだけで解像度変更可能
- 解像度変更後のリストアは ChangeDisplaySettings(nullptr, 0) 呼び出しで可能
- DirectX による解像度変更
- 事前処理として DirectDrawCreate API による DirectDraw オブジェクトの初期化と、IDirectDraw::SetCooperativeLevel メソッドによる協調モード設定でアプリケーションのトップ レベル ウィンドウの指定が必要
- 解像度変更後のリストアは IDirectDraw::RestoreDisplayMode メソッドで可能
- 事後処理として、アプリケーション終了前に IDirectDraw::Release メソッド呼び出しが必要(スマート ポインタで隠蔽可)
んー。プログラマにとっての扱いやすさは断然 Win32API ですね。パラレル・フォースでは描画に DirectX を使用していないので、Win32API の方で実装しようかな、と今のところ考えています。
各方法について現象面で違いがあれば勘案したいと思うのですが、Windows 7 で動作確認する限り目立った動作の相違はないような…。あ。DirectX の方はウィンドウのフォーカスが外れると、変更した解像度が元に戻るのに対して、Win32API の方はフォーカスが外れても解像度が元に戻らないですね。
DirectX では変更した解像度について、ウィンドウのフォーカスが外れるとリストアされて、フォーカスが当たると再設定される、と。ふむ。この動作のために協調レベルでウィンドウを指定する必要があるんですね。逆の視点で、この動作をマニュアル実装するなら DirectX による解像度変更は不要ということになるのかな。んー。ちょっと考えよう。