ページ

2008年5月2日金曜日

RubberBand(その16)縦横比率を維持したままリサイズ(その3)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

前回からの続きで、マウスカーソルに制約を加える。NSView上の任意の点にマウスカーソルを留まらせる為に CGDisplayMoveCursorToPoint( ) を使う。CGDisplayMoveCursorToPoint は表示されているディスプレイの左上を原点(0,0)とする座標系を使う。つまり NSViewの座標系から、最終的には画面左上が原点(0,0)の座標系に変換する必要がある。

こんな感じ。


ビューの座標系の原点が左上(0,0)になっているのはフリップ(flip)している為。

RubberBandの左下のKnobの座標値は、実際次のようになった。

(1) ビュー座標   (50,185)
(2) ウィンドウ座標 (50,52) ...フリップが補正されている
(3) スクリーン座標 (71,614) ...画面上の方にあるので Y値が大きくなった
(4) CGDisplay系座標 (71,240) ...Y値が補正された(フリップした)


座標変換のコードは次の通り。

CGDirectDisplayID displayID = kCGDirectMainDisplay;
CGRect screen_rect = CGDisplayBounds(displayID);
NSPoint p1 = [self convertPointToBase:pp];
NSPoint p2 = [[self window] convertBaseToScreen:p1];
CGPoint cpp = NSPointToCGPoint(p2);
cpp.y = screen_rect.size.height - cpp.y;
CGDisplayMoveCursorToPoint(displayID, cpp);


各変数がそれぞれの座標系における位置を表す。
pp ... ビュー座標
p1 ... ウィンドウ座標
p2 ... スクリーン座標
cpp .. CGDisplay系座標

スクリーン座標から、CGDisplay系座標への変換方法が分からなかったのでディスプレイの縦ピクセルから最終的に求めている。

- - - -
これでマウスの動きに制約が加えられる。
次は本題の縦横比率リサイズへ戻る。