![]() |
|
|
![]()
|
|
| voyageur |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 23.11.2005 Репутация: нет Всего: нет |
Здравствуйте! Второй день мучаю поисковики, но так и не нашел исчерпывающего ответа...
Ситуация: диалоговый проект MFC. На поле много button'ов у каждой свой ИД, по нажатию любого баттона выполняется _1_ функция OnBnClickedButton1(). В этой функции надо определить, если нажат допустим IDC_BUTTON1 то делать то-то, если IDC_BUTTON2 то то-то. Так вот вопрос, как же определить этот самый ид? Если функцией GetDlgCtrlID( ), как ей пользоваться?
|
||||
|
|||||
| xTr1m |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
вот эта строка означает, что при нажатии на кнопку IDC_BUTTON1 будет вызвана функция OnBnClickedButton1.
а тут получается, что эта функция для обработчика события клик кнопки IDC_BUTTON1, то есть других быть не может (в твоем случае). |
||||
|
|||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 6 Всего: 146 |
Как вариант, можно перегрузить метод OnCommand.
|
|||
|
||||
| voyageur |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 23.11.2005 Репутация: нет Всего: нет |
xTr1m, функция обрабатывает все кнопки, т.е. по нажатию любой будет печататься "1", другой вопрос, что значение GetDlgCtrlID() не равно IDC_BUTTON1 (1000), по этому не работает.. Вот мне интересно, что я забыл подставить?
в результате должно получится что по нажатию IDC_BUTTON1 напечатается "1" по IDC_BUTTON2 "2" и тд 586, а как этим пользоваться? |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 6 Всего: 146 |
Так же, как и обрабатывается сообщение WM_COMMAND. В LOWORD(wParam) находится идентификатор элемента (кнопки, эдита, или другого контрола), в HIWORD(wParam) передаётся код события (при нажатии кнопки это будет BN_CLICKED), в lParam находится дескриптор контрола, которое отправило сообщение. |
|||
|
||||
| voyageur |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 23.11.2005 Репутация: нет Всего: нет |
вот что мне пишет.. |
|||
|
||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: нет Всего: 1 |
Ох, прошу прощения. Тогда можно использовать ON_COMMAND_RANGE.
|
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 6 Всего: 146 |
Проверь, правильно ли описан метод OnCommand в прототипе класса Cmy_calcDlg. проблем быть не должно. Вот кстати описание CWnd::OnCommand в MSDN: http://msdn.microsoft.com/en-us/library/3t3ddsb9.aspx |
|||
|
||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
voyageur, нужно было посмотреть что делает GetDlgCtrlId(). Вызывая его в классе Cmy_calcDlg, данный метод вызывается для объекта этого класса, то есть для диалога. Чтобы получить ID кнопки, нужно вызвать этот метод, например через указатель на кнопку, так pButton->GetDlgCtrlId(); В твоём стартовом топике искать ID нет смысла, так как ты определил обработчик для каждой кнопки и попав в такой обработчик можно быть уверенным в том, что никакой другой ID кроме нажатой кнопки здесь не присутствует. Об этом тебе и говорил xTr1m. 586 предложил другой подход: обработка всех команд в одном методе. Вот здесь уже нужно проверить от какого контрола и какая пришла команда (но GetDlgCtrlId() здесь не нужен). В этом случае тебе не нужны те функции нажатия кнопок, которые ты уже определил. Так что не путайся и определись как будешь решать задачу: как делал сначала или через OnCommand. Это сообщение отредактировал(а) Albor - 31.3.2010, 07:56 |
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
||||
|
||||
| voyageur |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 23.11.2005 Репутация: нет Всего: нет |
Все, проект заново создал, просто надо было удалить функции нажатия кнопок, как сказал Albor, и все заработало с OnCommand.
Я работаю в фотоне QNX, там виджеты и попроще)) Всем спасибо! |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
1) Проще всего, безусловно, как уже сказано , изменить сигнатуру обработчика на void (UINT) и использовать ON_COMMAND_RANGE
2) Если уже переопределять виртуальную обработку коммангд, то уж никак не OnCommand, а OnCmdMsg - она более специализирована... Для переопределения OnCommand должны быть более веские основания. Я бы, кстати, так и сделала... Все эти ON_RANGE, во первых, требуют, чтобы ид-ры были в одном диапазоне, что сложно поддерживать, да и вообще... 3) Для крайних случаев, когда изменить сигнатуру обработчика почему-либо нельзя, есть замечательная функция CWnd::GetCurrentMessage, которая возвращает текущее обрабатываемое сообщение, со всеми его параметрами. Вот в нем-то и можно посмотреть, кого нажали (т.е. WPARAM). -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |