4

NSButton クラスを作成しました。ボタンをロールオーバーすると、mouseEntered および mouseExited イベントが検出されます。しかし、mouseDown イベントが発生するとすぐに、マウスが押されている限り、mouseEntered イベントはマウス ボタンが離されるまで呼び出されなくなります。

したがって、mouseDown イベントが呼び出されると、mouseEntered または MouseExited イベントは呼び出されなくなり、最初の mouseDown を放すまで、他のボタンをロールオーバーするときにも mouseDown が呼び出されなくなります。

そのため、マウスがダウンしているときにマウスが入ったことを検出したいと思います。

4

3 に答える 3

6

NSTrackingEnabledDuringMouseDrag を NSTrackingAreaOptions に追加するだけでよいことがわかりました。マウスを押したままドラッグすると、mouseEntered および mouseExited イベントが発生するようになりました。

于 2011-07-19T23:39:01.607 に答える
5

NSButtonマウス ダウン イベントを受け取ると、プライベート トラッキング ループに入り、マウスが上がるまでポストされたすべてのマウス イベントを処理します。マウスの位置に基づいて処理を行う独自の追跡ループを設定できます。

- (void) mouseDown:(NSEvent *)event {

    BOOL keepTracking = YES;
    NSEvent * nextEvent = event;

    while( keepTracking ){

        NSPoint mouseLocation = [self convertPoint:[nextEvent locationInWindow]
                                          fromView:nil];
        BOOL mouseInside = [self mouse:mouseLocation inRect:[self bounds]];
        // Draw highlight conditional upon mouse being in bounds
        [self highlight:mouseInside];

        switch( [nextEvent type] ){
            case NSLeftMouseDragged:
                /* Do something interesting, testing mouseInside */
                break;
            case NSLeftMouseUp:
                if( mouseInside ) [self performClick:nil];
                keepTracking = NO;
                break;
            default:
                break;
        }

        nextEvent = [[self window] nextEventMatchingMask:NSLeftMouseDraggedMask | NSLeftMouseUpMask];
    }
}
于 2011-07-19T22:05:31.423 に答える
0

マウスの左ボタンを押したままにすると、ドラッグが開始されます。mouseEntered私の記憶が正しければ、マウス移動イベントはドラッグ中に送信されません。これが、メッセージを取得できない 1 つの理由である可能性がありmouseExitedます。ただし、NSDraggingDestinationプロトコルを実装し、ドラッグされるデータのタイプの可能な受信者としてビューを登録すると、代わりdraggingEntereddraggingExitedメッセージが表示されます。

Drag and Drop Programming TopicsのDragging Destinationsセクションでそれについて読んでください。

于 2011-07-19T21:16:06.000 に答える