Проблема с PopupMenu
От: Аноним  
Дата: 21.02.11 15:22
Оценка:
Нужно показать для иконки в трее локальное меню. Пробовал сделать так:
   HMENU hMenu = CreatePopupMenu();
   MENUITEMINFO mi;
   memset( &mi, 0, sizeof(MENUITEMINFO) );
   mi.cbSize = sizeof(MENUITEMINFO);
   mi.fType = MFT_STRING;
   mi.fMask = MIIM_ID|MIIM_TYPE;

   mi.cch = 1;
   mi.wID = 1;
   mi.dwTypeData = "1";
   InsertMenuItem( hMenu, 0, FALSE, &mi );
   mi.wID = 2;
   mi.dwTypeData = "2";
   InsertMenuItem( hMenu, 0, FALSE, &mi );

   POINT pos;
   GetCursorPos( &pos );
   UINT cmd = ::TrackPopupMenuEx( hMenu, TPM_NONOTIFY|TPM_RETURNCMD, pos.x, pos.y, mWindow, NULL );
   DestroyMenu( hMenu );

Меню показывается, при выборе закрывается и возвращает корректный результат.
Но никак нельзя отказаться от выбора, т.е. по Esc и по клику вне меню оно не закрывается, кроме того аналогично перестают закрываться меню других приложений.
Как сделать возможность отказа от выбора?
Re: Проблема с PopupMenu
От: Baskak Россия  
Дата: 21.02.11 17:01
Оценка: +1
Не судьба справку по TrackPopupMenu() прочитать? И ремарк к ней.

Там английским по белому написано: "To display a context menu for a notification icon, the current window must be the foreground window before the application calls TrackPopupMenu or TrackPopupMenuEx".

А вот пример из этой самой стправки:

SetForegroundWindow(hDlg); // <-- тут
TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hDlg, NULL);
PostMessage(hDlg, WM_NULL, 0, 0);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.