Cocoa Programming Tips 1001
Application Kit
NSEvent
Application Kit - NSEvent
イベントの起きた場所を調べる
Keywords: locationInWindow
イベントには場所情報を伴うものもある。たとえば、マウスイベントとかね。イベントがウィンドウの中のどこで起きたのか?を、調べるものが locationInWindow メソッドだ。
Application Kit/NSEvent.h
- (NSPoint)locationInWindow;
これを使えば、イベントからウィンドウのどの場所で起きたか?という情報を取り出すことができる。
これとは別に、画面の中でのマウスの位置をを知りたいときは、mouseLocation クラスメソッドを使う。
Application Kit/NSEvent.h
+ (NSPoint)mouseLocation;
このメソッドは現在のマウスの位置を返す。
(sample)
- (void)mouseDown:(NSEvent*)event
{
NSPoint point;
point = [event locationInWindow];
printf("Mouse location is %s in Window¥n",
[NSStringFromPoint(point) cString]);
point = [self convertPoint:point fromView:nil];
printf("Mouse lcoation is %s in View¥n",
[NSStringFromPoint(point) cString]);
point = [NSEvent mouseLocation];
printf("Mouse location is %s in Screen¥n",
[NSStringFromPoint(point) cString]);
}
上のサンプルでは、イベントが起きたときのマウスの位置と、現在のマウスの位置を表示している。それぞれ、ウィンドウでの座標、ビューでの座標、スクリーンでの座標だ。ビューでの座標は、convertPoint: を使って取得しているよ。
Application Kit - NSEvent
クリックの回数を調べる
Keywords: clickCount
イベントがマウスイベントだった場合は、クリックの回数を調べることができるんだ。これを使えば、シングルクリックなのか、ダブルクリックなのか知ることができる。clickCount を使う。
Application Kit/NSEvent.h
- (int)clikcCount;
返り値にクリックの回数が入るんだ。マウスイベント意外にこのメソッドを使うと、例外が発生するから、注意。
Application Kit - NSEvent
キーイベントを受け取る
Keywords: keyDown, keyUp
キーボードのキーを押されたときに発行されるのがキーイベント。これに関連するメソッドは NSResponder の、keyDown、keyUp:、flagsChanged: だ。
Application Kit/NSResponder.h
- (void)keyDown:(NSEvent *)theEvent;
- (void)keyUp:(NSEvent *)theEvent;
- (void)flagsChanged:(NSEvent *)theEvent;
キーが押されたときにこれらのメソッドが呼び出されるんだけど、あるオブジェクトがこれらのイベントを受け取るには、次の条件が必要なんだ。
- NSResponder のサブクラスである
- ファーストレスポンダである
キーイベントを受け取るためには、ファーストレスポンダでなくてはいけない。マウスでクリックしてやるか、NSWindow の makeFirstResponder: メソッドを使ってファーストレスポンダにしてやろう。
ではサンプル。このサンプルは .nib で KeyResponder っていうインスタンスを作って、そいつにキーイベントを渡す様子を見せているんだ。実行すると Start と Stop というボタンが出てきて、それを押すと KeyResponder のインスタンスをファーストレスポンダにしたり、ファーストレスポンダから外したりする。
KeyEvent/AppController.m
- (IBAction)start:(id)sender
{
// keyResponder をファーストレスポンダにする
[_window makeFirstResponder:_keyResponder];
}
- (IBAction)stop:(id)sender
{
// ファーストレスポンダを nil にする
[_window makeFirstResponder:nil];
}
ファーストレスポンダになる KeyResponder では、keyDown、keyUp:、flagsChanged: のメソッドをオーバーライドしている。ここではとりあえず NSLog() でメッセージを吐かせている。これでキーイベントが受け取れるぜ。
■サンプルダウンロード:
KeyEvent.tar.gz