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


Автор: elterrible 3.6.2010, 16:56
Есть несколько чекбоксов, клики на которых обрабатываются совершенно одинаково, соответственно хотелось написать один обработчик событий для них.
Но, насколько я понимаю, указать в месседж мапе обработчик с аргументами нельзя (а хотелось передать ID чекбокса). Соответственно нужен какой то способ получить ID контрола в обработчике. 
Есть ли такая возможность ?

Автор: Albor 3.6.2010, 17:54
Обрабатывай OnCommand(). Там и получишь контрол от которого пришла команда.

Автор: Earnest 3.6.2010, 20:00
Не надо трогать OnCommand.
Цитата(elterrible @  3.6.2010,  17:56 Найти цитируемый пост)
Но, насколько я понимаю, указать в месседж мапе обработчик с аргументами нельзя (а хотелось передать ID чекбокса). Соответственно нужен какой то способ получить ID контрола в обработчике. 

Очнь даже можно. ON_COMMAND_RANGE как раз нужен обработчик с сигнатурой void (UINT). Если ON_COMMANDD_RANGE использовать неудобно (ид-ры идут не подряд), то можно использовать ON_COMMAND_EX.
Наконец, в обработчике ON_COMMAND, тоже можно полyчить ид-р. У CWnd есть статическая функция GetCurrentMessage, которая как раз и возвращает обрабатываемое сообщение. Нужно просто извлечь из WPARAM ID.

Автор: elterrible 3.6.2010, 20:47
Earnest, спасибо. Не могу понять только, обработчики ON_COMMAND_* будут срабатывать на любое событие ?
Есть ли возможность отфильтровать только клики ? 

Автор: Albor 4.6.2010, 11:21
Получить данные контрола в OnCommand не проблема:
Код

WORD wCommand=HIWORD(wParam);// команда
WORD wCtrlID=LOWORD(wParam);// контрол
//если команда от кнопки
if(wCommand==BN_CLICKED)
{
//что-то делаем ...
}


Earnest,  а чем плох OnCommand?

Автор: Earnest 4.6.2010, 17:16
elterrible, они только на клики и будут срабатывать. Если внимательно посмотреть, то ON_BN_CLICKED и ON_COMMAND - абсолютно одна фигня. Но если очень сильно хочешь, то можно вместо ON_COMMAND_* использовать ON_CONTROL_* - там вроде та же семантика обработчиков, только нужно еще указать доп. параметр - уведомление, тот самый BN_CLICKED. Но фишка в том, что BN_CLICKED - это 0, поэтому можно просто использовать ON_COMMAND.

Albor, он не плох, а просто предназначен для других целей. Переопределять его для обработки конкретных контролов - микроскопом гвозди забивать. Для этих целей лучше использовать OnCmdMsg, если хочешь обойтись без карты обработчиков. Во-первых, по принципу - выбираем ближайший к точке перехвата виртуальный метод (а OnCmdMsg ближе - по стеку), а во вторых - там же можно обработать и апдейты тех же контролов, что обычно имеет смысл. Но не в данном случае - я уже говорила насчет микроскопа. Выбирать нужно самый простой метод из доступных. 

Автор: elterrible 4.6.2010, 22:38
Earnest, 
Albor, большое спасибо, все получилось.

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