ディスプレイのキャプチャ


ゲームやプレゼンテーションプログラムなどの臨場感のあるアプリケーションを作成する場合は、フルスクリーン描画を行いたいと思うでしょう。


一般的なアプローチは、使用したいディスプレイをキャプチャすることです。ディスプレイをキャプチャすると、ディスプレイを排他的に使用できます。他のアプリケーションやシステムサービスでは、ディスプレイの使用や構成の変更はできません。さらに、ディスプレイの変更について通知されないため、ウィンドウの位置を変更したり、Finder がデスクトップアイコンの位置を変更したりするのを防ぐことができます。


単一のディスプレイをキャプチャするには、関数 CGDisplayCapture を呼び出して下さい。一度にすべてのオンラインディスプレイをキャプチャするには、CGCaptureAllDisplays を呼び出します。デフォルトでは、キャプチャされたスクリーンは黒色で塗りつぶされます。関数 CGDisplayCaptureWithOptions または CGCaptureAllDisplaysWithOptions を使用してキャプチャする場合、この機能を無効にするオプションがあります。


ディスプレイをキャプチャした後、いくつかの描画オプションがあります。


注意: これらの描画オプションのいずれもウィンドウを必要としません。キャプチャされたディスプレイ上にウィンドウを配置してウィンドウに描画しようとすると失敗し、フルスクリーングラフィックスとグラフィックスハードウェアとのやりとりのために、判読不能なコンテンツや目に見えないコンテンツなどの望ましくない結果が生じる可能性があります。


キャプチャされたディスプレイの使用が終了したら、CGDisplayRelease または CGReleaseAllDisplays を呼び出して解放する必要があります。


リスト 1 は、メイン・ディスプレイをキャプチャし、Quartz 2D を使用してテキスト文字列を描画する方法を示しています。番号付きコード行の詳細な説明は、リストの後に示します。


リスト 1 メインディスプレイのキャプチャ


char *text = "Hello, World!";
CGDirectDisplayID display = kCGDirectMainDisplay; // 1
CGError err = CGDisplayCapture (display); // 2
if (err == kCGErrorSuccess)
{
    CGContextRef ctx = CGDisplayGetDrawingContext (display); // 3
    if (ctx != NULL)
    {
        CGContextSelectFont (ctx, "Times-Roman", 48, kCGEncodingMacRoman);
        CGContextSetTextDrawingMode (ctx, kCGTextFillStroke);
        CGContextSetRGBFillColor (ctx, 1, 1, 1, 0.75);
        CGContextSetRGBStrokeColor (ctx, 1, 1, 1, 0.75);
        CGContextShowTextAtPoint (ctx, 40, 40, text, strlen(text)); // 4
        sleep (4); // 5
    }
    CGDisplayRelease (display); // 6
}


コードの動作は以下のとおりです。


  1. メインディスプレイのディスプレイ ID を取得します。
  2. メインディスプレイをキャプチャし、色を黒に変更します。ディスプレイが別のアプリケーションによってキャプチャされた場合にのみエラーが返されます。
  3. キャプチャされたディスプレイに関連した Quartz グラフィックスコンテキストを取得します。
  4. テキスト文字列をスクリーンの左下隅に描画します。
  5. ユーザーがテキストを読むことができるように数秒間処理を中断します。
  6. キャプチャされたディスプレイを解放します。

注意: フルスクリーン描画を行うには、ディスプレイをキャプチャする必要はありません。もう 1 つのアプローチは、ディスプレイのサイズを、境界のないウィンドウに作成して描画することです。この方法では、ウィンドウシステムのすべての機能を使用できます。また、オペレーティングシステムの残りの部分でもうまく動作し、ディスプレイ処理の複雑さを軽減します(たとえば、ミラーリングされたディスプレイについて心配する必要はありません)。この方法では、キャプチャされたディスプレイで表示されないエラーアラートを受け取ることができます。また、Command-Tab を使用して、この方法でアプリケーションを変更することもできます。最新のグラフィックハードウェアを搭載したシステムでは、フルスクリーンウィンドウでの描画パフォーマンスは、フルスクリーン描画コンテキストとほぼ同じくらいの速さです。


前の章 次の章



目次
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)