我创建了一个NSButton类,当滚动我的按钮时,它很高兴地检测到mouseEntered和mouseExited事件。但只要mouseDown事件发生,只要鼠标停止,鼠标按钮被抬起就不再调用mouseEntered事件。
因此,当调用mouseDown事件时,不再调用mouseEntered或MouseExited事件,滚动其他按钮时也不会调用mouseDown,直到我放开了初始mouseDown。
所以我想在鼠标停止的时候检测鼠标何时进入。
希望你理解,并希望你能帮助阻止这一点。如果有更多细节可以帮助我,请告诉我。
答案 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)
当鼠标左键按下时,开始拖动。如果我没记错的话,拖动期间不会发送鼠标移动事件,这可能是您没有收到mouseEntered
和mouseExited
消息的原因之一。但是,如果您实施NSDraggingDestination
协议并将视图注册为可能被拖动数据类型的收件人,则会收到draggingEntered
和draggingExited
条消息。
在拖放编程主题的Dragging Destinations部分阅读。