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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top