ページ

2008年2月20日水曜日

スクラップブックその8 - マウスカーソル下の画像を反転させる

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

マウストラッキングの仕組みが分かったのでスクラップブックで使ってみる。まずはマウスカーソルが画像の上に乗ったら色を変える処理を加えてみよう。こんな感じ。



画像の上にマウスカーソルが乗ると赤くなる。

サンプル:sp4-8.zip


マウストラッキングには NSTrackingArea を使う。

WorkView.m

  _tracking_area = [[NSTrackingArea alloc]
initWithRect:[self bounds]
options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved |NSTrackingActiveInKeyWindow | NSTrackingInVisibleRect| NSTrackingEnabledDuringMouseDrag)
owner:self
userInfo:nil];
[self addTrackingArea:_tracking_area];


NSScrollViewを使う場合は、トラッキングオプションに NSTrackingInVisibleRect を加えてやるとスクロールバーがトラッキング領域から外れるので便利。

これで mouseMoved: メッセージが送られてくるようになるので、マウスカーソル下に画像があるかチェックする。
- (void)mouseMoved:(NSEvent *)theEvent
{
NSPoint cp = [self convertPoint:[theEvent locationInWindow] fromView:nil];
_mouseon_item = nil;
for (Item* item_test in [[_controller items] reverseObjectEnumerator]) {
if (NSPointInRect(cp, [item_test rect])) { // ヒットテスト
_mouseon_item = item_test;
break;
}
}
if (_mouseon_item) {
[self setNeedsDisplayInRect:[_mouseon_item rect]];
}
[self setNeedsDisplay:YES];
}


画像があったら _mouseon_item へ入れて再描画する。

- (void)drawRect:(NSRect)rect {
 :
if (_mouseon_item == item) {
[[[NSColor redColor] colorWithAlphaComponent:0.3f] set];
[NSBezierPath fillRect:[item rect]];
}


これでマウスカーソル下の画像が赤くなる。

画像の数が多くなると上記のヒットテストは無駄が多い。mouseMoved:が呼ばれる頻度を考えるともっと負荷をかけない方法が必要。

- - - -

仕組みができたので次はこれを利用して画像にアイコンを貼付ける。