2009-12-18 3 views
0

J'ai une interface GUI openGL et j'ai besoin d'un menu contextuel qui sera appelé quand un certain bouton est pressé dans mon affichage openGL. Je veux afficher un menu similaire à celui qui apparaît lorsque vous appuyez sur un NSPopUPButton mais je ne peux pas utiliser le bouton Cocoa lui-même. Il semble que la meilleure façon d'accomplir ceci est d'utiliser NSPopupButtonCell. Je ne peux pas poster mon code ici parce que j'écris le code en Lisp et j'accède au Cocoa via un pont C objectif mais je voulais juste voir si le code pseduo suivant devrait afficher le menu ou s'il y a un défaut évident dans mon logique:Instancier par programme un NSPopUpButtonCell dans Cocoa OSX

• 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. 

Aucune de ces méthodes n'a réussi à afficher un type quelconque de menu. Existe-t-il un autre moyen de faire apparaître par programme le menu contenu dans la cellule?

Répondre

0

Je pense que vous feriez mieux d'utiliser un NSMenu et appelant +[NSMenu popUpContextMenu:withEvent:forView:]. Si vous ciblez seulement 10.6 et plus tard, vous pouvez également vérifier -[NSMenu popUpMenuPositioningItem:atLocation:inView:], ce qui vous donne un peu plus de contrôle sur le positionnement du menu. Implémentez simplement mouseDown: dans votre vue, construisez un menu (ou chargez-le à partir d'un fichier nib), et affichez-le, et NSMenu devrait prendre soin de tous les détails à partir de là. Assurez-vous simplement que la cible et l'action de chaque NSMenuItem sont définies pour que la méthode d'action soit appelée correctement lorsqu'un élément est sélectionné.

+0

Je ciblons des machines qui prennent en charge 10,5 ou ealier donc je ne peux pas utiliser popUpMenuPositioningItem: atLocation: inView: .Aussi j'avais essayé d'utiliser popUpContextMenu: withEvent: forView: mais à cause de tout l'objectif c bridge je n'avais pas de véritable NSEvent donc je devais simuler un évènement souris et pour une raison quelconque j'ignorais le point que je passais dans l'évènement que j'ai créé en utilisant mouseEventWithType: location: modifierFlags: timestamp: windowNumber: context: eventNumber: clickCount: pression: quelles que soient les coordonnées que je passerais au paramètre location, le menu apparaîtrait toujours dans le bas coin gauche – Mike2012

+0

Aussi, il semble que cette méthode n'est pas supportée par cocotron et nous essayons aussi de cibler les fenêtres. – Mike2012

Questions connexes