TrackPopupMenu "вредит" моему HMENU? - PullRequest
1 голос
/ 25 марта 2011

Хэя. Наконец, после долгих потрясений, я получил загруженное .rc контекстное меню для работы иконки уведомлений в трее. (Диалоговое приложение Windows API, без MFC). Однако в различных примерах и демонстрациях использования я всегда видел, что HMENU создается (CreateMenu(), LoadMenu()) и уничтожается (DestroyMenu()) непосредственно до / сразу после вызова TrackPopupMenu(). Всплывающие меню для значков уведомлений, например, совсем не задокументированы в MSDN (по крайней мере, я не нашел более одного абзаца о них).

Интуитивно, я помещаю LoadMenu() в обработку сообщений для WM_INITDIALOG и сохраняю HMENU, поэтому мне не нужно каждый раз создавать и уничтожать меню. Как я уже сказал, я не нашел ни одного примера, где это делается аналогичным образом, что я нахожу немного интригующим. Возможно ли, что мой HMENU когда-либо "испортился" при использовании меню или приложения? Или безопаснее пойти на (ну, предельно) дополнительную производительность, как я?

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

1 Ответ

2 голосов
/ 25 марта 2011

Дело не в том, что он поврежден, а в том, что вы не хотите хранить ресурсы GDI дольше, чем это абсолютно необходимо. Вы можете легко исчерпать их, просто посмотрите на Chrome, который боролся с ограничениями ресурсов GDI в течение нескольких месяцев, прежде чем наконец-то нашел решение.

Помимо загрузки меню в десятки раз и уничтожения, это ничего не значит для современного процессора дня. Не стоит преждевременно оптимизировать программы, особенно если это не так выгодно.

Что касается того, почему вы не нашли ни одной страницы MSDN, посвященной меню значков уведомлений, это потому, что это две разные вещи. Меню - это меню, находится ли оно в верхней части диалогового окна, всплывающее при щелчке правой кнопкой мыши на текстовом поле или при щелчке правой кнопкой мыши на значке уведомления. Вам не нужен специальный совет или код для.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...