HMDT - Logic and Intuition -

about HMDT

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 の、keyDownkeyUp: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 では、keyDownkeyUp:flagsChanged: のメソッドをオーバーライドしている。ここではとりあえず NSLog() でメッセージを吐かせている。これでキーイベントが受け取れるぜ。

■サンプルダウンロード:
KeyEvent.tar.gz

back to top content

Copyright © 2002-2006 HMDT. All rights reserved.