最終更新 2003 09/19
サンプルのダウンロード → API_ChangeDisplayMode.lzh(35k)
全ソースコード
EnumDisplaySettings 関数
ChangeDisplayMode 関数
対応しているバージョン
95, 98, Me, NT3.51以降, 2000, XP
使用するヘッダとライブラリ
winuser.h
user32.lib
|
モニタの解像度を変更するには ChangeDisplaySettings() 関数を使います。
変更できる解像度は使用しているモニタやグラフィックカードで変わります。
指定された解像度に変更できるかどうかを EnumDisplaySettings() 関数で
調べて、変更できるようなら ChangeDisplaySettings() 関数を呼び出します。
環境によっては解像度を変更する時に再起動しなければならないことも
あるので、再起動が必要なときは変更しないようにしてあります。
ChangeDisplaySettings() 関数はプログラムの終了時に変更した解像度を
元に戻してくれます。ですので、最初から最後までフルスクリーンで
動かすゲームなら、終了時にモニタの解像度を元に戻さなくても問題は
ありません。もし、プログラム中で強制的に元に戻したい場合は少し
プログラムを工夫する必要があります。
ChangeDisplayMode() 関数を呼び出す前に、現在のモニタの解像度を
グローバル変数に保存しておく必要があります。
現在のモニタの解像度は GetDeviceCaps() 関数で取得できます。
//モニタの解像度を取得
HDC hDC = GetDC( GetActiveWindow() );
DWORD dwDispWidth = GetDeviceCaps( hDC, HORZRES );
DWORD dwDispHeight = GetDeviceCaps( hDC, VERTRES );
DWORD dwDispBpp = GetDeviceCaps( hDC, BITSPIXEL );
ReleaseDC( GetActiveWindow(), hDC );
//解像度を変更
ChangeDisplayMode( 640, 480, 8 );
/*
〜いろんな処理〜
*/
//解像度を元に戻す
ChangeDisplayMode( dwDispWidth, dwDispHeight, dwDispBpp );
|
おおまかに書くと、こんな感じになります。
GetActiveWindow() 関数はアクティブになっているウィンドウの
HWND を取得してくれる関数です。この関数は便利ですが、使用する時は
注意が必要です。あくまで「アクティブになっているウィンドウ」の
HWND を取得するので、もしウィンドウが最小化してる場合にこの関数を
呼び出すと、最小化してるときはそのウィンドウはアクティブでは
なくなるために、別のウィンドウの HWND を取ってきてしまいます。
もしこの関数を、ウィンドウにビットマップを貼り付ける処理などで
呼び出すと、ウィンドウのフォーカスが移ったときに画面がおかしく
なったりします。
上のサンプルの場合、モニタの解像度はどのウィンドウがアクティブに
なっていようが取得できる値は変わらないので GetActiveWindow() で
HWND を取得しています。
|