超过界限后,NSView捕获鼠标移动

时间:2013-12-28 11:27:56

标签: objective-c mouseevent nsview nsevent

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

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

如果要在鼠标停止时跟踪鼠标,则必须手动跟踪事件。这是一个模板代码。

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

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