【问题标题】:mouseEntered event disabled when mouseDown (NSEvents Mac)mouseDown 时 mouseEntered 事件被禁用(NSEvents Mac)
【发布时间】:2011-10-08 21:13:36
【问题描述】:

我创建了一个 NSButton 类,当滚动我的按钮时,它会愉快地检测到 mouseEntered 和 mouseExited 事件。但是一旦 mouseDown 事件发生,只要鼠标按下,mouseEntered 事件就不再被调用,直到鼠标按钮被抬起。

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

所以我想在鼠标按下时检测我的鼠标何时进入。

【问题讨论】:

    标签: objective-c macos mouseevent nsbutton nsevent


    【解决方案1】:

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

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

    【讨论】:

    • 我不太确定如何进行。它都非常专注于拖动不同的数据类型。我没有拖动任何数据。我只是想检测鼠标何时进入新视图(在 nsbuttons 上拖动(鼠标向下))。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 最好在您的问题中提及您使用的是NSTrackingArea
      • 这仍然对我有帮助。
      • 嗯,这对我不起作用。我正在使用NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingEnabledDuringMouseDrag
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2018-08-29
      相关资源
      最近更新 更多