2011-07-19 70 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]; 
    } 
}