ООП, лекция 5 Разработка элементов управления WinForms Соломатин Д.И., ПиИТ, ФКН, ВГУ

ООП, лекция 5
Разработка
элементов управления WinForms

Соломатин Д.И., ПиИТ, ФКН, ВГУ
solomatin@cs.vsu.ru
Компонентно-ориентированный подход к разработке ПО
Компонентно-ориентированный подход к разработке ПО – технология разработки ПО, при котором конечный продукт собирается из готовых программных компонентов, как стандартных, так и разработанных специально под задачу.

Компонент с точки зрения компонентно-ориентированного подхода
Компонент – независимый модуль программного кода, предназначенный для повторного использования и развертывания
Компоненты разрабатываются в рамках какой-либо компонентной модели
Часто компонентная модель независима по отношению к языку и инструментам разработки
Пример – компонентная модель COM (Component Object Model) / DCOM (Distributed COM)
Существуют и др. модели: Corba, Java Bean и т.д.
Компонентно-ориентированный подход в сравнении с ООП
В некотором смысле является развитием объектно-ориентированного программирования
Практически более пригоден для разработки крупных и распределенных систем
Не является новой парадигмой программирования
Преимущества и недостатки компонентной разработки
Преимущества:
Ускорение разработки
Можно сосредоточится на разработке только бизнес-логики приложения
Удешевление разработки
Серийное ПО всегда дешевле индивидуальных разработок
Повышение качества продукта
Качество серийных компонентов по определению выше качества единичных модулей
И т.п.
Недостатки:
«Закрытость» компонентов
Как правило, компоненты поставляются в виде «черного ящика», без исходных текстов
Для сложных компонентов даже наличие исходных текстов ситуацию не меняет – разобраться неподготовленному человеку невозможно
Зависимость от разработчика используемых компонентов
Необходимость поиска и изучения компонентов

Интернет-репозитарии компонентов
http://www.componentsource.co.uk

Разработка компонентов – отдельная индустрия.
Сторонние компоненты, как правило, стоят денег.
Компоненты и элементы управления
Часто под компонентами понимают только визуальные компоненты, но это неправильно (см. определение компонента)
Для ясности визуальные компоненты будем называть
элементами управления
или
контролами
Компоненты в .NET
Реализуют интерфейс System.ComponentModel.IComponent
Как правило, наследуются от System.ComponentModel.Component
Интерактивная работа с компонентами поддерживается в Visual Studio
Элементы управления в WinForms
Наследуются от System.Windows.Forms.Control
Специализированные элементы управления
Повторно-используемые элементы управления общего назначения, которые разрабатываются и распространяются независимо от приложения
Пользовательские элементы управления
Наследуются System.Windows.Forms.UserControl
Разрабатываются визуально в дизайнере форм (также как формы)
Как правило, используются только в одном приложении для группировки компонентов, которые в данном сочетании повторяются в этом приложении несколько раз
Иерархия классов компонентов и элементов управления
Компоненты и элементы управления в Visual Studio
Простейший специализированный элемент управления
Борьба с мерцанием элементов управления при перерисовке
Мерцание происходит из-за того, что сначала перерисовывается фон, а затем определенная программистом графика
Борьба
Переопределить метод OnPaintBackground на пустой, т.е. поручить всю перерисовку методу OnPaint
Установить свойство AllPaintingInWmPaint в true , т.е. поручить всю перерисовку методу OnPaint

С помощью protected свойства DoubleBuffered при разработке элемента управления указать, что необходимо использовать при перерисовке буфер, т.е. вначале прорисовывать элемент управления в память, а только затем получившуюся картинку на форму
Ведет к значительный расходу памяти, пропорционально размерам элемента управления
Добавление свойств
Добавление событий
События с дополнительными параметрами
Создать NewEventArgs наследника от EventArgs, описав в нем дополнительные свойства
Описать новый тип делегата делегата NewEventHandler c сигнатурой
void (object sender, NewEventArgs e)

Объявить в компоненте/контроле событие с типом NewEventHandler
При вызове события в контроле передавать экземпляр NewEventArgs с установленными дополнительными свойствами
Компоненты в режиме разработки
Редактирование компонентов обеспечивается редактором среды разработки (Visual Studio)
В случае простых компонентов существующих возможностей редактора достаточно
Для сложных компонентов (работа со сложными типами данных, работа с коллекциями, взаимодействие компонентов и т.д.) встроенных возможностей может оказаться недостаточно.
Поэтому в .NET предусмотрен механизмы расширения функциональности редактора среды разработки.
Т.о. вместе с разработкой собственно компонента иногда требуется разработать дополнительные расширения для редактора среды разработки, обеспечивающие удобство работы с конкретным компонентом
Режим разработки
Дополнительное описание свойств компонентов
Редактирование сложных свойств
Отдельные редакторы компонентов
Сериализация компонентов (состояния компонентов) в код инициализации компонентов
Основные атрибуты при описания свойств компонентов
На уровне свойства
Category – указывает, в какую категорию в редакторе свойств (элементе управления PropertyGrid) поместить свойство
Description – текстовое описание свойства, отображается в окне Properies
DefaultValue – значение свойства по умолчанию
если у свойства будет установлено такое значение, то код его установки дизайнером форм не будет добавлен в метод InitializeComponent в файле *.designer.cs)
Bindable – указывает, что данное свойство может быть привязано к источнику данных
Основные атрибуты при описания свойств компонентов (продолжение)
На уровне свойства
Browsable – указывает, отображать ли свойство в редакторе свойств
EditorBrowsable – указывает, отображать ли свойство в редакторе исходного кода
DesignerSerializationVisibility – устанавливает режим сохранения значения свойства в код в
Сохранение результатов редактирования компонента в исходный код
При создании форм в Visual Studio класс формы описывается в двух файлах:
.designer.cs – файл, в котором в виде кода создания формы в методе InitializeComponent() сохраняются результаты визуального редактирования формы (файл, в котором вручную ничего не редактируется)
.cs – файл, в котором собственно происходит описание класса формы (поля, свойства, методы, за исключением результатов работы дизайнера)

Сохранение результатов редактирования компонента в исходный код
Как видно из предыдущего слайда значения различных свойств компонента представляются в коде по-разному
в виде простых типов
в виде объектов
и т.д.

В случае простых свойств (простых типов), как сериализовать значения свойств в код интуитивно понятно, но свойства могут быть сложных типов (классов, коллекций)
Для сложных типов необходимо наличие механизма, позволяющего описывать, как то или иное свойство (или тип данных) должен быть представлен в коде
Поддержка компонентов в режиме разработки
Реализуется с помощью:
Дизайнеров
Конвертеров типов
Редакторов типов
Для компонентов специфические дизайнеры/конвертеры/редакторы назначаются с помощью атрибутов
Конвертеры типов