Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка динамического меню в модальном диалоге, WTL Меню строится во время исполнения... 
V
    Опции темы
zhekha
Дата 11.3.2008, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



По нажатию кнопки из основного окна вызывается модально диалог:
Код

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);


но как я очень скоро выяснил — с модальными диалогами это не прокатывает...
PM MAIL   Вверх
Earnest
Дата 11.3.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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


--------------------
...
PM   Вверх
zhekha
Дата 11.3.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) zhekha - 11.3.2008, 11:12
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0417 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.