ページ

2008年4月20日日曜日

RubberBand(その5)マウスイベント処理

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

描画ができたので今回はマウスイベント処理に取りかかる。

RubberBand で必要な処理とは次の2つ。
(1) マウスクリック時にKnobがクリックされたかを判断
(2) Knobがクリックされた状態でドラッグされた場合、伸縮させる

今回はクリック時の判断処理を行う。

まずは mouseDown:を実装する。

- (void)mouseDown:(NSEvent*)event
{
NSPoint p = [self convertPoint:[event locationInWindow] fromView:nil];
int knob_type = [self knobAtPoint:p];

NSLog(@"%d", knob_type);
}


マウスクリック時にどの Knobが押されたのかを #knobAtPoint: から取得し表示する。Knobの種類は enumで定義しておく。
enum KNOB_TYPE {
KNOB_NON,
KNOB_TOP_LEFT , KNOB_TOP_MIDDLE , KNOB_TOP_RIGHT,
KNOB_MIDDLE_LEFT , KNOB_MIDDLE_RIGHT,
KNOB_DOWN_LEFT , KNOB_DOWN_MIDDLE , KNOB_DOWN_RIGHT
};


#knobAtPoint: では渡されたポイント位置にどの Knobがあるかをチェックする。描画同様、これも力技(Sketchがそうだったので。。)。
- (int)knobAtPoint:(NSPoint)p
{
int knob_type = KNOB_NON;
if (NSPointInRect(p, MakeKnobRect(NSMinX(_rect), NSMinY(_rect)))) {
knob_type = KNOB_TOP_LEFT;
} else if (NSPointInRect(p, MakeKnobRect(NSMidX(_rect), NSMinY(_rect)))) {
knob_type = KNOB_TOP_MIDDLE;
} else if (NSPointInRect(p, MakeKnobRect(NSMaxX(_rect), NSMinY(_rect)))) {
knob_type = KNOB_TOP_RIGHT;
} else if (NSPointInRect(p, MakeKnobRect(NSMinX(_rect), NSMidY(_rect)))) {
knob_type = KNOB_MIDDLE_LEFT;
} else if (NSPointInRect(p, MakeKnobRect(NSMaxX(_rect), NSMidY(_rect)))) {
knob_type = KNOB_MIDDLE_RIGHT;
} else if (NSPointInRect(p, MakeKnobRect(NSMinX(_rect), NSMaxY(_rect)))) {
knob_type = KNOB_DOWN_LEFT;
} else if (NSPointInRect(p, MakeKnobRect(NSMidX(_rect), NSMaxY(_rect)))) {
knob_type = KNOB_DOWN_MIDDLE;
} else if (NSPointInRect(p, MakeKnobRect(NSMaxX(_rect), NSMaxY(_rect)))) {
knob_type = KNOB_DOWN_RIGHT;
}
return knob_type;
}



実行して Knobをクリックすると位置に合わせた整数値がログに表示される。Knob以外の場所は 0 (KNOB_NON)となる。

コード:RubberBand-2.zip

- - - -
次は Knobをつかんだドラック処理の実装を行う。