2013-04-30 5 views
0

Я использую этот код, чтобы иметь два разных поведения при нажатии правой или левой кнопки меню.NSEvent click right menu

Щелкните левой кнопкой мыши и щелкните правой кнопкой мыши + cmd.

Как я могу щелкнуть правой кнопкой мыши, не нажимая cmd + клик самым простым способом?

-(void)awakeFromNib { 

NSImage *image = [NSImage imageNamed:@"menubar"]; 
NSImage *alternateImage = [NSImage imageNamed:@"menubar-white"]; 

statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; 
[statusItem setHighlightMode:YES]; 
[statusItem setImage:image]; 
[statusItem setAlternateImage:alternateImage]; 
[statusItem setAction:@selector(show)]; 
} 


- (void)show { 

NSLog(@"call show"); 

NSEvent *event = [NSApp currentEvent]; 
//Respond to the mouse click 
if ([event modifierFlags] & NSCommandKeyMask) //Command 
{ 
    NSLog(@"RIGHT"); 
    [statusItem setMenu:statusMenu]; 
} 
else { 
    NSLog(@"LEFT"); 
    //open window 
} 
} 

menu click right

Спасибо за вашу помощь!

ответ

3

Осмотрите [NSEvent pressedMouseButtons] вместо флажков-модификаторов. Пусть система позаботится о том, какая кнопка нажата. Если вы сделаете это так, как вы сейчас это делаете, вы получите странное поведение для пользователей, которые на самом деле используют мыши с несколькими кнопками.

Вы должны быть в состоянии использовать что-то вроде этого:

const NSUInteger pressedButtonMask = [NSEvent pressedMouseButtons]; 
const BOOL leftMouseDown = (pressedButtonMask & (1 << 0)) != 0; 
const BOOL rightMouseDown = (pressedButtonMask & (1 << 1)) != 0; 
+0

Что-то вроде этого? - (void) show { NSUInteger нажатаButtonMask = [NSEvent нажатаMouseButtons]; BOOL leftMouseDown = ((нажатоButtonMask & (1 << 0)))! = 0; // BOOL rightMouseDown = ((нажатоButtonMask & (1 << 1)))! = 0; if (leftMouseDown) { NSLog (@ "left"); } } – Joannes

+0

Да, я думаю, что это сработает. Честно говоря, я не тестировал этот код, но думаю, что он выполнит эту работу на основе документации в NSEvent.h. Еще одна вещь, о которой я действительно должен был упомянуть, заключается в том, что если вы работаете с классом, который наследуется от 'NSResponder', вы можете реализовать метод mouseDown для захвата левых мысок мыши и метода rightMouseDown для захвата правой мыши , –

+0

Сообщения объектам Objective-C не могут быть постоянными (ну, тип может, как и у вас, но результаты метода не могут) из-за характера динамической отправки. – CodaFi

4

Я не согласен с Аароном. В общем, вам следует избегать проверки мгновенного состояния мыши или клавиатуры. Возможно, это изменилось за время, прошедшее с момента действия, на которое вы на самом деле должны отвечать. Например, если пользователь щелкнет левой кнопкой мыши и затем отпустит кнопку мыши, +pressedMouseButtons может вернуть 0 к моменту, когда ваш код приблизится к его вызову.

Вместо этого вы должны изучить событие, вызвавшее текущую обработку. Для левого клика вы получите событие, type - NSLeftMouseDown. Для правого клика вы получите NSRightMouseDown. Если вы уже знаете, что у вас есть какое-то событие щелчка мыши и по какой-то причине не хотите изучать его тип, вы можете изучить его свойство buttonNumber.

Фактически, что вызвало ваш метод -show? Я ожидаю, что вы внедрили метод NSResponder-mouseDown:. Если это так, это соответствует щелчку левой кнопкой мыши. Если пользователь щелкает правой кнопкой мыши, вызывается другой метод (-rightMouseDown:). Таким образом, вы должны, как правило, кодировать эти два метода по-разному, если вам нужен другой ответ.

+0

Мне нужно меню с правым щелчком и действием слева. Не могли бы вы показать мне пример, если это возможно? Теперь мой код работает только в первый раз, но если я удалю [statusItem setMenu: statusMenu]; работает правильно!Спасибо – Joannes

+0

Я думаю, что для этого вам нужно установить 'view' элемента статуса, и ваше представление рисуется так, как вы хотите. Если вы хотите, чтобы он выглядел как стандартный элемент статуса, это может быть так же просто, как просто рисовать изображение в вашем '-drawRect:' или оно может быть более привлекательным, чем это. Я не знаю, я никогда не пробовал. Во всяком случае, как только вы используете настраиваемое представление, вы контролируете, когда он отображает меню. Не устанавливайте свойство 'menu'. Скорее, вызовите '-popUpStatusItemMenu:' в любых условиях, которые вы хотите (например, в '-rightMouseDown:'). –

+0

Да, нужно настроить пользовательский вид элемента статуса. Это отличный пример: [http://mayfleet.com/2012/12/11/custom-status-bar-item/](http://mayfleet.com/2012/12/11/custom-status-bar -item /) Спасибо! – Joannes