[MFC/C++] Créer un menu+gérer les évenements du menu [résolu]

Créer un menu+gérer les évenements du menu [résolu] [MFC/C++] - C++ - Programmation

Marsh Posté le 02-05-2003 à 09:35:10    

Je travaille sous VC++ 6.
J'essaie de créer un menu (un popupmenu) accessible gràca au click droit sur le trayicon.
Voici mon code :  
 

Code :
  1. LRESULT CPremiereAppliDlg::OnTrayMessage(WPARAM wParam, LPARAM lParam)
  2. {
  3.   if (lParam == WM_RBUTTONDOWN)
  4.   {
  5. // bouton droit enfoncé
  6. CMenu  menu;
  7. CPoint pt;
  8. GetCursorPos(&pt);
  9. //création d'un menu
  10. menu.CreateMenu();
  11. menu.AppendMenu(MF_STRING,IDM_OPENDLG,"Ouvrir..." );
  12. menu.AppendMenu(MF_STRING,IDM_PARAM,"Paramètres avancés." );
  13. menu.AppendMenu(MF_SEPARATOR);
  14. menu.AppendMenu(MF_STRING,IDM_QUITTER,"Fermer l'application." );
  15. CMenu * m = menu.GetSubMenu(0);
  16. //if (!menu.LoadMenu(IDR_MENUTRAY)) //ne s'applique pas  
  17.                                             //s'il y a  
  18.                                             //création d'un  
  19.                                             //menu manuellement
  20. // return 0;
  21. CMenu* m = menu.GetSubMenu(0);
  22. if (!m) 
  23.  return 0;
  24. //MessageBox("Salut","Salut",MB_OK);
  25.     ::SetForegroundWindow(m_hWnd); //nécessaire, cause bug windows
  26.     m->TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this);
  27.     :: PostMessage(m_hWnd, WM_NULL, 0, 0);
  28.   }
  29. }
  30. ...


 
Ca ne marche pas. Le programme sort une erreur lorsque je fais un click droit.
Je suis débutant en C++, même en objet (on peut le dire), mais j'ai du mal à comprendre ces erreurs.
La première chose que j'avais tenté était d'appeler un menu créer grâce à Visual C++, mais il y avait une erreur à l'appel de ce menu (le programme n'associait pas l'ID du menu au menu lui même :??:).
 
Voila, si vous pouvez m'aider, c'est cool. Merci d'avance :jap:


Message édité par backdafuckup le 02-05-2003 à 11:44:42
Reply

Marsh Posté le 02-05-2003 à 09:35:10   

Reply

Marsh Posté le 02-05-2003 à 09:45:05    

voila un vieux code : (c pas en mfc, mais ca devrait pas t'empecher de l'utiliser)
 

Code :
  1. // clik droit : menu
  2. HMENU hMenu = CreatePopupMenu();
  3. AppendMenu(hMenu, MF_STRING, ID__PARTAGES, (LPCTSTR)"Partages" );
  4. AppendMenu(hMenu, MF_STRING, ID__OUVRIR, (LPCTSTR)"Ouvrir" );
  5. AppendMenu(hMenu, MF_STRING, ID__RETIRER, (LPCTSTR)"Retirer" );
  6. POINT pt;
  7. GetCursorPos(&pt);
  8. UINT res = TrackPopupMenu(hMenu, TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_LEFTALIGN, pt.x, pt.y, NULL, m_hWnd, NULL);
  9. DestroyMenu(hMenu);

Reply

Marsh Posté le 02-05-2003 à 09:55:19    

Konar a écrit :

voila un vieux code : (c pas en mfc, mais ca devrait pas t'empecher de l'utiliser)
 

Code :
  1. // clik droit : menu
  2. HMENU hMenu = CreatePopupMenu();
  3. AppendMenu(hMenu, MF_STRING, ID__PARTAGES, (LPCTSTR)"Partages" );
  4. AppendMenu(hMenu, MF_STRING, ID__OUVRIR, (LPCTSTR)"Ouvrir" );
  5. AppendMenu(hMenu, MF_STRING, ID__RETIRER, (LPCTSTR)"Retirer" );
  6. POINT pt;
  7. GetCursorPos(&pt);
  8. UINT res = TrackPopupMenu(hMenu, TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_LEFTALIGN, pt.x, pt.y, NULL, m_hWnd, NULL);
  9. DestroyMenu(hMenu);




 
 
Merci, mais j'ai toujours le meme problème (j'ai pas d'erreurs, mais le menu ne s'affiche tout de meme pas... :/)
 
D'autres idées ?? (Up topic, Up :bounce:)

Reply

Marsh Posté le 02-05-2003 à 10:00:38    

backdafuckup a écrit :


 
 
Merci, mais j'ai toujours le meme problème (j'ai pas d'erreurs, mais le menu ne s'affiche tout de meme pas... :/)
 
D'autres idées ?? (Up topic, Up :bounce:)


 
t'es sur que le code est éxécuté ? paske bon, c'est censé marcher partout...
 
sinon teste la valeur de retour de TrackPopupMenu() ou des autres fonctions...

Reply

Marsh Posté le 02-05-2003 à 10:21:15    

Bon, j'ai trouvé, à force de modifications (et merci à Konar aussi :)).
Pour information voici le résultat :
 

Code :
  1. // bouton droit enfoncé
  2. CMenu  menu;
  3. CPoint pt;
  4. GetCursorPos(&pt);
  5. //création d'un menu
  6. menu.CreatePopupMenu();
  7. menu.AppendMenu(MF_STRING,IDM_OPENDLG,"Ouvrir..." );
  8. menu.AppendMenu(MF_STRING,IDM_PARAM,"Paramètres avancés." );
  9. menu.AppendMenu(MF_SEPARATOR);
  10. menu.AppendMenu(MF_STRING,IDM_QUITTER,"Fermer l'application." );
  11. menu.SetDefaultItem(0,TRUE);
  12. ::SetForegroundWindow(m_hWnd);
  13. UINT res = TrackPopupMenu(menu, TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_LEFTALIGN, pt.x, pt.y, NULL, m_hWnd, NULL);
  14. ::SetForegroundWindow(m_hWnd); //nécessaire, cause bug windows
  15. :: PostMessage(m_hWnd, WM_NULL, 0, 0);
  16. DestroyMenu(menu);


 
Encore merci à Konar :jap:
 
Autre question : Comment gère-t-on les évenements générés par le menu ? :jap:

Reply

Marsh Posté le 02-05-2003 à 10:24:48    

Ah, oubliez ma question, j'ai trouvé...
C'était une question con, j'aurais du plus réfléchir...
 
Merci Konar (... euh... bon ok http://banguy.free.fr/smileys/bide.gif)

Reply

Marsh Posté le 02-05-2003 à 10:32:28    

Par contre, question :  
 
L'evenement Click sur une des entrées du popupmenu est il le meme que l'evenement COMMAND ???

Reply

Marsh Posté le 02-05-2003 à 11:08:02    

backdafuckup a écrit :

Par contre, question :  
 
L'evenement Click sur une des entrées du popupmenu est il le meme que l'evenement COMMAND ???


 
faut lire un peu plus les man...
 
le retour de TrackPopupMenu (ajouter le flag TPM_RETURNCMD) permet de te dire sur quoi le gars a cliqué ds le menu. Si le retour est 0, pas de selection, sinon ca retourne l'id ke t'as spécifié dans AppendMenu().

Reply

Marsh Posté le 02-05-2003 à 11:20:30    

Konar a écrit :


 
faut lire un peu plus les man...
 
le retour de TrackPopupMenu (ajouter le flag TPM_RETURNCMD) permet de te dire sur quoi le gars a cliqué ds le menu. Si le retour est 0, pas de selection, sinon ca retourne l'id ke t'as spécifié dans AppendMenu().


 
Je te remercie, j'avais pas vu que tu avais répondu, mais j'ai trouvé depuis un moment en fait... J'ai pas assez réflechi.
Je te remercie pour le temps accordé :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed