Добавление
новых свойств
На следующем
шаге класс будет дополнен свойствами MinValue и MaxValue. Программная реализация
этих свойств выглядит весьма прямолинейно. При создании экземпляра переменным
присваиваются значения 1 и максимальное значение типа Long соответственно. В
дальнейшем необходимо проследить за тем, чтобы свойство MinValue не оказалось
меньше 1, а свойство MaxVal ue не превышало предельной величины:
Private m_Min As Long = 1
Private m_Max As Long = Long.MaxValue
Public Property
MinValue()As Long Get
Return m_Min
End Get SetCByVal Value As Long)
m_Min = Math.Maxd,Value)
End Set
End Property
Public Property
MaxValue()As Long Get
Return m_Max
End Get Set(ByVal Value As Long)
m_Max =Math.Min(m_Min.Value)
End Set
End Property
Если включить
этот код в проект и откомпилировать его, свойство будет поддерживаться элементом,
но не будет отображаться в окне свойств. Проблема решается установкой атрибута
Browsable для имени свойства:
<Browsable(True)>
Public Property MinValue
Примерный
вид окна свойств при установке атрибута Browsable для свойств MinValue и MaxValue
показан на рис. 8.18.
Рис.
8.18. Свойства MaxValue и MinValue в окне свойств
Как видите,
нестандартное свойство отображается в окне свойств, а свойства MaxValue и MinValue
выводятся с начальными значениями, которые им были присвоены. Еще интереснее
то, что окно свойств отвергает любые попытки изменения свойств способом, запрещенным
в программе (например, присваивание MinValue значения, меньшего 1).
Чтобы свойство
не отображалось в окне свойств, достаточно установить для него атрибут <Browsable(False)>.
Запрет может устанавливаться как для новых, так и для переопределяемых свойств.
Например, следующий фрагмент убирает стандартное свойство Text специализированного
текстового поля из окна свойств:
<Browsable(False)> Public Overrides
Property Text()
As String Get
Return MyBase.Text
End Get Set(ByVal
Value As String)
MyBase.Text = Value
End Set
End Property
Как видно
из рис. 8.19, свойство Text перестает отображаться в окне свойств.
Рис.
8.19. При установке атрибута Browsable свойство Text не отображается
Иерархия
пространства имен System.Windows.Forms
Рассмотрев
простейшие возможности использования пространства имен Windows . Forms на конкретных
примерах, мы переходим к иерархии классов, показанной на рис. 8.20.
Диаграмма
выглядит весьма устрашающе, но мы уделим основное внимание главной линии наследования:
System.ComponentModel
.Component > Control
Из рис. 8.20
видно, что классы форм и элементов являются производными от класса Control.
Например, генеалогия класса Form выглядит так:
ScrollableControl
>ContainerControl
> Form
Рис.
8.20. Иерархия классов пространства имен Windows.Forms
Текстовое
поле входит в другую ветвь:
Control
> TextBoxBase
> RichTextBox
> TextBox
Иерархия
основных разновидностей кнопочных элементов выглядит так:
Control
> ButtonBase
> Button
> CheckBox
> RadioButton
Класс Control
вмещает в себя наибольшее количество функций (более 300) и обладает наибольшими
функциональными возможностями. Классы форм и элементов объявляются производными
от членов класса Control.
Данная
глава дает лишь начальное представление о Windows.Forms. Чтобы овладеть возможностями
этого пространства имен на профессиональном уровне, необходимо тщательно изучить
электронную документацию и, возможно, купить более специализированную книгу.
Класс Component
является базовым классом для всех компонентов пространства имен System. Wi ndows.
Forms. В нем собраны члены, необходимые для реализации включения (в частности,
размещения элементов на форме или дочерних окон MDI в родительском окне MDI).
В основном они реализованы в виде методов интерфейса IComponent. Поскольку класс
Component также занимается освобождением ресурсов, расходуемых при визуальной
разработке, он реализует IDisposable.
Поскольку
класс Control является базовым для элементов и форм, он поддерживает
многие операции пользовательского интерфейса, в том числе обработку событий
клавиатуры и мыши. Кроме того, он определяет цвет, позицию и размер формы или
элемента.
Использование
средств базового класса Control (и в частности, обработка ключевых событий)
рассматривается в следующем разделе. Тем не менее сначала мы продолжим путь
к формам в иерархии классов System. Windows. Forms. Поскольку среди предков
класса Form числится ScrollableControl, формы VB обладают полезной особенностью,
которую оценит каждый, кто пытался реализовать форму с прокруткой в VB6:
При выходе
за грашцы текущего содержимого форма автоматически прокручивается. Взгляните
на рис. 8.21 — на нем изображена форма, позволяющая прокручивать очень большую
фрактальную картинку (более 5 Мбайт в запакованном виде!) с базовым множеством
Мандельброта. За информацией о множестве Мандельброта обращайтесь по адресу
www.olympus.net/personal/dewey/mandelbrot.htm.
Прокрутку
форм можно протестировать на любом изображении достаточно больших размеров:
- Разместите на форме
графическое поле и задайте его свойству SizeMode значение AutoSize.
- Найдите большой
графический файл.
Рис.
8.21. Прокрутка изображения базового множество Мандельброта
- Приведите процедуру
Form_Load к следующему виду:
1 Private Sub Forml_Load(ByVal sender As System.Object,_
ByVal e As System.EventArgs)Handles
MyBase.Load
2 Me.AutoScroll
= True
3 Me.VScroll
= True
4 Me.HScroll
= True
5 Dim aBigBox
As Rectangle = Rectangle.Inflate _
6 (Me.ClientRectangle.
6. 6)
7 PictureBoxl.Bounds
= aBigBox
8 ' Предполагается,
что графический файл находится в подкаталоге \bin
9 PictureBoxl.Image
= Image.FromFile("Mandelbrot Set.bmp")
10 End Sub
Главное место
в этом листинге занимает строка 2, в которой свойству AutoScrol 1, определяемому
в классе Scrollabl e Control, задается значение True. Без этого прокрутка работать
не будет. Строки 3 и 4 указывают на то, что в окне должны отображаться обе полосы
прокрутки (вертикальная и горизонтальная). В строке 5 общий метод класса System.Drawing.Rectangle
создает прямоугольный объект, в 6 раз больший клиентской области формы. Строка
7 приводит графическое поле к заданному размеру, присваивая прямоугольник свойству
Bounds, присутствующему во всех элементах. Как указано в комментарии, строка
9 предполагает, что файл с растровым изображением находится в подкаталоге \bin
каталога решения — в реальной программе для определения местонахождения файла
следовало бы вызвать диалоговое окно Open File.
Средства
базового класса Control
Класс Control
содержит более 300 членов, и описать их все (или хотя бы большую часть) в одной
главе просто невозможно. Следовательно, вам все равно придется обратиться к
электронной документации [ Кстати говоря, пакет форм Windows автоматически
опознает операции с колесом мыши и обеспечивает прокрутку формы/элемента там,
где это имеет смысл. Таким образом, в большинстве случаев вам не придется использовать
новое событие Control.MouseWheel. ]. Однако события клавиатуры и события
проверки, занимающие важное место в работе элементов, несколько отличаются от
своих прототипов из VB6, и при работе с ними следует помнить о некоторых нюансах.