Свойства списков изображений
Количество свойств у списков изображений невелико.
BackColor | ImageWidth | MaskColor | Parent |
HImageList | Index | Name | Tag |
ImageHeight | Listlmages | Object | UseMaskColor |
Работа со списком изображений начинается со свойства Name. Для элементов этого типа обычно используется префикс iml. Связывая список изображений с другим элементом, я обычно присваиваю ему то же имя. Например, если список изображений связывается с панелью инструментов tbrToolbar, то ему присваивается имя imlToolbar.
Свойство ImageHeight определяет высоту, a ImageWidth — ширину всех изображений в списке. Важно помнить о том, что все изображения в списке должны иметь одинаковые размеры. Если вам потребуются разные размеры, придется воспользоваться несколькими списками изображений.
Свойство MaskColor позволяет выводить изображения на прозрачном фоне — оно определяет фоновый цвет изображений, принадлежащих элементу. Во всех изображениях элемента должен использоваться один и тот же цвет фона. После того как свойству MaskColor будет задано нужное значение, следует установить свойство UseMaskColor в True.
ВНИМАНИЕВсе изображения в списке должны иметь одинаковые размеры. Кроме того, в них должен использоваться один и тот же цвет фона (маски).
События списков изображений
Со списками изображений не связаны никакие события, поэтому мы переходим к рассмотрению единственного метода.
Методы списков изображений
Списки изображений имеют всего один метод — Overlay. Он используется для наложения двух изображений в одном списке. С помощью свойства MaskColor для верхнего изображения можно задать прозрачный цвет, и тогда оно накладывается на нижнее. Например, следующий фрагмент:
‘Наложить изображение 1 на изображение 2
Set Picture1. Picture = imToolbar.Overlay(1, 2)
накладывает первое изображение элемента на второе.
Все вместе
Настал момент, которого мы так долго ждали. Следующий пример демонстрирует возможности новых элементов — дерева, табличного списка и списка изображений. Давайте посмотрим, как они работают вместе:
1. Создайте в Visual Basic новый проект командой File > New и выберите стандартный ЕХЕ-файл (Standard EXE).
2. Щелкните на проекте Projectl в окне проекта и задайте свойству Name проекта значение ObjectExplorer.
3. Выделите форму Form1 и задайте ее свойству Name значение frmMain.
4. Задайте свойству Caption значение Object Explorer.
5. Щелкните правой кнопкой мыши на панели элементов и выберите из контекстного меню команду Components.
6. Прокрутите список в открывшемся диалоговом окне Components и установите флажок рядом со строкой Microsoft Windows Common Controls 6.0. Нажмите кнопку OK, чтобы добавить элемент на панель.
7. Поместите на форму frmMain список изображений, для чего дважды щелкните на списке изображений в панели. Когда список появится на форме, переместите его в правый нижний угол формы и задайте его свойству Name значение imlCategories.
8. В окне свойств дважды щелкните на строке Custom, чтобы открыть диалоговое окно со страницами свойств элемента.
9. Перейдите на вкладку Images. Нажмите кнопку Insert Picture, чтобы добавить изображение в список.
10. В диалоговом окне Select picture выделите файл Closed.bmp из каталога Common\ Graphics\Bitmaps. Нажмите кнопку Open, чтобы включить графический файл в элемент, и нажмите кнопку ОК.
11. Поместите на frmMain еще один список изображений. Задайте его свойству Name значение imlItems. Расположите его рядом со списком imlCategories.
12. Повторите шаги 8-10, добавьте в элемент изображение Leaf.bmp и нажмите кнопку Open.
13. Закройте диалоговое окно со страницами свойств кнопкой ОК.
14. Создайте дерево на форме frmMain. Задайте его свойству Name значение tvw-Categories.
15. В окне свойств дважды щелкните на строке Custom, чтобы открыть диалоговое окно со страницами свойств элемента.
16. На вкладке General этого окна задайте свойству Style значение 7 - tvwTree-HnesPlusMinusPictureText, свойству LabelEdit — значение 1 - Manual, свойству Indentation — значение 283 и свойству ImageList — значение imlCategories.
17. Закройте диалоговое окно со страницами свойств кнопкой ОК.
18. Переместите дерево tvwCategories в левую часть формы.
19. Создайте табличный список на форме frmMain. Задайте его свойству Name значение Ivwltems.
20. В окне свойств дважды щелкните на строке Custom, чтобы открыть диалоговое окно со страницами свойств элемента.
21. Задайте свойству View значение 3 - IvwReport, свойству Arrange — значение 2 -IvwAutoTop, свойству LabelEdit — значение 1 - Manual, а свойству OLEDropMode -значение 1 - OLEDropManual.
22. Перейдите на вкладку Image Lists.
23. Введите в поле Normal значение imlltems. Тем самым вы связываете табличный список со списком изображений imlltems.
24. Перейдите на вкладку Column Headers.
25. Нажмите кнопку Insert Column. В коллекцию добавляется первый объект заголовка столбца.
26. Введите в поле Text значение Название.
27. Закройте диалоговое окно со страницами свойств кнопкой ОК.
28. Переместите список imlltems в правый верхний угол формы. Примерный вид формы показан на рис. 3.22.
29. Сохраните свою работу командой File > Save Project.
Рис. 3.22. Форма Object Explorer в режиме конструирования
30. Дважды щелкните на форме frmMain, чтобы открыть окно программы.
31. Включите следующий код в процедуру события Form_Resize: Private Sub Form_Resize()
Dim mid1 As Integer
Dim mid2 As Integer
Mid1 = (ScaleWidth / 2) - 50
mid2 = (ScaleWidth / 2) + 50
If WindowState <> vbMinimized Then
tvwCategories.Move 0, 0, mid1, ScaleHeight
Ivwltems.Move mid2, 0, ScaleWidth - mid2, ScaleHeight
End If
End Sub
Приведенный фрагмент кода стоит рассмотреть подробнее. В первых двух строках объявляются две переменные, mid1 и mid2. Две следующие строки присваивают им значения, обозначающие расстояние от центра формы до левой и правой границ. Прибавляя и вычитая 50, мы создаем аккуратную границу между двумя элементами.
Строка If...Then говорит о том, что программа должна выполнить следующий фрагмент лишь в том случае, если форма не находится в свернутом состоянии. Если форма свернута, при попытке перемещения и изменения размеров элементов возникнет ошибка. Оператор If...Then подробно рассматривается в уроке 6, «Логика и последовательность выполнения программы».
В процедуру события Form_Load() вставьте следующий фрагмент:
Private Sub Form_Load()
Dim cat As Node
' Включить в дерево новые узлы
With tvwCategories.Nodes
Set cat = .Add(, , "root", "Объекты", 1)
Set cat = .Add("root", tvwChild, , "Встроенные”,1)
Set cat = .Add("root", tvwChild, , "Проводник",1)
Set cat = .AddC'root", tvwChild, , "Internet",1)
End With
End Sub
В первой строке создается переменная типа Node. Она позволит нам работать с коллекцией Nodes в табличном списке. Следующая строка (With...) сообщает компилятору Visual Basic о том, что он должен работать с коллекцией Nodes элемента tvwCategories.
Первая строка внутри оператора With добавляет узел на корневом уровне дерева. Мы присваиваем ему текстовое значение "Объекты", поскольку в дереве будет выводиться иерархический список объектов. Три следующие строки добавляют в корневой объект узлы следующего уровня (tvwChild). Каждый узел имеет собственное описание: в одном содержатся встроенные элементы, в другом — элементы в стиле Проводника и в третьем — элементы для работы с Интернетом. Помните о том, что каждый узел на самом деле представляет собой категорию — это означает, что в нем могут «содержаться» другие объекты.
Добавьте следующий фрагмент в секцию (General)(Declarations) формы frmMain:
Option Explicit
Private Sub ListExplorer()
Dim itm As Listltem
With Ivwltems.Listltems .Clear Set itm = ,Add(, , "Дерево",1)
Set itm = .Add(, , "Табличный список", 1)
Set itm = .Add(, , "Список изображений", 1)
Set itm = .Add(, , "Панель инструментов", 1)
Set itm = .Add(, , "Строка состояния", 1)
End With
End Sub
Private Sub Listlnternet()
Dim itm As Listltem
With Ivwltems.Listltems
.Clear
Set itm = .Add(, , "Web-броузер", 1)
Set itm = .Add(, , "ShellFolderView", 1)
Set itm = ,Add(, , "Inet", 1)
Set itm = .Add(, , "Winsock", 1)
End With
End Sub
Private Sub Listlntrinsics()
Dim itm As Listltem
With Ivwltems.Listltems
.Clear
Set itm = ,Add(, , "Графическое поле", 1)
Set itm = ,Add(, , "Надпись", 1)
Set itm = .Add(, , "Текстовое поле", 1)
Set itm = .Add(, , "Рамка", 1)
Set itm = ,Add(, , "Кнопка", 1)
Set itm = ,Add(, , "Флажок", 1)
Set itm = .Add(, , "Переключатель", 1)
Set itm = .Add(, , "Комбинированное поле", 1)
Set itm = ,Add(, , "Список", 1)
Set itm = .Add(, , "Горизонтальная полоса прокрутки", 1)
Set itm = .Add(, , "Вертикальная полоса прокрутки", 1)
Set itm = ,Add(, , "Таймер", 1)
Set itm = .Add(, , "Список дисков", 1)
Set itm = .Add(, , "Список каталогов", 1)
Set itm = .Add(, , "Список файлов", 1)
Set itm = .Add(, , "Фигура", 1)
Set itm = ,Add(, , "Линия", 1)
Set itm = .Add(, , "Рисунок", 1)
Set itm = .Add(, , "Данные", 1)
Set itm = ,Add(, , "OLE", 1)
End With
End Sub
Первая строка, Option Explicit, вводит обязательное объявление переменных в проекте. Три последующие процедуры очень похожи. В каждой объявляется переменная типа Listltem с именем itm. Эта переменная используется для работы с коллекцией List Items элемента Ivwltems.
Оператор With... сообщает компилятору о том, что для следующего фрагмента используется коллекция Listltems табличного списка. Следующая команда, . Clear, очищает коллекцию Listltems и удаляет из нее все занесенные ранее элементы. Последующие команды включают в коллекцию новые объекты типа Listltem.
Наконец, включите следующий фрагмент в процедуру события NodeClick() элемента tvwCategories:
Private Sub tvwCategories_NodeClick(ByVal Node As ComctlLib.Node)
Select Case Node
Case Is = "Встроенные"
Listlntrinsics
Case Is = "Проводник"
ListExplorer
Case Is = "Internet"
Listlnternet
End Select
End Sub
Сохраните проект командой File > Save и запустите программу клавишей F5.
Внешний вид формы показан на рис. 3.23. В левой части формы находится дерево, а в правой — табличный список. Обратите внимание — при изменении размеров формы происходит автоматическое масштабирование элементов. Откройте папку Объекты двойным щелчком. Затем щелкните на любой категории, чтобы просмотреть ее содержимое.
Рис. 3.23. Программа Object Explorer в действии
Не беспокойтесь о процедурах перетаскивания OLE. Мы подробно рассмотрим их в уроке 11, когда у вас появится некоторый опыт программирования.
Строка состояния
Строка состояния — следующий важный представитель новых управляющих элементов Windows. В строке состояния выводятся различные сведения для пользователя. Она отдаленно напоминает системную панель, расположенную в правой части панели задач Windows. Строка состояния также присутствует в Проводнике Windows. В других приложениях на ней могут выводиться системное время и дата, значки или статистические данные, например количество файлов, содержащихся в табличном списке.
Свойства строк состояния
Строки состояния обладают следующими свойствами:
Align | hWnd | OLEDropMode | Tag |
Container | Index | Panels | ToolTipText |
DragIcon | Left | Parent | Top |
DragMode | MouseIcon | ShowTips | Visible |
Enabled | MousePointer | SimpleText | WhatsThisHelpID |
Font | Name | Style | Width |
Height | Object | Tablndex |
Главным, как всегда, является свойство Name. Для строк состояния обычно используется префикс sts. Я предпочитаю задавать для них имя stsStatus. Свойство Panels возвращает ссылку на коллекцию объектов-панелей, принадлежащих элементу строки состояния.
Свойство Style определяет режим отображения строки состояния. Оно может принимать следующие значения.
Значение | Описание | |
sbrNormal | В строке состояния выводится несколько панелей | |
sbrSimple | Строка состояния состоит из одной панели, которая распространяется на всю ширину |
Свойство SimpleText позволяет задать или прочитать текст, находящийся в панели, если свойство Style равно 1 - sbrSimple.
События строк состояния
Ниже перечислены события, поддерживаемые строками состояния.
Click | MouseDown | OLEDragDrop | OLEStartDrag |
DblClick | MouseMove | OLEDragOver | PanelClick |
DragDrop | MouseUp | OLEGiveFeedback | PanelDblClick |
DragOver | OLECompleteDrag | OLESetData |
Поскольку строка состояния обычно используется для вывода информации, многие из этих событий обычно не представляют особого интереса. События перетаскивания OLE подробно рассматриваются в уроке 11. А пока мы ограничимся событиями PanelClick и PanelDblClick.
Событие PanelClick происходит в тот момент, когда пользователь щелкает на панели. Что такое панель, спросите вы? Панелью называется часть строки состояния, которая содержит текст или растровое изображение и может использоваться для вывода информации о статусе приложения. Событие PanelDblClick происходит при двойном щелчке на панели.
Все эти события происходят крайне редко, поэтому вам практически не придется ими пользоваться. Тем не менее, поведение элемента зависит только от структуры вашего приложения.
Методы строк состояния
Элемент поддерживает несколько методов, перечисленных ниже. Ни один из этих методов не играет особой роли в работе элемента.
Drag | OLEDrag | SetFocus | ZOrder |
Move | Refresh | ShowWhatsThis |
Разумеется, описать все элементы в одном уроке невозможно — для этого потре-бовалась бы отдельная книга. Впрочем, некоторые элементы рассматриваются в других местах вместе с примерами, которые научат вас работать с ними. После прочтения этого урока вы полностью готовы к работе со всеми элементами, как описанными, так и теми, до которых мы еще не дошли. Нестандартные элементы хороши как раз тем, что изучение одного из них помогает освоить остальные.
Работа со строкой состояния
Давайте дополним пример Object Explorer из предыдущего раздела. Загрузите проект ObjectBrowser командой File > Open из меню Visual Basic.
1. Разместите строку состояния в нижней части формы frmMain. Элемент автоматически растягивается на всю ширину формы. Задайте его свойству Name значение stsStatus.
2. Откройте окно программы для события Load формы frmMain.
3. Включите в программу следующую строку под строкой
Dim cat As Node: Dim pnl As Panel
4. Вставьте следующий фрагмент под блоком With...End:
' Добавить две панели - для даты и времени
With stsStatus.Panels
Set pnl = ,Add(, , , sbrTime)
Set pnl = .Add(, , , sbrDate)
End With
5. Перейдите к процедуре события NodeClick элемента tvwCategories и вставьте следующий фрагмент над строкой Select Case:
Dim pnl As Panel
Dim sts As String
6. Вставьте следующий фрагмент под блоком Select... End Select:
' Получить количество объектов
sts = IvwItems.Listltems.Count & " Объектов"
' Обновить строку состояния
With stsStatus. PanelsO)
.Text = sts
End With
7. В процедуре события Form_Resize приведите две строки под операторами Move к следующему виду:
tvwCategories.Move О,О,midl,ScaleHeight-stsStatus.Height
lvwltems.Move mid2,0,ScaleWidth-mid2,ScaleHeight-stsStatus.Height
8. Сохраните и запустите проект.
На рис. 3.24 изображена строка состояния с тремя панелями. На левой панели выводится количество объектов в табличном списке. В средней панели выводится текущее время, а в правой — дата.
Аналогичным образом можно настроить строку состояния для ваших собственных приложений. Все зависит только от вашего воображения!
Рис. 3.24. Строка состояния в программе Object Explorer
Что нового мы узнали?
В этом уроке мы научились:
Пользоваться элементами, находящимися на панели элементов. 0 Группировать элементы в рамках.
Координировать работу списков дисков, каталогов и файлов. 0 Добавлять элементы на панель.
Пользоваться элементами для создания интерфейса в стиле Проводника Windows.
УРОК
Работа с модулями и классами
Модули и классы
Создание программной библиотеки
Процедуры
Функции
Передача параметров функциям и подпрограммам
Работа с модулями
Использование Class Builder
До сих пор примеры программ выглядели весьма тривиально. Весь код, с которым нам приходилось работать, содержался в процедурах событий форм. Но для того, чтобы пользоваться расширенными возможностями Visual Basic, придется отказаться от этого ограниченного подхода. В частности, вы научитесь создавать собственные процедуры и модули. В предыдущем разделе нам уже встречался пример простейшего модуля, но вскоре вам наверняка захочется дополнить его. Расширение библиотеки классов позволяет уделять больше времени проектированию программ, нежели их непосредственному кодированию.
Модули и классы
В предыдущих уроках мы успели рассмотреть два важнейших «строительных блока» Visual Basic — формы и элементы. Настало время заняться третьим видом «блоков» — программными модулями (или просто модулями). Программный модуль представляет собой текстовый ASCII-файл, содержащий подпрограммы, функции, переменные и/или константы. На самом деле мы уже пользовались модулями в предыдущих уроках, но сейчас мы подробно изучим, как они работают. Программный модуль похож на ящик с инструментами. Представьте себе, что у вас в одном ящике хранятся молоток, отвертка, различные гвозди и шурупы. Молоток и гвозди соответствуют процедурам программного модуля, а гвозди и шурупы — переменным (или данным). Теперь представьте, что гвозди не разложены по отдельным коробкам, а валяются в ящике вместе с остальными инструментами. Примерно так устроен простейший программный модуль.
ПОДСКАЗКАМодули представляют собой текстовые ASCII-файлы с программным кодом. В них удобно группировать взаимосвязанные процедуры, которые могут использоваться в программе.
Код проекта может состоять из множества программных модулей. Например, молоток и отвертку можно хранить в одной коробке, а гвозди и шурупы — в другой. Подобная структурная организация упрощает чтение программы. Все это, конечно, хорошо, но представьте себе рабочего-строителя, которому приходится таскать с собой множество ящиков с инструментами и коробочек с гвоздями и шурупами. Было бы намного удобнее иметь один ящик для молотка и отвертки со специальными отделениями для каждого типа гвоздей. Аналогичная возможность предусмотрена и в Visual Basic — вам понадобится модуль класса, чаще именуемый просто классом.
Классы представляют собой основные строительные блоки объектно-ориентированного программирования (ООП) — модели, при которой программа описывается в виде совокупности объектов. Класс не только позволяет выделить часть функциональных средств программы в отдельный объект, но и расширяет возможности базовых модулей — вы можете защитить одни фрагменты программы, а другие — предоставить в распоряжение программы. Этот процесс называется инкапсуляцией. Программные объекты, конструируемые в ООП, имитируют поведение объектов реального мира.
Как и элементы, о которых говорилось в уроке 3, классы обладают свойствами, методами и событиями, предназначенными для выполнения взаимосвязанных операций. Хорошо спроектированный класс представляет собой вполне самостоятельный фрагмент программы. Это означает, что вы можете перенести класс из одного проекта в другой, и он будет нормально работать без каких-либо исправлений. Объекты и ООП подробно рассматриваются в уроке 15.
Поскольку модули содержатся в отдельных файлах, их можно включать сразу в несколько проектов. Таким образом, появляется возможность повторно использовать написанный код. Например, у меня есть несколько модулей, содержащих взаимосвязанные процедуры. В одном модуле хранятся функции для работы с диалоговыми окнами, которыми я пользуюсь в своих программах. В другом модуле объединены функции, упрощающие работу с мультимедиа-устройствами. Группируя однородные функции в пределах одного модуля, вы создаете программную библиотеку. Если поместить модули в один каталог или логически связанный набор подкаталогов, их можно будет использовать в других проектах.
Использование программных библиотек экономит время, поскольку вам не придется заново создавать уже написанный код. Продолжая метафору с инструментами, можно сказать, что программная библиотека напоминает грузовик для перевозки инструментов и припасов. В нем помещается много ящиков, содержащих различные инструменты; в одном ящике лежат молотки и отвертки, в другом -кисти и ролики для краски. Различные типы данных находятся в одной библиотеке, но при этом не смешиваются друг с другом.
Другое преимущество программных библиотек заключается в том, что после отладки их содержимое можно смело использовать в других проектах. Вы получаете в свое распоряжение набор инструментов с пожизненной гарантией: вам уже не придется ходить по магазинам и покупать новое оборудование для каждого нового задания! Перед тем как приступать к модулям и классам, давайте создадим программную библиотеку, в которой вы начнете коллекционировать свои собственные программные средства.