ディスプレイモードの変更(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);
}


コードでは、以下の事をしています。


  1. 描画に使用可能なアクティブなディスプレイの配列を取得します。
  2. アクティブなディスプレイの配列を反復処理します。配列はゼロベースであることに注意してください。
  3. このディスプレイで使用可能なモードの配列を取得します。
  4. モードが目的のプロパティを持っているかどうかを判断するカスタム関数を呼び出して、ディスプレイ用の使用可能なモードを繰り返します。
  5. 描画用関数を呼び出します。
  6. CGDisplayCopyAllDisplayModes から返されるディスプレイモードの CFArray を解放します。
  7. モード辞書内に 2 つのプロパティをチェックし、モードに目的のプロパティがある場合は true を返します。
  8. 現在のディスプレイモードを保存します。
  9. 新しいディスプレイモードを使用するようにディスプレイを再構成します。
  10. フルスクリーン描画に準備するためにディスプレイをキャプチャします。
  11. 以前のディスプレイモードに戻します。
  12. キャプチャされたディスプレイを解放します。

前の章 次の章



目次
Xcode の新機能

  • Quartz Display Services プログラミング入門
  • この文書の構成
  • Quartz ディスプレイサービスの概要
  • ディスプレイの状態
    ディスプレイ ID
    ディスプレイモード(OS X v10.6 以降)
    ディスプレイモード(OS X v10.5)
    ディスプレイの配置
    ディスプレイのミラーリング
  • ディスプレイに関する情報の取得
  • ディスプレイ状態情報の取得(OS X v10.6 以降)
    ディスプレイ状態情報の取得(OS X v10.5)
    ディスプレイモード情報の取得(OS X v10.6 以降)
    ディスプレイモード情報の取得(OS X v10.5)
  • ディスプレイのキャプチャ
  • ディスプレイモードの変更(OS X v10.6以降)
  • 使用可能なモードからベストのモードを見つける
  • ディスプレイモードの変更(OS X v10.5)
  • メインディスプレイのモードを設定
  • 処理(Transaction) を使用したディスプレイの構成
  • フェード効果の使用
  • すべてのディスプレイをフェードする
    単一のディスプレイをフェードする
  • 構成変更の通知
  • マウスカーソルの制御
  • 文書改定履歴












  • トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)












    トップへ(Quartz Display Services)