2010-07-18 8 views
0

Je suis en train de créer le menu contextuel en utilisant la fonction TrackPopupMenu dans mon application, le code que j'utilise dans c'est comme ce qui suit:Problèmes avec l'utilisation TrackPopupMenu sur win7

CMenu menu; 
     if (menu.LoadMenu(IDR_MENU_TRAY)) 
     { 
      CMenu* pSubMenu = menu.GetSubMenu(0); 
      if (pSubMenu != NULL) 
      { 
       pSubMenu->ModifyMenu(IDM_CLOSE,MF_BYCOMMAND,IDM_CLOSE ,g_cfg->GetLang(TEXT_MAIN_CLOSE,"Exit(&X)")); 
       pSubMenu->ModifyMenu(IDM_SHOW,MF_BYCOMMAND,IDM_SHOW ,g_cfg->GetLang(TEXT_MAIN_OPEN_SHUTTER,"Open(&O)")); 
       CPoint point; 
       GetCursorPos(&point);                 
       SetForegroundWindow(); 
       pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, messageOnlyWnd); 
      } 
     } 

Le code fonctionne parfaitement sur Windows XP, alors que sur Win7 et Vista, il ne le fait pas. Le problème sur win7 et Vista est qu'il faut un peu de temps pour afficher le menu, peut-être 1 min ou plus. Mais si j'éteins l'Aero sur win7 ou vista, ça fonctionne bien comme sur winXP, donc je suppose que quelque chose doit être en conflit avec Aero dans le code, mais je ne sais pas comment le réparer. Est-ce que quelqu'un peut m'aider avec ça? J'apprécierai beaucoup si quelqu'un m'aide.

Répondre

0

Je ne vois rien de mal avec ce code. J'ai utilisé TrackPopupMenu sur Vista sans aucun problème. La source du problème pourrait être ailleurs. Essayez de supprimer l'appel au SetForegroundWindow. Si cela ne fonctionne pas, essayez de créer un projet vide avec seulement le code du menu contextuel.

+0

Merci pour votre réponse. J'ai essayé comme vous l'avez suggéré, mais le problème est toujours là. Créer un projet vide avec juste le code du menu contextuel fonctionne correctement sur win7 avec Aero activé. Dans mon application, même afficher un menu lorsque le clic droit dans un contrôle CEdit prend beaucoup de temps pour le menu à afficher. Mais quand l'Aero est éteint, tout est OK. En plus, je n'ai pas utilisé d'autres libs ou de code à part la fonction TrackPopupMenu lors de la création d'un menu contextuel, donc je suis confus avec ça depuis pas mal de temps. Il me rend fou!! – AJAY

+0

Il est difficile de diagnostiquer plus loin sans regarder le reste de votre code. Votre application effectue-t-elle un traitement en arrière-plan dans le thread principal? Cela pourrait ralentir l'interface graphique. – casablanca

+0

Il effectue un traitement en arrière-plan, mais ce que je ne comprends pas, c'est qu'il fonctionne correctement sur WinXP et Win7 avec Aero désactivé, mais pas avec Win7 avec Aero lors de la création d'un menu contextuel. Donc je suppose qu'il peut y avoir quelque chose de conflictuel entre l'Aero dans Win7 et la fonction TrackPopupMenu. J'ai aussi mis quelques points d'arrêt dans mon code en utilisant VS2003, j'ai trouvé que les autres lignes marchaient sans heurt, sauf la ligne avec TrackPopupMenu, qui prend jusqu'à 1min pour finir! – AJAY