NSView захватывает движение мыши после превышения границ

Я знаю, что название выбрано неудачно, но я не знал, как лучше его описать...

У меня есть экземпляр NSView, который я добавляю в окно на правом краю экрана:

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

Когда пользователь добирается до края экрана, я хочу захватить мышь. Затем я использую этот метод для отправки местоположения в пользовательский протокол делегата:

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

Теперь я хочу продолжить захват реального движения мыши, когда пользователь продолжает перетаскивать ее вправо. Но, как и ожидалось, NSView не получает действий по перемещению, когда указатель выходит за границы представлений, соответственно. край экрана.

Я хочу создать нечто вроде воображаемого вида, расположенного рядом с экраном.

Есть ли возможность продолжить захват мыши? И затем позволить мыши перемещаться за пределы вида только после того, как она будет перемещена полностью назад к левому краю «воображаемого» вида?


person Julian F. Weinert    schedule 28.12.2013    source источник


Ответы (1)


если вы хотите отслеживать мышь, пока она не нажата, вы должны отслеживать события вручную. Вот код шаблона для этого.

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

Если вы хотите, чтобы фреймворк отправлял события перемещения мыши, когда он даже не перетаскивается, вы должны явно настроить свое представление для получения событий перемещения мыши. Поскольку диспетчеризация каждого движения мыши является дорогостоящим действием, вы получите только события ввода и вывода мыши, если вы явно не запрашиваете получение событий перемещения мыши.

person cocoafan    schedule 28.12.2013
comment
Я уже делаю обычное отслеживание мыши. Оно работает. Но я хочу отслеживать перемещение устройства по столу, если указатель достиг края поля зрения - person Julian F. Weinert; 28.12.2013