2012-04-01 8 views
2

クリックしたのではなくマウスを押したときに検出できるようにしようとしています。これは私が持っているものですが、クリック数の代わりにマウスを押さえていることを検出できるようにしたいのです。マウスが押されているのを検出しました

-(void)mouseDown:(NSEvent *)event; 
{ 
    //instead of clickCount I want my if statement to be 
    // if the mouse is being held down. 
    if ([event clickCount] < 1) 
    { 

    } 
    else if ([event clickCount] > 1) 
    { 

    } 
} 
+0

ユーザーがクリックして保持してもこのイベントは発生しませんか? – millimoose

+0

'mouseDown'イベントが発生した時点で、将来、マウスボタンを押したままにするかどうかを知ることができません。通常、ドラッグアンドドロップを実装するには、 'mouseDown'イベントで何がドラッグされているのか把握し、クリスティアンのアウトラインのような' mouseUp'イベントを監視し、アイテムがどこにドロップされたのかを把握し、 'mouseMoved何かがドラッグされているかどうかを調べるために '' mouseIsHeldDown''をチェックします。 –

+0

もう一つの選択肢は、 'mouseDown'にある種の遅延コールバックを設定することです。マウスが離された場合はコールバックをクリアし、コールバックが発生すると、マウスボタンが少なくともその時間以上押されています。キーリピートの仕組みと似ています。 –

答えて

3

おそらく、マウスが特定の期間押し続けられているかどうかを検出する必要があります。これはかなり簡単です。タイマーが必要です。

mouseDown:では、選択した期間後に起動するタイマーを起動します。

- (void)mouseUp: (NSEvent *)theEvent { 
    [mouseTimer invalidate]; 
    mouseTimer = nil; 
} 

タイマーが起動した場合、その後、あなたはマウスことを知っている:あなたはまた、タイマーを破壊し、mouseUp:mouseUp:

- (void)mouseDown: (NSEvent *)theEvent { 
    mouseTimer = [NSTimer scheduledTimerWithTimeInterval:mouseHeldDelay 
                target:self 
               selector:@selector(mouseWasHeld:) 
               userInfo:theEvent 
               repeats:NO]; 
} 

でそれを参照しますので、あなたは、IVARにこれを固執する必要がありますボタンは、時間のご指定された期間のためにダウン開催されている、とあなたが好きな行動取ることができます:OS X 10.6以降で

- (void)mouseWasHeld: (NSTimer *)tim { 
    NSEvent * mouseDownEvent = [tim userInfo]; 
    mouseTimer = nil; 
    // etc. 
} 
+0

あなたの 'mouseUp'ハンドラは、ユーザが何かをクリックしても、ボタンを押したままにしていなければ何が起こる必要があるかどうかを処理する必要があります。また、 'mouseUp:'が入力されてから '[mouseTimer invalidate];が呼び出される前にタイマーが起動しないという保証がありますか? –

+0

@Mike:1)もちろんです。私はOPへの練習としてそれを残す。 2)タイマーとイベントの処理は、実行ループの両方のキューに入れられた入力なので、問題ではありません。私はそうでなければその保証をする方法を考えることができません。 –

+0

いったんマウスを一定時間押さえた後、mouseWasHeldを呼び出したら、EXC_BAD_ACCESSを取得しています。 mouseWasHeldが呼び出された場合に限り、マウスを放すとすぐにそれが発生します。私が間違ったことを知っていますか? –

0

私の知る限りは、ユーザーが最初に押されていない要素を、クリックしたときに、mouseDownイベントにのみ起動されます覚えています。

あなたの問題を解決するには、そのようなあなたの.hでBOOLを定義することです:

あなたのmouseDownで次に
bool mouseIsHeldDown = false; 

mouseIsHeldDown = true; 

そして、あなたのmouseUp中:

mouseIsHeldDown = false; 

次に、コード内のどこでもmouseIsHeldDown = trueがチェックされます。

これで問題は解決します。

9

を、あなたが使用することができますNSEventのどこからpressedMouseButtons方法:

NSUInteger mouseButtonMask = [NSEvent pressedMouseButtons]; 
BOOL leftMouseButtonDown = (mouseButtonMask & (1 << 0)) != 0; 
BOOL rightMouseButtonDown = (mouseButtonMask & (1 << 1)) != 0; 

方法は、現在ダウンマスクとして、マウスボタンのインデックスを返します。 1 << 0はマウスの左ボタンに対応し、1 << 1はマウスの右ボタンに、1 << nはn> = 2のマウスボタンに対応します。

これで、mouseDown:mouseDragged:、またはイベントをキャッチする必要はありません。

関連する問題