2010-03-10 9 views
2

Je suis en train de créer un menu contextuel dynamique au sein de mon application, est quelque chose comme le code de génération J'utilise que:vide Menu Popup Win32

HMENU menu; 
    POINT pt; 

    menu = CreatePopupMenu(); 

    SetForegroundWindow(receivingWindow); 
    GetCursorPos(&pt); 
    int i = 19; 
    AppendMenu(menu, MF_STRING, i++, _TEXT("meh meh")); 
    AppendMenu(menu, MF_STRING, i++, _TEXT("testo")); 
    AppendMenu(menu, MF_STRING, i++, _TEXT("foobar foobar")); 
    TrackPopupMenuEx(menu 
        , 0 
        , pt.x, pt.y 
        , receivingWindow 
        , NULL); 

    DestroyMenu(menu); 

_TEXT est utilisé pour assurer le texte est en Unicode et receivingWindow est une fenêtre en couches créée avant et fonctionnant bien.

Lorsque vous appelez TrackPopupMenuEx le menu est affiché avec la bonne taille et à la bonne position, mais absolument aucun texte n'apparaît dans le menu contextuel. Est-ce que quelqu'un a eu une idée pourquoi, et comment résoudre ce problème?

EDIT: plus d'informations sur mon environnement:

  • Windows 7 x64 x86
  • construire dans Visual Studio 2008

EDIT2: Je l'ai testé le même sous Windows XP x86, et cela fonctionne comme un charme, et après un autre test, le menu est bien affiché dans Windows 7 x64 avec le look classique.

+0

Vous ne définissez aucune valeur dans le paramètre fuFlags de TrackPopupMenuEx(). Essayez de spécifier des options d'alignement et de souris. Cela pourrait l'aider à mieux décider comment se comporter. –

+0

Même avec fuFlags, aucun texte affiché. –

Répondre

0

J'ai trouvé une solution de contournement pour ce problème. Au lieu d'utiliser ma fenêtre principale (receivingWindow), j'utilise une fenêtre de message uniquement pour recevoir l'événement. Pour une raison que je ne comprends pas, le texte est affiché normalement de cette façon.

0

Si votre compilateur n'est pas configuré pour la compilation pour unicode (par exemple #ifndef UNICODE) alors winuser.h mappera AppendMenu à AppendMenuA qui est une version non-unicode et interpréterait vos chaînes comme multi-octets. Peut-être cela explique-t-il votre problème? Vous pouvez explicitement appeler AppendMenuW() (la version Unicode) pour vérifier si c'est votre problème.

+0

Malheureusement, UNICODE est déjà défini et AppendMenuW est bien appelé. –

+0

_TEXT() est également affectée par la présence ou l'absence de définition UNICODE.Si UNICODE n'est pas défini, AppendMenu() correspond à AppendMenuA(), mais le texte à l'intérieur de _TEXT() correspond également à Ansi au lieu d'Unicode. Donc, il n'y a pas de conflit ici. –

0

Je crois que le problème est que la fonction TrackPopUpMenuEx ne retourne pas immédiatement; Ainsi, après avoir initié (et probablement choisi sa taille et sa position), mais avant la première affiche, vous détruisez le menu. Si je comprends bien, vous devez détruire le menu après que votre fenêtre a reçu le message de commande d'une sélection de menu. Utilisez alternativement l'indicateur TPM_RETURNCMD dans TrackPopUpMenuEx car cela oblige trackpopupex à revenir uniquement après la sélection d'un élément de menu (par opposition à immédiatement).

+0

Lorsque je place un point d'arrêt sur DestroyMenu, il ne se casse qu'après avoir cliqué sur un élément vide du menu. Encore une fois je peux voir le menu, le texte est juste invisible :( –

2

Assurez-vous que :: DefWindowProc() est appelée pour les messages qui ne sont pas traités autrement. J'ai rencontré un problème similaire avec TrackPopupMenu() où le menu apparaissait avec la taille correcte et autorisait la sélection d'éléments, mais il n'y avait pas de texte sur les éléments car le code ignorait certains messages sans appeler :: DefWindowProc().

+0

Ne l'a pas aidé :-( – Lothar

0

Essayez:

call GetSubMenu,mnu,0 
call TrackPopupMenu,eax,TPM_CENTERALIGN or TPM_BOTTOMALIGN,cposx,cposy,0,MainhWnd,0 
0

Dans mon cas, j'ai créé le menu avec "CreateMenu" mais je dois utiliser "CreatePopupMenu" pour l'utiliser avec TrackPopupMenuEx.

Si le menu est créé dans l'éditeur de ressources, vérifiez si l'indicateur est activé.

Questions connexes