ページ

2008年11月8日土曜日

非アクティブなウィンドウで最初のクリックイベントを拾う

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

普通に NSView を作ると、そのビューが載るウィンドウが非アクティブな場合は最初のクリックイベントを拾わない。この為、まず(1)ウィンドウをクリックしてアクティブにし、(2)ビューをクリックする、と2回クリックすることでようやくイベントが拾える。

ビューでクリックイベントを拾う

(1) ウィンドウをクリック(アクティブにする)
(2) ビューをクリックする(イベントが拾える)


これを非アクティブのウィンドウであってもワンクリックでビューがイベントを拾えるようにしたい。
NSButtonの動作を見ると、非アクティブのウィンドウであってもワンクリックでイベントを拾っているようにみえる。

そこで NSViewのリファレンスを調べたところ該当するメソッドがあった。

NSView#acceptsFirstMouse:

ビューでこのメソッドをオーバーライドして YESを返すようにすればよい。
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
return YES;
}


検証用にサンプルを作ってみたところ、うまくいった。

サンプル:WindowSample-1.zip



サンプルは画面最上位レベルに赤枠を表示する。このウィンドウが非アクティブな場合でも、赤枠をクリックするとイベントに反応する(デバッグコンソールに NSEventの内容がダンプされる)。

- - - -
おおこれはいい。SimpleCapで使おう。