Подкласс NSButton, который реагирует на щелчки правой кнопкой мыши

У меня есть подкласс NSButton, который я хотел бы заставить работать с щелчком правой кнопки мыши. Простая перегрузка -rightMouseDown: не приведет к его сокращению, так как я хотел бы такого же поведения, как и для обычных щелчков (например, кнопка нажата, пользователь может отменить, оставив кнопку, действие отправляется, когда мышь отпускается и т. д.).

То, что я пробовал до сих пор, это перегрузка -rightMouse {Down, Up, Dragged} , изменение событий, указывающих на щелчки левой кнопкой мыши, и отправка их на -mouse {Down, Up, Dragged} . В лучшем случае это явно было бы взломом, и, как оказалось, Mac OS X все это не нравилось. Я могу нажать на кнопку, но после отпускания кнопка остается нажатой.

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


Прежде чем вы скажете: «Не надо! Это нетрадиционное поведение Mac OS X, и его следует избегать»: я подумал об этом, и щелчок правой кнопкой мыши может значительно улучшить рабочий процесс. В основном кнопка циклически проходит через 4 состояния, и я хотел бы щелкнуть правой кнопкой мыши, чтобы переключить ее в обратном направлении. Это несущественная функция, но было бы неплохо. Если вам все еще хочется сказать «Не надо!», тогда дайте мне знать ваши мысли. Я ценю это!

Спасибо!

РЕДАКТИРОВАТЬ: Это была моя попытка изменить событие (вы не можете изменить тип, поэтому я сделал новый, скопировав всю информацию. То есть, я знаю, что это структура ясно говорит мне «Не делайте этого», но я попробовал, как и вы):

// I've contracted all three for brevity
- (void)rightMouse{Down,Up,Dragging}:(NSEvent *)theEvent {
    NSEvent *event = [NSEvent mouseEventWithType:NSLeftMouse{Down,Up,Dragging} location:[theEvent locationInWindow] modifierFlags:[theEvent modifierFlags] timestamp:[theEvent timestamp] windowNumber:[theEvent windowNumber] context:[theEvent context] eventNumber:[theEvent eventNumber] clickCount:[theEvent clickCount] pressure:[theEvent pressure]];
    [self mouse{Down,Up,Dragging}:event]; 
}

ОБНОВЛЕНИЕ: Я заметил, что -mouseUp: никогда не отправлялся в NSButton, и если я изменил это для NSControl, это было. Я не мог понять, почему это так, пока Фрэнсис МакГрю не указал, что он содержит собственный цикл обработки событий. Теперь это также имело смысл, почему, прежде чем я мог перенаправить -rightMouseDown: , кнопка не поднималась при отпускании. Это связано с тем, что он сам по себе извлекал новые события, и я не мог перехватить и преобразовать события правой кнопки мыши в левую.

5
задан Gustav Larsson 28 April 2011 в 14:44
поделиться