Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Обработка динамического меню в модальном диалоге


Автор: zhekha 11.3.2008, 06:31
По нажатию кнопки из основного окна вызывается модально диалог:
Код

class CTelDirDlg :
public CDialogImpl<CTelDirDlg>,
public CWinDataExchange<CTelDirDlg>{ <...> }

У диалога по событитю создается динамически всплывающее меню и показывается пользователю:
Код

CMenu pMenu;
pMenu.CreatePopupMenu();
UINT_PTR i = ID_FIRST_MENU_ITEM;
for(TelList::iterator iter = telList->begin(); iter != telList->end(); iter++) {
// строим строку item
pMenu.AppendMenu(MF_STRING, i++, (LPCTSTR)item);
}
CPoint posMouse;
GetCursorPos(&posMouse);
pMenu.TrackPopupMenu(0, posMouse.x, posMouse.y, m_hWnd);

Заранее неизвестно количество строк создаваемого меню.

Задача: обработать выбор опции меню.

Был вариант с PreTranslateMessage:
Код

// На открытие окна диалога
_Module.GetMessageLoop()->AddMessageFilter(this);

BOOL CTelDirDlg::PreTranslateMessage(MSG *pMsg) {

  if (pMsg->message == WM_COMMAND && LOWORD(pMsg->wParam) >= ID_FIRST_MENU_ITEM) {

  int idx = LOWORD(pMsg->wParam) — ID_FIRST_MENU_ITEM;
  // обрабатываем...
  EndDialog(IDOK);
  return TRUE;
  }

  return IsDialogMessage(pMsg);
}

// На закрытие окна диалога
_Module.GetMessageLoop()->RemoveMessageFilter(this);


но как я очень скоро выяснил — с модальными диалогами это не прокатывает...

Автор: Earnest 11.3.2008, 10:25
Да просто вызывай TrackPopupMenu с флагом TPM_RETURNCMD: тогда меню обрабатывается модально, т.е. не происходит возврата, пока пользователь чего-нибудь не выбрал, а возвращается 0 (если отмена) или идентификатор выбранной команды.

Автор: zhekha 11.3.2008, 11:11
Пол дня просидел в поисках по форумам решения... а ответ оказался под носом - в msdn справке по trackpopupmenu...
Спасибо, большое за ответ!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)