Программирование на Visual C++. Архив рассылки
Шрифт:
Но для начала давайте выясним, можно ли просто изменить стандартный вид тулбара (так для краткости я буду именовать панель инструментов). Например, сделать тулбар а'ля WinZip – большие иконки, с подписями…
Итак, какие настройки нам доступны практически сразу же? – Конечно же, стили. Оперируя стилями, мы тоже можем повлиять на внешний вид панели. Вот самые интересные из них:
CCS_TOP и CCS_BOTTOM — задают размещение тулбара — вверху или внизу окна. (CСS_TOP используется по умолчанию.)
TBSTYLE_FLAT — Делает кнопки плоскими. (Используется по умолчанию.)
TBSTYLE_LIST — Используется для вывода текста
Остальные стили вы можете, в принципе, посмотреть сами – они задают некоторые другие параметры. Но нам сейчас нужно другое: сделать кнопки большими и с подписями. Выполнить это можно с помощью членов классов CToolBar и CToolBarCtrl, а если вы работаете не в MFC, то придется работать с сообщениями.
Вышеупомянутые классы MFC располагают богатым набором функций для всевозможной настройки тулбара. Функции CToolBarCtrl::SetButtonSize, CToolBarCtrl::SetBitmapSize, CToolBarCtrl::SetButtonWidth, CToolBar::SetButtonText, CToolBar::SetHeight говорят сами за себя. Именно они понадобятся нам для реализации такого тулбара, как в WinZip. Без MFC это можно сделать, послав тулбару сообщения _SETBUTTONSIZE, TB_SETBITMAPSIZE, TB_SETBUTTONWIDTH, TB_ADDSTRING и др. Кстати, многие функции классов MFC делают фактически то же самое – просто посылают соответствующие сообщения.
Можете сами поиграться с различными настройками. Если бы я взялся здесь подробно описывать ВСЕ возможности, и как каждую реализовать, то эта статья растянулась бы минимум на дюжину выпусков. Цель данной публикации – дать вам общее представление, направление, так сказать. Я не думаю, что обязательно нужно все разжевывать и, как это часто происходит, сводить мысль к "нажмите туда, выберите то". Я хочу, чтобы вы учились думать сами.
Психологи приводят следующую статистику: когда человек просто прочитывает информацию, то запоминает не более 50% из прочитанного. Если еще и записывает – не более 70%.
Но если человеку информация досталась с некоторым трудом, если он ее нашел сам – то запоминается более 90%! Сделайте выводы.
Теперь пришла пора перейти к самому интересному вопросу, который я рассмотрю гораздо подробнее, а именно – как на тулбаре разместить что-либо, не являющееся кнопкой.
Я буду рассказывать как это делается в MFC, хотя понять, как это сделать в API после ознакомления с текстом не составит никакого труда.
Как обычно, если мы хотим заставить что-то стандартное работать нестандартно, нужно создавать класс-наследник. В нашем случае это будет наследник CToolBar, обозначим его CAdvBar. В нем вы сможете обрабатывать все события, поступающие от контролов, размещенных на тулбаре.
А теперь самая суть: как именно можно что-то поместить на тулбар. Дело в том, что существует возможность программно управлять шириной элементов-сепараторов. Таким образом, сепараторы становятся как бы "местами содержания" наших контролов.
В редакторе ресурсов отведите отдельную кнопку на тулбаре – в будущем вместо нее появится ваш элемент управления. Теперь для удобства определим следующие символические константы:
CONTROL_INDEX — порядковый номер кнопки-содержателя контрола;
CONTROL_WIDTH — ширина контрола;
CONTROL_HEIGHT — высота контрола.
Включите контрол в качестве члена в класс CAdvBar. Еще нужно создать функцию инициализации,
которая будет подменять кнопку нашим контролом (конструктор или обработчик OnCreate в данном случае не подходят, т.к. вызываются слишком рано). Пускай, например, нам нужно поместить на тулбар элемент управления типа ComboBox. Тогда:Функция инициализации превращает нашу кнопку в сепаратор и устанавливает ему нужную ширину, после чего создает и позиционирует контрол на его место. Пример для комбобокса:
В данном случае еще могу порекомендовать в комбобоксе изменить шрифт на пропорциональный.
Вот, теперь все, что осталось сделать – в CMainFrame::OnCreate после создания тулбара вызвать Initialize.
Взаимодейстиве с контролом, размещенным на тулбаре, происходит через соответствующий член класса и/или посредством сообщений.
Из ответов, содержащих одинаковое решение, я выбрал лучшие (с моей точки зрения). Большая просьба: не нужно присылать мне целые проекты и большие куски кода. Лучше объясните ваше решение словами.
Q. Как просканировать LAN на предмет создания поименного списка машин, чтобы затем можно было изпользовать результат в ListBox'e? Пробовал использовать для этой цели SHBrowseForFolder и связанные ф-ции с установленным флагом CIDL_NETWORK, но открывающееся окно для выбора узла и необходимость "раскрывать плюсики" в локальных группах меня не устраивает. Если можно, в API без MFC.