windows - Skader TrackPopupMenu min HMENU?

Indlæg af Hanne Mølgaard Plasc

Problem



Heya. Endelig efter en masse fiddling fik jeg en .rc-indlæst kontekstmenu til min tray notify icon arbejde. (Dialogbaseret Windows API-applikation, ingen MFC). I de forskellige eksempler og brugsdemonstrationer har jeg imidlertid altid set, at HMENU bliver oprettet (CreateMenu(), LoadMenu()) og ødelagt (DestroyMenu()) lige før/lige efter opkaldet til TrackPopupMenu(). Popupmenuer til meddelelse af ikoner er ligesom, slet ikke dokumenteret på MSDN (jeg har i det mindste ikke fundet mere end et enkelt afsnit om dem).


Intuitivt sætter jeg LoadMenu() i meddelelseshåndteringen til WM\_INITDIALOG og gemmer HMENU, så jeg behøver ikke at oprette og ødelægge menuen hver gang. Som sagt sagde jeg Der er ikke fundet nogen eksempler, hvor dette gøres på samme måde, som jeg finder lidt spændende. Er det muligt, at min HMENU nogensinde vil blive 'ødelagt', mens du bruger menuen eller applikationen? Eller er det sikkert at gå til (godt, marginalt) ekstra ydeevne som jeg gør?


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;
        }
        ...
    }
    ...
}

Bedste reference


Det er ikke, at det bliver ødelagt, det er mere, at du ikke vil holde GDI ressourcer længere end absolut nødvendigt. Du kan nemt løbe tør for dem, bare kig på Chrome, der kæmpede med GDI ressourcegrænser i måneder før endelig finde et arbejde rundt.


Udover at læse en menu er et dusin gange og ødelægger det intet til en moderne processor. Ikke optimer programmer for tidligt, især ikke for så lidt gevinst.


Hvad angår hvorfor du ikke har fundet nogen MSDN-sider, der beskæftiger sig specifikt med underretningsikonerne 'menuer, det er fordi de' er to separate ting. En menu er en menu, uanset om den er øverst på en dialog, dukker op, når du højreklikker på en tekstboks eller når du højreklikker på et meddelelsessymbol. Du har heller ikke brug for specielle råd eller kode til.