| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Обработка событий CToolBar в SDI приложении |
| Автор: RobinHoodPHD 25.5.2010, 16:49 | ||||||
| Доброго времени суток, Господа. Пишу SDI приложение, что то вроде сильно упрощенного Paintа. Помимо стандартного тулбара с кнопками для создания нового документа и проч я решил сделать еще один тулбар - с кнопками для рисования (ну там линии, окружности и проч.) Я создал новый ресурс IDR_INSTR - второй тулбар с 4 кнопками и инициализировал его там же где и стандартный - в функции CMainFrame::OnCreate.
Однако после всего написанного выше кнопки моего тулбара отображаются неактивными (я имею ввиду что они отображаются серым цветом и не реагируют на нажатие). Я добавил в карту сообщений класса CMainFrame следующий код:
Таким образом я установил для диапазона кнопок обработчик, после чего кнопки стали активными. Вопрос в следующем: У нас ведь в распоряжении имеется функция OnCommand , которую можно переопределить, и в которой можно разбирая switch-ем wParam обработать все события. Но если убрать обработчик событий из карты
кнопки вновь станут неактивными. Итак, как правильнее/красивее/логичнее организовать обработку событий от кнопочек моего тулбара: 0) С помощью обработчика событий для диапазона кнопок ON_COMMAND_RANGE(ID_CIRCLE,ID_RECT,&CMainFrame::OnToolBarCmd) 1) С помощью OnCommand - и как тогда сделать кнопки активными? ЗЫ: почему собственно кпнопки не активны, и связано ли это с тем, что мой тулбар не связан с меню? Заранее благодарен за Ваши ответы! |
| Автор: Earnest 26.5.2010, 06:31 |
| Кнопки былм неактивны, т.к. не было обработчика. А для основного тулбара обработчики есть, стандартные, т.к. его команды повторяют команды меню. Это сделано специально, чтобы активность кнопок зависела от контекста: есть обработчик - кнопка активна, нет - ну на нэт и суда нэт... Имеется в виду не "есть вообще", а достижим в данном контексте. Ведь обработчики команд могут быть не только на MainFrame, но и на документе и на вью - где удобнее обрабатывать. Обработчики ON_UPDATE - тоже обработчики, но предназначены для дополнительной, более тонкой обработки - скажем отметить пункт меню или кнопку, соответствующую текущему инструменту (напр. выбранному ID_CIRCLE). Или сделать команду неактивной, если, скажем, чего-то нет... В твоем случае правильнее работать именно с обработчиками. А про OnComand вообще забудь - она не для этого. Сначала определись, кто будет управлять этими средствами рисования. MainFrame - плохой выбор, лучше вью или документ. Я бы сделала вью - как-то естественнее. Далее, заводим там (у вью) элемент данных m_curMode (который будет принимать ид-р текущего инструмента). И пишем обработчики - тоже на виде: ON_COMMAND_RANGE и ON_UPDATE_RANGE OnUpdate должен выглядеть примерно так: void CMyView::OnUpdate (CCmdUI* pCmdUI) { pCmdUI->SetCheck (m_curMode == pCmdUI->m_nID); } А действие примерно так: void CMyView::OnSetTool (UINT nID) { m_curMode = nID; } Далее, в обработке сообщений вида типа OnLButtonDown и т.д. выбираешь действие в зависимости от m_curMode. И т.д. Тогда, если документ не загружен (нет активного вью), то команды будут недоступны, что логично. Причем, никаких специальных действий предпринимать не надо. |
| Автор: RobinHoodPHD 26.5.2010, 14:50 |
| Спасибо, разобрался.) |