mouseEntered事件已禁用当mouseDown(NSEvents Mac)

时间:2011-07-19 20:31:23

标签: objective-c macos mouseevent nsbutton nsevent

我创建了一个NSButton类,当滚动我的按钮时,它很高兴地检测到mouseEntered和mouseExited事件。但只要mouseDown事件发生,只要鼠标停止,鼠标按钮被抬起就不再调用mouseEntered事件。

因此,当调用mouseDown事件时,不再调用mouseEntered或MouseExited事件,滚动其他按钮时也不会调用mouseDown,直到我放开了初始mouseDown。

所以我想在鼠标停止的时候检测鼠标何时进入。

希望你理解,并希望你能帮助阻止这一点。如果有更多细节可以帮助我,请告诉我。

3 个答案:

答案 0 :(得分:6)

原来我只需要将NSTrackingEnabledDuringMouseDrag添加到我的NSTrackingAreaOptions中。当鼠标按下拖动时,mouseEntered和mouseExited事件现在会触发。

答案 1 :(得分:4)

NSButton收到鼠标按下事件时,它会输入private tracking loop,处理所有发布的鼠标事件,直到它出现鼠标。您可以设置自己的跟踪循环来根据鼠标位置执行操作:

- (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];
    }
}

答案 2 :(得分:0)

当鼠标左键按下时,开始拖动。如果我没记错的话,拖动期间不会发送鼠标移动事件,这可能是您没有收到mouseEnteredmouseExited消息的原因之一。但是,如果您实施NSDraggingDestination协议并将视图注册为可能被拖动数据类型的收件人,则会收到draggingEntereddraggingExited条消息。

拖放编程主题Dragging Destinations部分阅读。