以前、ウィンドウトラッキングでボタンのマウスオーバーが効かない問題を書いた。コードを見直したところ NSTrackingArea を作る時のオプションを変えることで解決できた。修正個所はボタンのビュークラス ThinButtonBar.m 内の NSTrackingArea生成個所。
ThinButtonBar.m
_tracking_area = [[NSTrackingArea alloc] initWithRect:tracking_rect
options:(NSTrackingMouseEnteredAndExited |
NSTrackingMouseMoved | NSTrackingActiveInKeyWindow)
最後のオプションに NSTrackingActiveInKeyWindow を指定していたのをやめて、NSTrackingActiveAlways に変更した。
_tracking_area = [[NSTrackingArea alloc] initWithRect:tracking_rect
options:(NSTrackingMouseEnteredAndExited |
NSTrackingMouseMoved | NSTrackingActiveAlways)
オプションの意味は定数名称の通りでウィンドウがアクティブなキーウィンドウの時のみ(NSTrackingActiveInKeyWindow)か、もしくはアクティブ状態に関わらずいつでも(NSTrackingActiveAlways)となる。ヘッダファイルのコメントも見てみよう。
NSTrackingArea.h
/* When tracking area is active. You must specify one of the following in the NSTrackingAreaOptions argument of -initWithRect:options:owner:userInfo: */
enum {
NSTrackingActiveWhenFirstResponder = 0x10, // owner receives mouseEntered/Exited, mouseMoved, or cursorUpdate when view is first responder
NSTrackingActiveInKeyWindow = 0x20, // owner receives mouseEntered/Exited, mouseMoved, or cursorUpdate when view is in key window
NSTrackingActiveInActiveApp = 0x40, // owner receives mouseEntered/Exited, mouseMoved, or cursorUpdate when app is active
NSTrackingActiveAlways = 0x80, // owner receives mouseEntered/Exited or mouseMoved regardless of activation. Not supported for NSTrackingCursorUpdate.
};
- - - - -
これでウィンドウトラッキングができた。さていよいよ最後のアプリケーションキャプチャに取りかかろう。