![]() |
|
|
![]()
|
|
| RobinHoodPHD |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 78 Регистрация: 12.8.2007 Где: Русь Репутация: нет Всего: 2 |
Доброго времени суток, Господа.
Пишу SDI приложение, что то вроде сильно упрощенного Paintа. Помимо стандартного тулбара с кнопками для создания нового документа и проч я решил сделать еще один тулбар - с кнопками для рисования (ну там линии, окружности и проч.) Я создал новый ресурс IDR_INSTR - второй тулбар с 4 кнопками и инициализировал его там же где и стандартный - в функции CMainFrame::OnCreate.
Однако после всего написанного выше кнопки моего тулбара отображаются неактивными (я имею ввиду что они отображаются серым цветом и не реагируют на нажатие). Я добавил в карту сообщений класса CMainFrame следующий код:
Таким образом я установил для диапазона кнопок обработчик, после чего кнопки стали активными. Вопрос в следующем: У нас ведь в распоряжении имеется функция OnCommand , которую можно переопределить, и в которой можно разбирая switch-ем wParam обработать все события. Но если убрать обработчик событий из карты
кнопки вновь станут неактивными. Итак, как правильнее/красивее/логичнее организовать обработку событий от кнопочек моего тулбара: 0) С помощью обработчика событий для диапазона кнопок ON_COMMAND_RANGE(ID_CIRCLE,ID_RECT,&CMainFrame::OnToolBarCmd) 1) С помощью OnCommand - и как тогда сделать кнопки активными? ЗЫ: почему собственно кпнопки не активны, и связано ли это с тем, что мой тулбар не связан с меню? Заранее благодарен за Ваши ответы! |
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Кнопки былм неактивны, т.к. не было обработчика. А для основного тулбара обработчики есть, стандартные, т.к. его команды повторяют команды меню.
Это сделано специально, чтобы активность кнопок зависела от контекста: есть обработчик - кнопка активна, нет - ну на нэт и суда нэт... Имеется в виду не "есть вообще", а достижим в данном контексте. Ведь обработчики команд могут быть не только на 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 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 78 Регистрация: 12.8.2007 Где: Русь Репутация: нет Всего: 2 |
Спасибо, разобрался.)
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |