ページ

2008年11月5日水曜日

透明なウィンドウ(1)非透明部分でイベントを拾い、透明部分は拾わない

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

SimpleCapの範囲選択にタイマー機能がある。このタイマー機能、使っているともの足りない点に気がついた。タイマー起動中に範囲の大きさが変更できない。これを変更できる様にしよう。ただ調べていくうちに問題に突き当たった。ラバーバンドはイベントを拾いたいが、それ以外の透明部分はイベントを拾わないようにしたいがこれがうまく行かない。どうも NSWindow#setIgnoresMouseEvents: を使うとウィンドウの透明部分がイベントを拾う様になってしまうようだ。

このあたりを調べるためにサンプルアプリを作ってみた。

サンプル:TransparentWindow-1.zip

実行すると透明なウィンドウが作られ、そこへ赤い四角枠が描かれる。赤い枠のみイベントを拾い、真ん中の透明部分はイベントを拾わないようにしたい。


このサンプルで次のことがわかった。

(1) NSWindow#setIgnoresMouseEvents: を使わないと意図通りに動作する。つまり赤枠のみイベントを拾い、真ん中の透明部分はイベントを拾わない(下のウィンドウが反応する)。

(2) setIgnoresMouseEvents:NO を投げると赤枠だけでなく、透明部分もイベントを拾う様になる

(3) setIgnoresMouseEvents:YES を投げると全てがイベントを拾わなくなる。その後に setIgnoresMouseEvents:NO を投げると (2)と同じになる。


つまり setIgnoresMouseEvents: を1度でも使うと (1)の状態へ戻せない。

うーむ。