我创建了一个 NSButton 类,当滚动我的按钮时,它很高兴地检测到 mouseEntered 和 mouseExited 事件。但是一旦 mouseDown 事件发生,只要鼠标按下,mouseEntered 事件就不再被调用,直到鼠标按钮被抬起。
因此,当调用 mouseDown 事件时,不再调用 mouseEntered 或 MouseExited 事件,也不会在滚动其他按钮时调用 mouseDown,直到我松开初始 mouseDown。
所以我想在鼠标按下时检测我的鼠标何时进入。
我创建了一个 NSButton 类,当滚动我的按钮时,它很高兴地检测到 mouseEntered 和 mouseExited 事件。但是一旦 mouseDown 事件发生,只要鼠标按下,mouseEntered 事件就不再被调用,直到鼠标按钮被抬起。
因此,当调用 mouseDown 事件时,不再调用 mouseEntered 或 MouseExited 事件,也不会在滚动其他按钮时调用 mouseDown,直到我松开初始 mouseDown。
所以我想在鼠标按下时检测我的鼠标何时进入。
原来我只需要将 NSTrackingEnabledDuringMouseDrag 添加到我的 NSTrackingAreaOptions 中。mouseEntered 和 mouseExited 事件现在在使用鼠标向下拖动时触发。
当 anNSButton
接收到鼠标按下事件时,它会进入一个私有跟踪循环,处理所有发布的鼠标事件,直到它获得鼠标。您可以设置自己的跟踪循环来根据鼠标位置执行操作:
- (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];
}
}
当鼠标左键按下时,拖动开始。如果我没记错的话,在拖动过程中不会发送鼠标移动事件,这可能是您没有收到消息mouseEntered
的原因之一。mouseExited
但是,如果您实现该NSDraggingDestination
协议并将您的视图注册为被拖动数据类型的可能接收者,您将获得draggingEntered
和draggingExited
消息。
在拖放编程主题的拖动目的地部分阅读它。