| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Определение ID нажатой кнопки |
| Автор: voyageur 30.3.2010, 10:52 | ||||
| Здравствуйте! Второй день мучаю поисковики, но так и не нашел исчерпывающего ответа... Ситуация: диалоговый проект MFC. На поле много button'ов у каждой свой ИД, по нажатию любого баттона выполняется _1_ функция OnBnClickedButton1(). В этой функции надо определить, если нажат допустим IDC_BUTTON1 то делать то-то, если IDC_BUTTON2 то то-то. Так вот вопрос, как же определить этот самый ид? Если функцией GetDlgCtrlID( ), как ей пользоваться?
|
| Автор: xTr1m 30.3.2010, 11:58 | ||||
вот эта строка означает, что при нажатии на кнопку IDC_BUTTON1 будет вызвана функция OnBnClickedButton1.
а тут получается, что эта функция для обработчика события клик кнопки IDC_BUTTON1, то есть других быть не может (в твоем случае). |
| Автор: 586 30.3.2010, 12:34 | ||
Как вариант, можно перегрузить метод OnCommand.
|
| Автор: voyageur 30.3.2010, 13:04 |
| xTr1m, функция обрабатывает все кнопки, т.е. по нажатию любой будет печататься "1", другой вопрос, что значение GetDlgCtrlID() не равно IDC_BUTTON1 (1000), по этому не работает.. Вот мне интересно, что я забыл подставить? в результате должно получится что по нажатию IDC_BUTTON1 напечатается "1" по IDC_BUTTON2 "2" и тд 586, а как этим пользоваться? |
| Автор: 586 30.3.2010, 13:14 |
Так же, как и обрабатывается сообщение http://msdn.microsoft.com/en-us/library/aa930761.aspx. В LOWORD(wParam) находится идентификатор элемента (кнопки, эдита, или другого контрола), в HIWORD(wParam) передаётся код события (при нажатии кнопки это будет BN_CLICKED), в lParam находится дескриптор контрола, которое отправило сообщение. |
| Автор: voyageur 30.3.2010, 13:22 | ||
вот что мне пишет.. |
| Автор: xTr1m 30.3.2010, 14:01 |
| Ох, прошу прощения. Тогда можно использовать ON_COMMAND_RANGE. |
| Автор: Albor 31.3.2010, 06:48 | ||
voyageur, нужно было посмотреть что делает GetDlgCtrlId(). Вызывая его в классе Cmy_calcDlg, данный метод вызывается для объекта этого класса, то есть для диалога. Чтобы получить ID кнопки, нужно вызвать этот метод, например через указатель на кнопку, так pButton->GetDlgCtrlId(); В твоём стартовом топике искать ID нет смысла, так как ты определил обработчик для каждой кнопки и попав в такой обработчик можно быть уверенным в том, что никакой другой ID кроме нажатой кнопки здесь не присутствует. Об этом тебе и говорил xTr1m. 586 предложил другой подход: обработка всех команд в одном методе. Вот здесь уже нужно проверить от какого контрола и какая пришла команда (но GetDlgCtrlId() здесь не нужен). В этом случае тебе не нужны те функции нажатия кнопок, которые ты уже определил. Так что не путайся и определись как будешь решать задачу: как делал сначала или через OnCommand. |
| Автор: voov 31.3.2010, 10:22 |
В данном случае это удобнее всего |
| Автор: voyageur 31.3.2010, 10:36 |
| Все, проект заново создал, просто надо было удалить функции нажатия кнопок, как сказал Albor, и все заработало с OnCommand. Я работаю в фотоне QNX, там виджеты и попроще)) Всем спасибо! |
| Автор: Earnest 31.3.2010, 10:44 |
| 1) Проще всего, безусловно, как уже сказано , изменить сигнатуру обработчика на void (UINT) и использовать ON_COMMAND_RANGE 2) Если уже переопределять виртуальную обработку коммангд, то уж никак не OnCommand, а OnCmdMsg - она более специализирована... Для переопределения OnCommand должны быть более веские основания. Я бы, кстати, так и сделала... Все эти ON_RANGE, во первых, требуют, чтобы ид-ры были в одном диапазоне, что сложно поддерживать, да и вообще... 3) Для крайних случаев, когда изменить сигнатуру обработчика почему-либо нельзя, есть замечательная функция CWnd::GetCurrentMessage, которая возвращает текущее обрабатываемое сообщение, со всеми его параметрами. Вот в нем-то и можно посмотреть, кого нажали (т.е. WPARAM). |