2016-03-16 4 views
1

Je tente de faire actuellement quelque chose de simple:C++ CMenu Dessin de manière incorrecte (non personnalisée)

CMenu menu; 
menu.LoadMenu(IDR_MENU_IMAGE); 
CPoint pt; 
GetCursorPos(&pt); 
menu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); 

Lorsque je clic droit, je reçois l'image ci-dessous. Cependant, le menu est chargé; lorsque je déplace mon curseur dans le menu, vous pouvez le voir remplir correctement les sous-menus. Il le fait avec n'importe quel menu que je charge dynamiquement comme ça. J'ai essayé de créer un pointeur (CMenu *) et continue toujours d'avoir ce problème.

Les points n'ont pas d'importance (j'ai entré des points arbitraires).

Le "ceci" en question est une classe CView * dérivée. Je suis en train de cliquer sur un objet HWND mais j'ai aussi essayé de prendre le CWnd :: FromHandle() de cet objet particulier sur lequel je clique et que l'objet le gère, mais j'ai toujours le même problème.

Ma structure de menu principal et tous les autres menus fonctionnent - c'est seulement dans ce cas particulier.

Je ne veux pas vraiment dériver une classe C++ CMenu juste pour remplacer la fonction MeasureItem lorsque les menus originaux doivent effectivement travailler, et ne fonctionnent très bien dans d'autres versions ..

aide?

enter image description here

+0

L'image que vous avez affichée ne correspond pas vraiment le contenu de votre question. –

+0

Vous ne savez pas ce que vous voulez dire en plus de ne pas mentionner un menu presque vide. Cependant, j'ai compris que le problème était simplement que j'ai oublié d'inclure une option sans nom comme le premier menu selon https://msdn.microsoft.com/en-us/library/k5az22fk.aspx. – RootAtShell

+0

Je veux dire que l'image contient principalement de la malbouffe et peut-être 1/3 d'un menu. –

Répondre

2

Utilisez GetSubMenu(0) pour obtenir une poignée de pop-up:

CMenu menu; 
menu.LoadMenu(IDR_MENU_IMAGE); 
CMenu *submenu = menu.GetSubMenu(0); 
if (submenu) 
    submenu->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); 

IDR_MENU_IMAGE est créé dans l'éditeur de ressources similaire à ce qui suit:

IDR_MENU_IMAGE MENU 
BEGIN 
    POPUP "File" 
    BEGIN 
     MENUITEM "New",       ID_FILE_NEW 
     MENUITEM "Open",      ID_FILE_OPEN 
     MENUITEM "Save",      ID_FILE_SAVE 
     MENUITEM "Save As ...",     ID_FILE_SAVEAS 
    END 
END 

Résultat:

enter image description here

Notez que cela ne fonctionnera pas s'il n'y a qu'une "barre de menu" et aucun popup. Le menu ci-dessous ne peut pas être créé comme pop-up:

IDR_MENU_IMAGE MENU //no popup menu! 
BEGIN 
    MENUITEM "A", IDA 
    MENUITEM "B", IDB 
    MENUITEM "C", IDC 
END 


Vous pouvez également créer le menu contextuel comme suit:

CMenu menu; 
menu.CreatePopupMenu(); 
menu.AppendMenu(MF_STRING, ID_FILE_NEW, "New"); 
menu.TrackPopupMenu(TPM_RIGHTBUTTON, p.x, p.y, this); 
+0

En fait, après cela, je me suis rendu compte que le vrai problème n'était rien lié aux poignées, etc. - c'était simplement que j'avais besoin d'avoir une option sans nom dans le menu selon https://msdn.microsoft.com /en-us/library/k5az22fk.aspx pour être une fenêtre pop-up. En faisant cela, j'ai été en mesure de résoudre le problème. – RootAtShell