![]() |
|
![]() ![]() ![]() |
|
elterrible |
|
|||
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 17.5.2008 Репутация: нет Всего: нет |
Есть несколько чекбоксов, клики на которых обрабатываются совершенно одинаково, соответственно хотелось написать один обработчик событий для них.
Но, насколько я понимаю, указать в месседж мапе обработчик с аргументами нельзя (а хотелось передать ID чекбокса). Соответственно нужен какой то способ получить ID контрола в обработчике. Есть ли такая возможность ? |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Обрабатывай OnCommand(). Там и получишь контрол от которого пришла команда.
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не надо трогать OnCommand.
Очнь даже можно. ON_COMMAND_RANGE как раз нужен обработчик с сигнатурой void (UINT). Если ON_COMMANDD_RANGE использовать неудобно (ид-ры идут не подряд), то можно использовать ON_COMMAND_EX. Наконец, в обработчике ON_COMMAND, тоже можно полyчить ид-р. У CWnd есть статическая функция GetCurrentMessage, которая как раз и возвращает обрабатываемое сообщение. Нужно просто извлечь из WPARAM ID. -------------------- ... |
|||
|
||||
elterrible |
|
|||
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 17.5.2008 Репутация: нет Всего: нет |
Earnest, спасибо. Не могу понять только, обработчики ON_COMMAND_* будут срабатывать на любое событие ?
Есть ли возможность отфильтровать только клики ? |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Получить данные контрола в OnCommand не проблема:
Earnest, а чем плох OnCommand? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
elterrible, они только на клики и будут срабатывать. Если внимательно посмотреть, то ON_BN_CLICKED и ON_COMMAND - абсолютно одна фигня. Но если очень сильно хочешь, то можно вместо ON_COMMAND_* использовать ON_CONTROL_* - там вроде та же семантика обработчиков, только нужно еще указать доп. параметр - уведомление, тот самый BN_CLICKED. Но фишка в том, что BN_CLICKED - это 0, поэтому можно просто использовать ON_COMMAND.
Albor, он не плох, а просто предназначен для других целей. Переопределять его для обработки конкретных контролов - микроскопом гвозди забивать. Для этих целей лучше использовать OnCmdMsg, если хочешь обойтись без карты обработчиков. Во-первых, по принципу - выбираем ближайший к точке перехвата виртуальный метод (а OnCmdMsg ближе - по стеку), а во вторых - там же можно обработать и апдейты тех же контролов, что обычно имеет смысл. Но не в данном случае - я уже говорила насчет микроскопа. Выбирать нужно самый простой метод из доступных. -------------------- ... |
|||
|
||||
elterrible |
|
|||
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 17.5.2008 Репутация: нет Всего: нет |
Earnest,
Albor, большое спасибо, все получилось. |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |