Обработка динамического меню в модальном диалоге
От: Женя Россия  
Дата: 07.03.08 11:17
Оценка:
По нажатию кнопки из основного окна вызывается модально диалог:
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:

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

но как я очень скоро выяснил — с модальными диалогами это не прокатывает...
Re: Обработка динамического меню в модальном диалоге
От: Boss Россия http://alex-boss.narod.ru
Дата: 19.03.08 10:23
Оценка:
Здравствуйте, Женя, Вы писали:

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

Самый простой способ:

UINT_PTR cmdRet = (UINT_PTR)pMenu.TrackPopupMenu(TPM_RETURNCMD, posMouse.x, posMouse.y, m_hWnd);


MSDN:
If you specify TPM_RETURNCMD in the uFlags parameter, the return value is the menu-item identifier of the item that the user selected. If the user cancels the menu without making a selection, or if an error occurs, then the return value is zero.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.