Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка событий CToolBar в SDI приложении, Кнопки панели отображаются неактивными 
:(
    Опции темы
RobinHoodPHD
Дата 25.5.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток, Господа.

Пишу SDI приложение, что то вроде сильно упрощенного Paintа. Помимо стандартного тулбара с кнопками для создания нового документа и проч я решил сделать еще один тулбар - с кнопками для рисования (ну там линии, окружности и проч.) Я создал новый ресурс IDR_INSTR - второй тулбар с 4 кнопками и инициализировал его там же где и стандартный - в функции CMainFrame::OnCreate. 
Код

static UINT BASED_CODE buttons [] = {
    ID_CIRCLE, // кнопка для рисования окружности, линий итп
    ID_LINE,
    ID_DOT,
    ID_RECT
};

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
.........................
// Инициализация стандартного тулбара, создано студией    
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("Failed to create toolbar\n");
        return -1;      // fail to create
    }

.........................
// А это мой рукодельный ;) тулбар
    ToolBar = new CToolBar ();

    if (!ToolBar->CreateEx (this,TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !ToolBar->LoadToolBar(IDR_INSTR))
    {
        TRACE0("Failed to create toolbar\n");
        return -1;      // fail to create
    }
    
    ToolBar->SetButtons (buttons,sizeof(buttons)/sizeof(UINT));
    
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);
    
    ToolBar->EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(ToolBar);
    return 0;
}


Однако после всего написанного выше кнопки моего тулбара отображаются неактивными (я имею ввиду что они отображаются серым цветом и не реагируют на нажатие).
Я добавил в карту сообщений класса CMainFrame следующий код:
Код

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_CREATE()
    ON_UPDATE_COMMAND_UI_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, &CMainFrame::OnUpdateViewStyles)
    ON_COMMAND_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, &CMainFrame::OnViewStyle)
    ON_COMMAND_RANGE(ID_CIRCLE,ID_RECT,&CMainFrame::OnToolBarCmd) // Для обработки событий от кнопок моего тулбара
END_MESSAGE_MAP()

Таким образом я установил для диапазона кнопок обработчик, после чего кнопки стали активными.

Вопрос в следующем: У нас ведь в распоряжении имеется функция OnCommand , которую можно переопределить, и в которой можно разбирая switch-ем wParam обработать все события. Но если убрать обработчик событий из карты
Код

ON_COMMAND_RANGE(ID_CIRCLE,ID_RECT,&CMainFrame::OnToolBarCmd)

кнопки вновь станут неактивными.

Итак, как правильнее/красивее/логичнее организовать обработку событий от кнопочек моего тулбара:
0) С помощью обработчика событий для диапазона кнопок ON_COMMAND_RANGE(ID_CIRCLE,ID_RECT,&CMainFrame::OnToolBarCmd)
1) С помощью OnCommand - и как тогда сделать кнопки активными?

ЗЫ: почему собственно кпнопки не активны, и связано ли это с тем, что мой тулбар не связан с меню?

Заранее благодарен за Ваши ответы!
PM MAIL   Вверх
Earnest
Дата 26.5.2010, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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


--------------------
...
PM   Вверх
RobinHoodPHD
Дата 26.5.2010, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


 




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


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

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