Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Один обработчик событий для нескольких контролов? 
:(
    Опции темы
elterrible
Дата 3.6.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть несколько чекбоксов, клики на которых обрабатываются совершенно одинаково, соответственно хотелось написать один обработчик событий для них.
Но, насколько я понимаю, указать в месседж мапе обработчик с аргументами нельзя (а хотелось передать ID чекбокса). Соответственно нужен какой то способ получить ID контрола в обработчике. 
Есть ли такая возможность ?
PM MAIL   Вверх
Albor
Дата 3.6.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Обрабатывай OnCommand(). Там и получишь контрол от которого пришла команда.
PM MAIL ICQ   Вверх
Earnest
Дата 3.6.2010, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не надо трогать 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.


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


Новичок



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

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



Earnest, спасибо. Не могу понять только, обработчики ON_COMMAND_* будут срабатывать на любое событие ?
Есть ли возможность отфильтровать только клики ? 
PM MAIL   Вверх
Albor
Дата 4.6.2010, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Получить данные контрола в OnCommand не проблема:
Код

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


Earnest,  а чем плох OnCommand?
PM MAIL ICQ   Вверх
Earnest
Дата 4.6.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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 ближе - по стеку), а во вторых - там же можно обработать и апдейты тех же контролов, что обычно имеет смысл. Но не в данном случае - я уже говорила насчет микроскопа. Выбирать нужно самый простой метод из доступных. 


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


Новичок



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

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



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


 




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


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

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