TrackPopupMenu «Harm» mon HMENU?
-
12-11-2019 - |
Question
Heya. Enfin, après beaucoup de violon, j'ai obtenu un menu contextuel chargé .rc pour mon icône de notification de plateau. (Application API Windows basée sur la boîte de dialogue, pas de MFC). Cependant, dans les différents exemples et démonstrations d'utilisation, j'ai toujours vu que le HMENU
est créé (CreateMenu()
, LoadMenu()
) et détruit (DestroyMenu()
) Juste avant / juste après l'appel à TrackPopupMenu()
. Les menus popup pour notifier les icônes ne sont pas du tout documentés sur MSDN (au moins je n'ai pas trouvé plus d'un seul paragraphe à leur sujet).
Intuitivement, j'ai mis le LoadMenu()
dans le traitement du message pour WM_INITDIALOG
et stocker le HMENU
, donc je n'ai pas à créer et à détruire le menu à chaque fois. Comme je l'ai dit, je n'ai trouvé aucun exemple où cela se fait de la même manière, ce que je trouve un peu intrigant. Est-il possible que mon HMENU
Serait jamais "corrompu" lors de l'utilisation du menu ou de l'application? Ou est-il sûr d'opter pour les performances supplémentaires (enfin, marginales) comme moi?
INT_PTR CALLBACK MainDlg(HWND ..., UINT, WPARAM, LPARAM)
{
switch (message)
{
case WM_INITDIALOG:
...
HMENU hMenuBar = LoadMenu(hInst, MAKEINTRESOURCE(IDR_NOTIFYMENU));
hNotifyMenu = GetSubMenu(hMenuBar, 0);
...
break;
...
case WM_NOTIFYICON:
switch (lParam)
{
case WM_RBUTTONUP: // there is no WM_CONTEXTMENU for
{ // nid.uVersion != NOTIFYICON_VERSION_4
POINT CursorPos;
GetCursorPos(&CursorPos);
// this is where I saw LoadMenu and stuff in examples
SetForegroundWindow(hDlg); // otherwise menu won't disappear
TrackPopupMenu(hNotifyMenu, TPM_LEFTALIGN, CursorPos.x,
CursorPos.y, 0, hDlg, NULL);
PostMessage(hDlg, WM_NULL, 0, 0); // otherwise menu locks hDlg
// this is where I saw DestroyMenu in examples
}
return (INT_PTR)TRUE;
}
...
}
...
}
Pas de solution correcte