ディスプレイモードの変更(OS X v10.5)
典型的なディスプレイ構成タスクは、単一のディスプレイのモードを変更することです。コンビニエンス関数 CGDisplaySwitchToMode (旧式) を使用すると、これを 1 ステップで行えます。この節では、与えられたディスプレイに最適なモードを見つけて切り替える 2 つの方法を示します。
メインディスプレイのモードを設定
単純なケースでは、メインディスプレイのモードを、必要なビット深度と解像度に最も近いモードに設定する必要があります。描画が終了すると、以前のディスプレイモードに戻ります。利用可能なモードからベストモードを見つける方法は、これを行う方法を示しています。各番号付きコード行の詳細な説明は、リストの後に示します。
リスト 1 メインディスプレイのモードを設定
size_t desiredBitDepth = 16;
size_t desiredWidth = 1024;
size_t desiredHeight = 768;
boolean_t exactMatch;
CFDictionaryRef mode = CGDisplayBestModeForParameters( // 1
kCGDirectMainDisplay,
desiredBitDepth, desiredWidth,
desiredHeight, &exactMatch);
if (mode != NULL) {
/* if it is important to have an exact match, check exactMatch here */
MyDrawToDisplayWithMode (kCGDirectMainDisplay, mode);
}
void MyDrawToDisplayWithMode (CGDirectDisplayID display, CFDictionaryRef mode)
{
CFDictionaryRef originalMode = CGDisplayCurrentMode (display); // 2
CGDisplayHideCursor (display);
CGDisplaySwitchToMode (display, mode); // 3
CGDisplayCapture (display); // 4
/* full screen drawing/game loop here */
CGDisplaySwitchToMode (display, originalMode); // 5
CGDisplayRelease (display); // 6
CGDisplayShowCursor (display);
}
コードの動作は以下のとおりです。
- 指定したディスプレイで使用可能なモードの中で最適なものを見つけます。
- 現在のディスプレイモードを保存します。
- 新しいディスプレイモードを使用するようにディスプレイを再構成します。
- フルスクリーン描画に備えるためにディスプレイをキャプチャします。
- 以前のディスプレイモードに戻ります。
- キャプチャされたディスプレイを解放します。
使用可能なモードからベストなモードを見つける
より複雑なケースでは、どのディスプレイを使用しているか、または"ベストなモード" が何を意味するのかを自分で判断したいという事には、より多くの制御が必要です。リスト 1 は、アクティブなディスプレイの配列を取得し、そのリストを反復して各ディスプレイがサポートするモードを調べ、あなたのアプリケーションに最適なディスプレイとモードの組み合わせを選択する方法を示しています。
リスト 2 利用可能なモードを調べる
#define MAX_DISPLAYS 32
CGDirectDisplayID displays[MAX_DISPLAYS];
CGDisplayCount numDisplays;
CGDisplayCount i;
CGGetActiveDisplayList (MAX_DISPLAYS, displays, &numDisplays); // 1
for (i = 0; i < numDisplays; i++) // 2
{
CFDictionaryRef mode;
CFIndex index, count;
CFArrayRef modeList;
modeList = CGDisplayAvailableModes (displays[i]); // 3
count = CFArrayGetCount (modeList);
for (index = 0; index < count; index++) // 4
{
mode = CFArrayGetValueAtIndex (modeList, index);
if (MyBestMode (mode)) {
MyDrawToDisplayWithMode (displays[i], mode); // 5
}
}
}
bool MyBestMode (CFDictionaryRef mode) // 6
{
CFNumberRef value;
long bitsPerPixel = 0, width = 0;
value = CFDictionaryGetValue (mode, kCGDisplayBitsPerPixel);
CFNumberGetValue (value, kCFNumberLongType, &bitsPerPixel);
value = CFDictionaryGetValue (mode, kCGDisplayWidth);
CFNumberGetValue (value, kCFNumberLongType, &width);
if (bitsPerPixel == 32 && width == 1024)
return true;
else
return false;
}
コードの動作は以下のとおりです。
- 描画に利用可能な、アクティブなディスプレイの配列を取得します。
- アクティブなディスプレイの配列を反復処理します。配列はゼロベースであることに注意してください。
- このディスプレイで利用可能なモードの配列を取得します。
- モードが目的のプロパティを持っているかどうかを判断するカスタム関数を呼び出して、ディスプレイ用の利用可能なモードを反復処理します。
- 前の例で使用した描画関数を呼び出します。
- モード辞書内の 2 つのプロパティをチェックし、モードに目的のプロパティがある場合は true を返します。