2011-12-06 10 views
3

私は、ウィンドウ位置をマニピュレートするアプリケーションを作成しており、マルチモニタのサポートを追加しています。NSScreensで作業するとき、グローバル座標とローカル座標をどのように変換しますか?

これを容易にするために、私は "ローカル"ウィンドウ位置(NSScreenのフレームに対して)を持っており、これを "グローバル"ウィンドウ位置(すべてのモニター位置が指定されている位置これは[NSスクリーンスクリーン]の最初の(0番目の)インデックスの左下隅です。

1つの座標系を使用してウィンドウの位置を保存し、グローバル座標系を基準にしてこれをローカル座標系に変換して表示したいとします。

NSScreenフレームとグローバルなスクリーンスペースの間で座標を変換するヘルパーメソッドとは何ですか?

答えて

3

[NSScreen frame]のように聞こえます。フレームの原点は、ゼロスクリーン([[NSScreen screens] objectAtIndex:0])のフレーム原点に相対的です。

ところで、NSWindowのフレームは、すでにゼロスクリーンのフレーム原点に対してグローバル座標系にあります。それはあなたがそれを再発明しているかもしれないように聞こえるが、あなたはそれを行うのに十分な理由があるかもしれない。ここでは例として

は、画面のフレームに対してグローバルポイント、及びポイントを変換します二つの関数です:

extern NSPoint MyConvertLocalScreenPointToGlobal(NSScreen *screen, NSPoint local) { 
    NSPoint global = { 
     .x = [screen frame].origin.x + local.x, 
     .y = [screen frame].origin.y + local.y, 
    }; 
    return global; 
} 

extern NSPoint MyConvertGlobalScreenPointToLocal(NSScreen *screen, NSPoint global) { 
    NSPoint local = { 
     .x = global.x - [screen frame].origin.x, 
     .y = global.y - [screen frame].origin.y, 
    }; 
    return local; 
} 
+0

がマルチモニターを扱う私のアプリケーションの一つで、私はグローバルに全力を尽くします座標(どのスクリーンフレームが入っているか)。個々の画面に関連する座標のみを持っている場合は、それらを画面のフレーム座標に追加するための単純な計算を行うだけで済みます。 – DouglasHeriot

+0

ええ、画面のフレーム原点に画面相対位置を追加することで、グローバルオフセットを取得できるはずです。これは、ゼロスクリーンの起点に相対的なポイントになります。 –

関連する問題