NSView 在超出边界后捕获鼠标移动



我知道标题选得不好,但我不知道如何更好地描述它......

我有一个 NSView 实例,我将其添加到右侧屏幕边缘的窗口中:

CGRect zoneFrame = CGRectMake(screenFrame.size.width - 50, 0, 50, screenFrame.size.height);

当用户到达屏幕边缘时,我想捕获鼠标。然后,我使用此方法将位置发送到自定义委托协议:

- (void)mouseMoved:(NSEvent *)mouseEvent {
    [_delegate mouseMovedTo:[mouseEvent locationInWindow]];
}

我现在想继续捕获真实的鼠标移动,当用户继续将其拖动到右侧时。但是,正如预期的那样,当指针超出边界视图时,NSView 不会收到移动操作,或者屏幕边缘。

我想创建一些你可以想到的假想视图的东西,它放在屏幕旁边。

是否有可能继续捕获鼠标?然后让鼠标在一直移动到"虚构"视图的左边缘后才移动到视图之外?

如果要在

鼠标按下时跟踪鼠标,则必须手动跟踪事件。这是一个模板代码来执行此操作。

- (void)trackMouseWithEvent:(NSEvent *)theEvent {
  NSPoint curPoint = [self convertPoint: [theEvent locationInWindow] fromView: nil];
  while (1) {
    NSEvent *theEvent = [[self window] nextEventMatchingMask: (NSLeftMouseDraggedMask | NSLeftMouseUpMask)];
    NSPoint newPoint = [self convertPoint: [theEvent locationInWindow] fromView: nil];
    // Drag distance is curPoint - newPoint
    if ([theEvent type] == NSLeftMouseUp)
      break;
  }
}

如果希望框架在甚至未拖动时发送鼠标移动事件,则必须显式设置视图以接收鼠标移动事件。由于调度每次鼠标移动都是一个昂贵的操作,如果您没有明确要求接收鼠标移动事件,您将只会获得鼠标输入和鼠标退出事件。

相关内容

  • 没有找到相关文章

最新更新