ディスプレイモードの変更(OS X v10.6以降)
典型的なディスプレイ構成タスクは、単一のディスプレイのモードを変更することです。コンビニエンス関数 CGDisplaySetDisplayMode を使用すると、これを 1 ステップで行うことができます。この節では、特定のディスプレイに最適なモードを見つけて切り替える 1 つの方法を示します。
使用可能なモードからベストのモードを見つける
リスト 1 は、アクティブなディスプレイの配列を取得し、そのリストを反復して、各ディスプレイがサポートするモードを調べてリストし、あなたのアプリケーションに最適なディスプレイとモードの組み合わせを選択する方法を示しています。
リスト 1 利用できるモードを調べる
#define MAX_DISPLAYS 32
CGDirectDisplayID displays[MAX_DISPLAYS];
uint32_t numDisplays;
uint32_t i;
CGGetActiveDisplayList (MAX_DISPLAYS, displays, &numDisplays); // 1
for (i = 0; i < numDisplays; i++) // 2
{
CGDisplayModeRef mode;
CFIndex index, count;
CFArrayRef modeList;
modeList = CGDisplayCopyAllDisplayModes (displays[i], NULL); // 3
count = CFArrayGetCount (modeList);
for (index = 0; index < count; index++) // 4
{
mode = (CGDisplayModeRef)CFArrayGetValueAtIndex (modeList, index);
if (MyBestMode (mode)) {
MyDrawToDisplayWithMode (displays[i], mode); // 5
break;
}
}
CFRelease(modeList);// 6
}
bool MyBestMode (CFDisplayModeRef mode) // 7
{
long height = 0, width = 0;
CFStringRef pixelEncoding;
height=CGDisplayModeGetHeight(mode);
width=CGDisplayModeGetWidth(mode);
pixelEncoding=CGDisplayModeCopyPixelEncoding(mode);
if (height == 640 && width == 1024 &&
CFStringCompare(pixelEncoding,CFSTR(IO32BitDirectPixels),0)==kCFCompareEqualTo)
{
CFRelease(pixelEncoding);
return true;
}
else
{
CFRelease(pixelEncoding);
return false;
}
}
void MyDrawToDisplayWithMode (CGDirectDisplayID display, CGDisplayModeRef mode)
{
CGDisplayModeRef originalMode = CGDisplayCopyDisplayMode (display); // 8
CGDisplayHideCursor (display);
CGDisplaySetDisplayMode (display, mode, NULL); // 9
CGDisplayCapture (display); // 10
/* full screen drawing/game loop here */
CGDisplaySetDisplayMode (display, originalMode, NULL); // 11
CGDisplayModeRelease(originalMode);
CGDisplayRelease (display); // 12
CGDisplayShowCursor (display);
}
コードでは、以下の事をしています。
- 描画に使用可能なアクティブなディスプレイの配列を取得します。
- アクティブなディスプレイの配列を反復処理します。配列はゼロベースであることに注意してください。
- このディスプレイで使用可能なモードの配列を取得します。
- モードが目的のプロパティを持っているかどうかを判断するカスタム関数を呼び出して、ディスプレイ用の使用可能なモードを繰り返します。
- 描画用関数を呼び出します。
- CGDisplayCopyAllDisplayModes から返されるディスプレイモードの CFArray を解放します。
- モード辞書内に 2 つのプロパティをチェックし、モードに目的のプロパティがある場合は true を返します。
- 現在のディスプレイモードを保存します。
- 新しいディスプレイモードを使用するようにディスプレイを再構成します。
- フルスクリーン描画に準備するためにディスプレイをキャプチャします。
- 以前のディスプレイモードに戻します。
- キャプチャされたディスプレイを解放します。