Программная реализация NSPopUpButtonCell в Какао OSX - PullRequest
0 голосов
/ 18 декабря 2009

У меня есть графический интерфейс openGL, и мне нужно всплывающее меню, которое будет вызываться при нажатии определенной кнопки на моем дисплее openGL. Я хочу отобразить меню, подобное тому, которое появляется при нажатии кнопки NSPopUP, но я не могу использовать саму кнопку Какао. Кажется, что лучший способ сделать это - использовать NSPopupButtonCell. Я не могу опубликовать свой код здесь, потому что я пишу код на Лиспе и получаю доступ к Какао через объективный мост C, но я просто хотел посмотреть, будет ли следующий псевдо-код отображать меню или есть очевидный недостаток логика:

• Pseudo Code for function that is called when button is pressed:
• Initialize an NSPopUpButtonCell Using initTextCell: "test" pullsDown: NO
• allocate an NSMenu using alloc
• add two menu items using addItem:
• set the menu of the popUpButtonCell to be the menu that was just allocated using setMenu:
• Next I tried two methods to try and get the menu to actually be displayed,
  first I tried using drawWithFrame:inView: and when that did not work I also tried 
  using drawBezelWithFrame:inView: eventhough the docs said not to use but I just 
  tried it out of desperation.
• finally, when the draw methods did not work I tried using performClick: on the 
  popupButtonCell to try and simulate the click.

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

Ответы [ 2 ]

3 голосов
/ 18 декабря 2009

Я думаю, что вы ищете trackMouse:inRect:ofView:untilMouseUp: метод NSCell

[theCell trackMouse:[NSApp currentEvent] inRect:NSZeroRect ofView:theView untilMouseUp:YES];
0 голосов
/ 18 декабря 2009

Я думаю, вам лучше использовать простую NSMenu и звонить +[NSMenu popUpContextMenu:withEvent:forView:]. Если вы нацеливаетесь только на 10.6 и выше, вы также можете проверить -[NSMenu popUpMenuPositioningItem:atLocation:inView:], что дает вам немного больше контроля над позиционированием меню. Просто внедрите mouseDown: в своем представлении, создайте меню (или загрузите его из файла пера) и отобразите его, и NSMenu должен позаботиться обо всех деталях. Просто убедитесь, что цель и действие для каждого NSMenuItem установлены так, чтобы метод действия вызывался правильно при выборе элемента.

...