2011-07-19 33 views
2

我创建了一个NSButton类,当滚动我的按钮它愉快地检测mouseEntered和mouseExited事件。但只要mouseDown事件发生,只要将鼠标放下,mouseEntered事件就不会再被调用,直到鼠标按钮被解除为止。mouseEntered事件禁用当mouseDown(NSEvents的Mac)

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

所以我想检测鼠标何时进入,鼠标何时进入。

希望你明白,并希望你能帮助制止这一点。让我知道如果更多的细节会有所帮助。

回答

6

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

+0

在你的问题中提到你正在使用'NSTrackingArea'可能是一个好主意。 –

+0

对不起。 –

+0

这仍然帮助我。 – charles

0

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

阅读关于它的Dragging Destinations部分拖放编程主题

+0

我不太清楚如何得到这个去。它们都非常专注于拖动不同的数据类型。我没有拖动任何数据。我只是想检测鼠标何时进入一个新的视图(通过nsbuttons拖动(鼠标向下))。 –

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