0

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

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

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

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

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

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

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

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

4

1 回答 1

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

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

于 2013-12-28T11:50:37.367 回答