NSEvent

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




Application Kit