Хэя. Наконец, после долгих потрясений, я получил загруженное .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;
}
...
}
...
}