Панель инструментов Toolbar
Все вы видели панели инструментов. Они имеются в большинстве солидных приложений Windows. Так, панели инструментов VS вы можете видеть в 4.5. Панель инструментов представляет набор кнопок и других элементов, предназначенный для быстрого выполнения наиболее часто встречающихся действий, таких как открытие, сохранение файлов, выбор размера шрифта и т.п. Те же самые действия обычно можно выполнить и при помощи меню, но панель инструментов всегда на виду, поэтому с ее помощью действия выполняются быстрее.
Создаем панель инструментов. Поставим задачу создать панель инструментов на 4 кнопки (см. Рис. 20.8).
Рис. 20.8
На Рис. 20.9 вы видите ту же панель с некоторыми кнопками уже нажатыми.
Рис. 20.9
Создайте проект. Поместите на форму элемент управления ToolBar
(Панель инструментов). Он получит имя ToolBar1. При этом панель инструментов сразу «прилипнет» к верхнему краю формы, как ей в общем-то и положено. Пока панель пуста. Давайте заполним ее кнопками.
Чтобы кнопки не были простыми прямоугольниками, а имели вид разных красивых значков, нам в проекте необходим ImageList с картинками этих значков. Поместите ImageList в проект, а походящие иконки найдете по адресу
Program Files\Microsoft Visual Studio .NET\Common7\Graphics\icons
Далее нам нужно сказать панели инструментов, из какого именно элемента ImageList она должна брать картинки. Ведь элементов ImageList в проекте может быть несколько. Для этого заглянем в окно свойств элемента ToolBar1 и установим соответствующим образом свойство ImageList.
А теперь нас интересует свойство Buttons. Оно представляет собой коллекцию кнопок, содержащихся в панели инструментов. Щелкните по трем точкам в поле значения этого свойства. Возникнет Редактор коллекции кнопок (на Рис. 20.10 вы видите его уже заполненным несколькими кнопками). Пока же он пустой.
Рис. 20.10
Заполним его кнопками. Процесс аналогичен работе с Редактором коллекции картинок (20.5). Нажимая кнопку Add, мы добавляем на панель кнопку за кнопкой. Слева от кнопки вы видите ее номер в коллекции Buttons. В правой части окна Редактора – информация о выделенной кнопке, причем ее можно задавать. Две кнопки со стрелками вверх и вниз перемещают выделенную кнопку внутри коллекции. Кнопка Remove удаляет ее.
Настраиваем кнопки. Вот какую информацию о выделенной кнопке можно задавать и изменять в полях правой части окна Редактора (остановлюсь на главных с моей точки зрения полях):
Прежде всего, это имя кнопки (Name). Называйте кнопку в соответствии с ее предназначением, как вы его понимаете.
В поле Style нам нужно выбрать тип кнопки. Кнопки на панели инструментов могут быть трех типов и еще одного:
Тип |
Описание |
PushButton |
Обычная кнопка. У нас это две левые кнопки. |
ToggleButton |
Кнопка-переключатель. Когда на нее нажмешь, она переходит в нажатое состояние до следующего нажатия. В Microsoft Word это кнопки выравнивания абзаца и форматирования шрифта. У нас это кнопка со снежинкой. |
DropDownButton |
Справа от нее – черная треугольная стрелка. При нажатии на стрелку выпадает меню. У нас это кнопка со светофором. |
Separator |
Это, собственно, не кнопка, а разделитель. У нас это серенькая вертикальная черточка слева от кнопки со снежинкой. Нажимать на разделитель нельзя, он нужен только для того, чтобы создать пространственный промежуток между кнопками. Используется для пространственной группировки кнопок по смыслу. |
В поле ImageIndex мы выбираем для каждой кнопки картинку из заранее подготовленной галереи ImageList.
Полезно заполнить поле ToolTipText, в этом случае при подведении мыши к кнопке будет всплывать подсказка.
Если вы заполните текстом поле Text, этот текст будет присутствовать на кнопке рядом с картинкой.
Если кнопка имеет тип DropDownButton, то вы, конечно, хотите, чтобы из нее выпадало меню. Меню это создается привычным вам элементом управления ContextMenu. Поместите его в проект, настройте и запрограммируйте нужным вам образом (см. 18.9). Затем привяжите его к кнопке, установив значение поля DropDownMenu (см. Рис. 20.10).
Если кнопка имеет тип ToggleButton, то вы можете задать, чтобы при запуске проекта она была нажатой, установив поле Pushed в True.
Настраиваем панель инструментов. Упомяну еще о трех свойствах элемента управления ToolBar:
Свойство |
Описание |
Appearance |
Внешний вид кнопок. Может быть таким, как на Рис. 20.8. Это вид плоский (Flat). Кнопки плоские, без границ, видны одни значки. Разделитель – вертикальная черточка. Внешний вид может быть и нормальным (Normal). В этом случае кнопки имеют привычный вид, разделитель – просто пустой промежуток. |
Dock |
Определяет, к какому краю формы будет «приклеена» панель инструментов и будет ли «приклеена» вообще. |
TextAlign |
Где находится на кнопке текст по отношению к значку – под значком или справа. |
Придумаем дела для наших кнопок. Для иллюстрации вполне достаточно, если каждая кнопка будет просто сообщать о своем нажатии оператором Debug.WriteLine. Ведь вы всегда сможете на место этого оператора подставить обращение к любой самой сложной процедуре.
Снежинке придумаем дополнительное дело: пусть она управляет значением булевской переменной Снег_идет. Если кнопка нажата, эта переменная должна иметь значение True, если отжата – False.
А вот дополнительное дело для светофора: пусть выпадающее меню из 3 пунктов позволяет красить форму в цвета светофора.
Важное отличие программирования кнопок панели от программирования обычных кнопок состоит в том, что процедура обработки нажатия на кнопки панели одна для всех кнопок, а у обычных кнопок, как вы знаете, для каждой кнопки своя процедура.
Сделаем двойной щелчок по панели инструментов. Появится заготовка нужной процедуры ToolBar1_ButtonClick . А вот и вся программа:
Dim Снег_идет As Boolean = False
Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
If e.Button Is
кнопка_Открыть Then Debug.WriteLine("Нажата кнопка Открыть")
If e.Button Is
кнопка_Сохранить Then Debug.WriteLine("Нажата кнопка Сохранить")
If e.Button Is
кнопка_Снег Then Debug.WriteLine("Нажата кнопка Снег") : Переключаем_снег()
If e.Button Is
кнопка_Светофор Then Debug.WriteLine("Нажата кнопка Светофор")
End Sub
Sub Переключаем_снег()
Снег_идет = Not Снег_идет
Debug.WriteLine(Снег_идет)
End Sub
Private Sub MenuItem_красный_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MenuItem_красный.Click
Me.BackColor = Color.Red
End Sub
Private Sub MenuItem_желтый_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MenuItem_желтый.Click
Me.BackColor = Color.Yellow
End Sub
Private Sub MenuItem_зеленый_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MenuItem_зеленый.Click
Me.BackColor = Color.Green
End Sub
Пояснения: Объект e, являющийся параметром процедуры ToolBar1_ButtonClick, хранит в своем свойстве Button указание на то, какая именно кнопка на панели была нажата. Слово Is можно перевести, как «является». Поэтому фрагмент
If e.Button Is кнопка_Открыть Then
можно перевести как «Если нажатая кнопка является кнопкой Открыть, то …».
Слово Is мы раньше использовали в операторе Select Case. Там его смысл был похожим на только что использованный.
Оператор
Снег_идет = Not Снег_идет
занимается исключительно тем, что меняет значение переменной Снег_идет на противоположное.
Обратите внимание, что нажатие на собственно кнопку со светофором, не приводит к появлению меню. Для этого нужно нажать на черную треугольную стрелку.
Улучшаем калькулятор. Последнее, чем созданный нами ранее калькулятор хуже стандартного – у него нет 10 цифровых клавиш, нажимая на которые мы набираем числа в текстовом поле. В принципе, мы уже давно могли разместить 10 кнопок на калькуляторе, написав к каждой кнопке коротенькую процедуру обработки нажатия на кнопку. Но 10 процедур – пожалуй, слишком громоздко. Сейчас у нас появился шанс обойтись одной процедурой, разместив 10 кнопок на панели инструментов. Подумайте, как это сделать. Вам не придется писать 10 операторов If, если вы обратитесь к номеру нажатой кнопки в коллекции:
ToolBar1.Buttons.IndexOf(e.Button))
Наращивать число в текстовом поле можно так:
TextBox1.Text = TextBox1.Text & Нажатая_цифра