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

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

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

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

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

В виде Designer.vb

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

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

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

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

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

Начнем кодирование

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

Открытый класс newCheckBox Наследует CheckBox Private CenterSquareColor As Color = Color. Защищено красным Переопределяет Sub OnPaint (ByVal pEvent _ As PaintEventArgs) Dim CenterSquare _ As New Rectangle (3, 4, 10, 12) MyBase. OnPaint (pEvent) Если я. Проверено тогда pEvent. Графика. FillRectangle (новый 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. Всякий раз, когда родитель "проверен" (то есть Мне. Проверено является Правда) затем новый код, который мы предоставляем в нашем классе NewCheckBox, перекрасит центр CheckBox вместо рисования галочки.

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

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

MyBase. OnPaint (pEvent)

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

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

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

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

Private Sub frmCustCtrlEx_Load (ByVal отправитель как система. Объект, ByVal и As System. EventArgs) Обрабатывает MyBase. Загрузить Dim customCheckBox как новый newCheckBox () с customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox. Слева .Top = oldCheckBox. Top + oldCheckBox. Высота. Размер = Новый размер (oldCheckBox. Размер. Ширина + 50, oldCheckBox. Размер. Высота) Конец управления. Добавить (customCheckBox) End Sub

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

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

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

Открытый класс betterCheckBox Наследует CheckBox Private CenterSquareColor As Color = Color. Blue Private CenterSquareImage As Bitmap Private CenterSquare As New Rectangle (3, 4, 10, 12) Защищенные переопределения Sub OnPaint _ (ByVal pEvent As _ System. Окна. Формы. PaintEventArgs) MyBase. OnPaint (pEvent) Если я. Затем проверяется, если CenterSquareImage ничего не значит pEvent. Графика. FillRectangle (Новый SolidBrush (CenterSquareColor), CenterSquare) Иначе pEvent. Графика. DrawImage (CenterSquareImage, CenterSquare) End If End If End Sub Открытое свойство FillColor () как цвет Получить FillColor = CenterSquareColor Окончание получить набор (значение ByVal как цвет) CenterSquareColor = Значение End Set End End Открытое свойство FillImage () As Bitmap Get FillImage = CenterSquareImage End Get Set (ByVal Value As Bitmap) CenterSquareImage = Значение End Set End End PropertyEnd Учебный класс

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

Одним из основных улучшений является добавление двух свойства. Это то, что старый класс вообще не делал.

Введены два новых свойства:

Цвет заливки

и

FillImage

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

Публичная собственность, что бы ни получить

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

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

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

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

Публичная саб. Шрифт = Новая Система. Рисунок. Шрифт (_ "Microsoft Sans Serif", 12.0!, _ Система. Рисунок. Стиль шрифта. Жирный) Я. Размер = Новая система. Рисунок. Размер (200, 35) CenterSquare. Смещение (CenterSquare. Слева - 3, CenterSquare. Top + 3) End Sub

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

MyBetterEmphasizedBox. Подчеркивать()

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

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

В следующей статье этой серии «Программирование пользовательского элемента управления VB.NET - помимо основ!» Показан метод, который делает, а также объясняется, как переопределить метод в пользовательском элементе управления.