Введение в программирование элемента управления VB.NET с наследованием

Создание полных пользовательских компонентов может быть очень сложным проектом. Но вы можете создать класс VB.NET, обладающий многими преимуществами компонента панели инструментов, с гораздо меньшими усилиями. Вот как!

Чтобы получить представление о том, что вам нужно сделать для создания полноценного пользовательского компонента, попробуйте этот эксперимент:

-> Откройте новый проект приложения Windows в VB.NET.
-> Добавьте Установите флажок из панели инструментов в форму.
-> Нажмите кнопку «Показать все файлы» в верхней части обозревателя решений.

Это отобразит файлы, которые Visual Studio создает для вашего проекта (так что вам не нужно). Историческая сноска: компилятор VB6 делал много того же, но вы никогда не могли получить доступ к коду, потому что он был похоронен в скомпилированном «p-коде». Вы также можете разрабатывать собственные элементы управления на VB6, но это было намного сложнее и требовало специальной утилиты, которую Microsoft предоставила именно для этой цели.

В форме Designer.vb , вы обнаружите, что приведенный ниже код был автоматически добавлен в нужные места для поддержки компонента CheckBox. (Если у вас другая версия Visual Studio, ваш код может немного отличаться.) Это код, который Visual Studio пишет для вас.

 
 'Требуется частными компонентами конструктора форм Windows _ Как System.ComponentModel.IContainer'ПРИМЕЧАНИЕ: Конструктор форм Windows требует выполнения следующей процедуры.' Ее можно изменить с помощью конструктора форм Windows. '  не изменять его с помощью редактора кода.  _Private Sub InitializeComponent () Me.CheckBox1 = New System.Windows.Forms.CheckBox () Me.SuspendLayout () 'CheckBox1' Me.CheckBox1.AutoSize  = Верно Me.CheckBox1.Location = Новая System.Drawing.Point (29, 28) Me.CheckBox1.Name = "CheckBox1".  .  .  и так далее ... 

Это код, который вы должны добавить в свою программу для создания настраиваемого элемента управления. Помните, что все методы и свойства фактического элемента управления CheckBox находятся в классе, предоставляемом .NET Framework: System.Windows.Forms.CheckBox . Это не часть вашего проекта, потому что он установлен в Windows для всех программ .NET. Но его существует .

Еще один момент, о котором следует помнить, – это то, что если вы используете WPF (Windows Presentation Foundation) класс .NET CheckBox происходит из совершенно другой библиотеки с именем System.Windows.Controls . Эта статья работает только для приложения Windows Forms, но принципы наследования здесь работают для любого проекта VB.NET.

Предположим, вашему проекту нужен элемент управления, который очень похоже на один из стандартных элементов управления. Например, флажок, который меняет цвет или отображает крошечное «счастливое лицо» вместо небольшого графического изображения «галочки». Мы собираемся создать класс, который сделает это, и покажем вам, как добавить его в ваш проект. Хотя это может быть полезно само по себе, настоящая цель – продемонстрировать наследование VB.NET .

Давайте начнем кодирование

Для начала измените имя CheckBox, который вы только что добавили в oldCheckBox . (Возможно, вы захотите снова отключить отображение «Показать все файлы», чтобы упростить обозреватель решений.) Теперь добавьте новый класс в свой проект. Есть несколько способов сделать это, в том числе щелкнуть проект правой кнопкой мыши в обозревателе решений и выбрать «Добавить», затем «Класс» или выбрать «Добавить класс» в пункте меню «Проект». Измените имя файла нового класса на newCheckBox , чтобы все было прямо. Наконец, откройте окно кода для класса и добавьте этот код:

 
 Открытый класс newCheckBox наследует CheckBox Private CenterSquareColor как цвет  = Color.Red Защищено переопределяет Sub OnPaint (ByVal pEvent _ As PaintEventArgs) Dim CenterSquare _ As New Rectangle (3, 4, 10, 12) MyBase.OnPaint (pEvent) Если Me.Checked, то pEvent.Graphics.FillRectangle (New SolidBrush (  CenterSquareColor), CenterSquare) End If End SubEnd Class 

(В этой и других статьях на сайте используется множество продолжений строк, чтобы строки оставались короткими поэтому они умещаются в пространстве, доступном на веб-странице.)

Первое, на что следует обратить внимание в вашем новом коде класса, – это Inherits ключевое слово. Это означает, что все свойства и методы CheckBox VB.NET Framework автоматически являются его частью. Чтобы оценить, сколько работы это экономит, вы должны попробовать запрограммировать что-то вроде компонента CheckBox с нуля.

В коде есть два ключевых момента, на которые следует обратить внимание. выше:

Во-первых, код использует Override для замены стандартного поведения .NET, которое будет иметь место для OnPaint . Событие OnPaint запускается всякий раз, когда Windows замечает, что часть вашего дисплея должна быть восстановлена. Примером может служить другое окно, открывающее часть вашего дисплея. Windows обновляет отображение автоматически, но затем вызывает событие OnPaint в вашем коде. (Событие OnPaint также вызывается при первоначальном создании формы.) Итак, если мы переопределим OnPaint, мы сможем изменить внешний вид изображения на экране.

Во-вторых, Visual Basic создает CheckBox. Каждый раз, когда родительский элемент «Проверено» (то есть Me.Checked имеет значение True ), тогда новый код, который мы предоставляем в нашем классе NewCheckBox, изменит цвет центра CheckBox вместо рисования галочки.

Остальное – это то, что называется кодом GDI +. Этот код выбирает прямоугольник того же размера, что и центр флажка, и окрашивает его с помощью вызовов методов GDI +. «Магические числа» для расположения красного прямоугольника «Прямоугольник (3, 4, 10, 12)» были определены экспериментально. Я просто изменил его, пока он не стал выглядеть правильно.

Есть один очень важный шаг, который вы хотите убедиться, что вы не пропустите процедуры переопределения:

 
 MyBase.OnPaint (pEvent) 

Переопределение означает, что ваш код предоставит весь код для события. Но это редко то, что вам нужно. Таким образом, VB предоставляет способ запуска обычного кода .NET, который был бы выполнен для события. Это заявление, которое делает это. Он передает тот же самый параметр – pEvent – коду события, который был бы выполнен, если бы он не был переопределен, MyBase.OnPaint.

Использование Новый элемент управления

Поскольку наш новый элемент управления отсутствует в нашем наборе инструментов, он должен быть создан в форме с кодом. Лучше всего это сделать в форме Load процедуры обработки события.

Откройте окно кода для события загрузки формы. процедуру и добавьте этот код:

 
 Private Sub frmCustCtrlEx_Load (ByVal sender As System.Object, ByVal e As System.EventArgs  ) Обрабатывает MyBase.Load Dim customCheckBox как новый newCheckBox () с customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox.Left .Top = oldCheckBox.Top + oldCheckBox.Height .Size = NewCheckBox.Size = NewCheckBox.  , oldCheckBox.Size.Height) End With Controls.Add (customCheckBox) End Sub 

Чтобы разместить новый флажок в форме, мы воспользовались тот факт, что там уже есть один, и только что использовались его размер и положение (отрегулировано так, чтобы свойство Text соответствовало). В противном случае нам пришлось бы кодировать позицию вручную. Когда MyCheckBox был добавлен в форму, мы добавляем его в коллекцию Controls.

Но этот код не очень гибкий. Например, красный цвет жестко запрограммирован, и изменение цвета требует изменения программы. Вам также может понадобиться рисунок вместо галочки.

Вот новый, улучшенный класс CheckBox. Этот код показывает вам, как сделать некоторые из следующих шагов на пути к объектно-ориентированному программированию на VB.NET.

 
 Public Class betterCheckBox  Наследует CheckBox Private CenterSquareColor как Color = Color.Blue Private CenterSquareImage как растровое изображение Private CenterSquare как новый прямоугольник (3, 4, 10, 12) Защищенное переопределяет Sub OnPaint _ (ByVal pEvent As _ System.Windows.Forms.PaintEventArgs) MyBase.OnPaint (  pEvent) If Me.Checked Then If CenterSquareImage Is Nothing, то pEvent.Graphics.FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) Остальное pEvent.Graphics. DrawImage (CenterSquareImage, CenterSquare) End If End If End Sub Public Property FillColor () As Color Get FillColor = CenterSquareColor End Get Set (ByVal Value As Color) CenterSquareColor = Value End Set End Property Public Property FillImage () As Bitmap Get FillImage = CenterSquareImage  End Get Set (ByVal Value As Bitmap) CenterSquareImage = Value End Set End PropertyEnd Class 

Почему версия BetterCheckBox лучше

Одно из основных улучшений – добавление двух свойств . Старый класс вообще этого не делал.

Два новых свойства:


FillColor

и

 
 FillImage 

Чтобы получить представление о том, как это работает в VB.NET, попробуйте этот простой эксперимент. Добавьте класс в стандартный проект, а затем введите код:

 
 Public Property Whatever Get 

Когда вы нажимаете Enter после ввода «Get», VB.NET Intellisense заполняет весь блок кода свойства, и все, что вам нужно сделать, это закодировать особенности вашего проекта. (Блоки Get и Set не всегда требуются, начиная с VB.NET 2010, поэтому вам нужно хотя бы сообщить Intellisense об этом, чтобы запустить его.)

 
 Открытое свойство Независимо от значения Get End Get Set (значение ByVal) Свойство End SetEnd 

Эти блоки были завершены в коде выше. Целью этих блоков кода является обеспечение доступа к значениям свойств из других частей системы.

С добавлением методов вам будет хорошо. на пути к созданию готового компонента. Чтобы увидеть очень простой пример метода, добавьте этот код под объявлениями Property в классе betterCheckBox:

 
 Public  Sub Emphasize () Me.Font = New System.Drawing.Font (_ "Microsoft Sans Serif", 12.0 !, _ System.Drawing.FontStyle.Bold) Me.Size = New System.Drawing.Size (200, 35) CenterSquare  .Offset (CenterSquare.Left - 3, CenterSquare.Top + 3) End Sub 

Помимо настройки шрифта, отображаемого в CheckBox, этот метод также регулирует размер поля и расположение отмеченного прямоугольника для учета нового размера. Чтобы использовать новый метод, просто закодируйте его так же, как и любой другой метод:

 
 MyBetterEmphasizedBox.Emphasize () 

И так же, как Properties, Visual Studio автоматически добавляет новый метод в Microsoft Intellisense!

Основная цель здесь – просто продемонстрировать, как кодируется метод. Возможно, вы знаете, что стандартный элемент управления CheckBox также позволяет изменять шрифт, поэтому этот метод не добавляет много функций.

Следующая статья в эта серия, Программирование пользовательского VB. NET Control – Beyond the Basics !, демонстрирует метод, который работает, а также объясняет, как переопределить метод в настраиваемом элементе управления.

Оцените статью
recture.ru
Добавить комментарий