Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > CToolBar блокировка одной кнопки


Автор: SmarTi 22.7.2006, 00:51
Доброго времени суток! Подскажите пожалуйста, как сделать неактивной одну из кнопок тулбара. 

Автор: Dray 22.7.2006, 01:12
Обрабатывать сообщение UPDATE_COMMAND_UI.
В обработчике писать:
Код
pCmdUI->Enable (FALSE);
 

Автор: SmarTi 22.7.2006, 01:33
Извените за мою тупость, но из этих строчек я почти ничего не понял... можно подробнее обьяснить ? или указать где можно об этом прочитать. 

Автор: Dray 22.7.2006, 02:04
Обычно кнопка на тулбаре связанна с пунктом меню. Если это не так то тут сложней. Если связана, то нужно задисэблить пункт меню, тогда кнопка задисэблица вместе с ним. Делается так:
1) По нужному пункту меню в редакторе ресурсов нужно щелкнуть правой кнопкой и выбрать Add Event Handler...
2) В списке Message type выбрать UPDATE_COMMAND_UI, в списке Class list нужный класс.
3) Нажать кнопку Add end Edit.
4) Внутри появившейся функции написать pCmdUI->Enable (FALSE);
Тогда пункт меню будет все время недоступным, а кнопка вместе с ним.

Добавлено @ 02:06 
В поисковиках если набрать UPDATE_COMMAND_UI находится много полезных ссылок по теме. 

Автор: SmarTi 23.7.2006, 16:44
Этот метод у меня почемуто не работает  smile , вот код :
Код

void CTelBook8Dlg::OnUpdateFiz(CCmdUI *pCmdUI)
{
    pCmdUI->Enable(FALSE);
}

А вот если зделать так : 
Код

void CTelBook8Dlg::OnFiz()
{
    CMenu* cm=GetMenu();
    cm->EnableMenuItem(ID_FIZ,MF_GRAYED);
}

То пункт меню действительно становится серым. Но моей проблемы это нерешает, так как кнопка на ToolBar не реагирует на это вообще, хотя и имеет тот же ID_FIZ. Что может быть не так ?   

Автор: Любитель 23.7.2006, 20:33
Насчёт первого кода - в месседж-мепе у тебя прописана эта функция макросом ON_UPDATE_COMMAND_UI?

Насчёт второго - бред. MFC заботится о всех командах (и меню, и тулбары) в приложениях не на базе диалога (т. е. юзаем OnUpdateComandUi). В диалоговых приложениях используй методы твоего тулбара. Создавал-то ты его как? 

Автор: SmarTi 24.7.2006, 16:42
Цитата

Насчёт первого кода - в месседж-мепе у тебя прописана эта функция макросом ON_UPDATE_COMMAND_UI?

Прописана.
Цитата

Создавал-то ты его как?

Это диалоговое приложение. Насколько я понял, вся проблема в том что я использовал класс CToolBar :
Код

ToolBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_LEFT | CBRS_TOOLTIPS |  CBRS_FLYBY |  CBRS_BORDER_BOTTOM );
  ToolBar.LoadToolBar(IDR_TOOLBAR1);

А вот в классе CToolBarCtrl есть функции по нажатию и отжатию кнопки. Но у меня не получается его создать. Видимо чтото делаю не так. Поэтому покачто я просто задал необходимым кнопкам на тулбаре свойство CHECKBOX и делаю им SetChek при нажатии. 

Автор: Coocky 24.7.2006, 16:45
Есть поиск smile 
Я прекрасно описывал работу Тулбара в диалоге и в документе/представлении они отличаются.
Отличается и классы для работы. и метода создания.
Там где-то даже есть пример, как создать много мого тулбаров на диалоге smile  

Автор: Earnest 24.7.2006, 17:17
Чтобы в модальном диалоге заработала асинхронные обновления (т.е. вызывались обработчики OnUpdateXXX), нужно:
1) добавить обработчик сообщения WM_KICKIDLE (это сообщение из afxpriv.h)
2) В этом обработчике вызвать UpdateDialogControls (this, false) (можно и True - это параметр DisbaleIfNoHandler)

Добавлено @ 17:20 
А у объекта ToolBar вызвать метод OnUpdateCmdUI (this, false) 

Автор: SmarTi 25.7.2006, 00:56
Всем огромное спасибо. Разобрался  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)