Событие mouseEntered отключено, когда mouseDown (NSEvents Mac) - PullRequest
3 голосов
/ 20 июля 2011

Я создал класс NSButton, и при наведении на мои кнопки он с радостью обнаруживает события mouseEntered и mouseExited. Но как только происходит событие mouseDown, пока мышь нажата, события mouseEntered больше не вызываются до тех пор, пока не будет нажата кнопка мыши.

Таким образом, когда вызывается событие mouseDown, события mouseEntered или MouseExited больше не вызываются, а также mouseDown не вызывается при наведении на другие кнопки до тех пор, пока я не отпущу исходный mouseDown.

Итак, я хотел бы определить, когда моя мышь входит, когда мышь также не работает.

Надеюсь, вы понимаете, и надеюсь, что вы можете помочь остановить это. Дайте мне знать, если поможет более подробная информация.

Ответы [ 3 ]

6 голосов
/ 20 июля 2011

Оказывается, мне просто нужно было добавить NSTrackingEnabledDuringMouseDrag в мои NSTrackingAreaOptions.События mouseEntered и mouseExited теперь запускаются при перетаскивании мышью вниз.

4 голосов
/ 20 июля 2011

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

- (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];
    }
}
0 голосов
/ 20 июля 2011

Когда левая кнопка мыши нажата, начинается перетаскивание.Если я правильно помню, события перемещения мыши не передаются во время перетаскивания, и это, вероятно, одна из причин, по которой вы не получаете сообщения mouseEntered и mouseExited.Однако если вы реализуете протокол NSDraggingDestination и зарегистрируете свое представление в качестве возможного получателя типа перетаскиваемых данных, вместо этого вы получите сообщения draggingEntered и draggingExited.

Подробнее об этом читайте в перетаскивание пунктов назначения раздел Перетаскивание тем программирования .

...