![]() |
|
|
![]()
|
|
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
Есть системное меню. Хочу динамически(run time) загружать в него строки. Сразу встает вопрос, если можно, то как быть с обработкой выбора этих строк пользователем ?
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
По крайней мере, в MSDN написано, что можно. Насчет ид-ров вопрос интересный (вроде перечень комманд зафиксирован). Надо, видимо, пробовать.
-------------------- ... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
Earnest,
Знаю... но надо их загрузить таким образом, чтобы использовать, как нормальные select варианты. Иначе, зачем ещё меню ? Добавлено @ 15:32 Я просто не могу представить... неужели вместе с ON_COMMAND как номер элемента меню приходит что-то типа IDC_NULL_MENU+i, где i - номер выбранного элемента ? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Во-первый, приходит WM_SYSCOMMAND, а не WM_COMMAND, во-вторых, не номер, а идентификатор. Посмотри описание OnSysCommand...
Вроде ничего крамольного в добавлении своих элементов нет. Только следи, что их ID не пересекались со стандартными CS_XXX. Там еще написано, что нестандартные ид-ры нельзя пускать в стандартный обработчик. -------------------- ... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
Earnest,
Спасибо, натолкнула на мысль... То есть я перегружаю OnSysCommand, где обрабатываю SC_MOUSEMENU ? В lParam тогда там будет идентификатор выбранного пункта меню ? Добавлено @ 14:43 А нет... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не перегружаешь, а просто пишешь (и добавляешь в карту обработчиков) - это ведь не виртуальный метод.
И не lParam, а ID. -------------------- ... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
Сделал так:
Как здесь мне отловить нажатие на конкретный пункт конкретного submenu системного menu ? В lPar содержится x и y координаты указателя мыши, так ? Мне нужен идентификатор. Добавлено @ 19:34 Кстати Earnest, спасибо, что помогаешь. Добавлено @ 19:38 кстати понравилось, как ИМХО такую проблему решают в си-шарпе: http://www.progs.biz/csharp/win/lessons/008.aspx Гибко.......... Это сообщение отредактировал(а) En_t_end - 12.12.2006, 19:51 |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 2 Всего: 47 |
Как вариант, меню можно читать из xml файл.
|
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
bel_nikita,
Не понял... Добавлено @ 20:00 У меня ещё есть более удачный вариант: ON_MESSAGE(WM_MENUSELECT,OnWMMenuSelect)
Но фишка в том, что если убрать условие HIWORD(wPar) == MF_MOUSESELECT то просто наведя на пункт у меня сработает MessageBox("ok"); А мне нужно именно после нажатия на нём левой кнопкой мышки. Добавлено @ 20:02 А само MF_MOUSESELECT у меня при всевозможных ухищрениях так и не вылезло, как с ним работать, вопрос ? |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 2 Всего: 47 |
А как добавляешь меню?
Если не ошибает память, там же ID пункта меню нужно указывать. Т.е. ID меню у тебя есть, а на их можно повесить свои хандлеры: std::map<ID,pFunc> Можно сделать один мегаобработчик:
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Стоп, какой еще MenuSelect?
Меню-селект срабатывает, при выделении соответствующего пункта меню, а не при выборе, это для вывода подсказок. Тебе нужно именно WM_SYSCOMMAND. Есть же стандартный макрос для обработчика WM_SYSCOMMAND: ON_WM_SYSCOMMAND. Соответствующий обработчик должен иметь имя и сигнатуру afx_msg void OnSysCommand (UINT nID, LPARAM lPar); В конце его, если не обработал команду, просто вызывешь Default():
-------------------- ... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
Earnest,
Спасибо! |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
nID & 0xFFF0 - в моем случае SC_MOUSEMENU
lPar - младшие биты - абцисса указателя мыши, старшие - ордината. В итоге: я опять у той же стены. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
Всё всем спасибо, кстати проблему решил способом bel_nikita, тут даже старые обработчики других выпадающих меню не похезались, вообщем рад... вышел с наименьшими потерями
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Ты хочешь сказать, что что бы ты не выбирал, всегда приходит SC_MOUSEMENU? Да быть не может. Стандартные команды нормально ходят, это точно. Покажи, что ли, как ты меню модифицируешь...
-------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |