Модель программирования Component Object Model. Разработка COM-сервера, страница 42

¨  Окружения (ambient properties) — свойства среды, в которую помещается данный элемент управления. Эти свойства не могут быть изменены, но элемент управления может использовать их для настройки своего внешнего вида. Например, свойство AmbientBackColor, содержащее цвет фона контейнера, позволяет элементу управления установить то же цвет фона. Другим полезным свойством окружения является UserMode, позволяющим элементу управления определить, находится ли контейнер в стадии разработки или активно используется. Дело в том, что часто элемент управления в процессе разработки и в процессе использования ведет себя по разному. Доступ к этим свойствам осуществляется через заданный по умолчанию интерфейс IDispatch.

¨  Внешние (extended properties) — свойства, контролируемые контейнером. Как правило, это размер элемента управления и расположение его на экране.

¨  Пользовательские (custom properties) — создаются разработчиком элемента управления.

Интерфейс пользователя в процессе разработки

Некоторые контейнеры элементов управления такие, как Visual Basic, выводят окно свойств, позволяющее разработчику непосредственно проверять и изменять свойства элемента управления. Другие, к которым относится и Visual C++, не предоставляют такую возможность. Поэтому элементу управления должна быть предоставлена возможность проверки и изменения разработчиком своих свойств.

Для реализации интерфейса разработки используются страницы свойств. Каждая из этих страниц представляет собой отдельный объект COM, взаимодействующий с контейнером через интерфейс IPropertyPage или IPropertyPage2. Для получения информации о станицах свойств, поддерживаемых элементом управления, контейнер вызывает метод ISpecifyPropertyPages::GetPage. Метод GetPage записывает в структуру CAUUID указатель на массив идентификаторов CLSID страницы свойств и счетчик числа элементов массива. После этого контейнер может создать рамку свойств, создающую экземпляры каждого объекта страницы свойств.

Рамка также создает для каждой страницы свойств экземпляр рамки места страницы свойств. Каждый экземпляр рамки места страницы свойств экспортирует интерфейс IPropertyPageSite и соответствующую ему страницу свойств, после чего они начинают обмениваться информацией друг с другом. Страница свойств извещает объект рамки места страницы свойств об изменениях значений свойств вызовом метода IPropertyPageSite::OnStatusChange.

Для облегчения процедуры создания окон свойств в COM включены функции OleCreatePropertyFrame и OleCreatePropertyFrameIndirect. Эти функции создают диалоговое окно, содержащее все страницы свойств, которые передаются им в процессе вызова. Они также создают все необходимые объекты рамки места страницы свойств и осуществляют обмен информацией между страницами свойств и рамкой.

Обеспечение живучести свойств

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

Живучесть элемента управления ActiveX реализована в наборе интерфейсов COM. Наиболее важными из них являются IPersistStreamInit, IPersistStorage и IPersistPropertyBag. Интерфейс IPersistStreamInit позволяет контейнеру требовать от элемента управления загрузить свои сохраненные данные из потока или записать их в поток. Поток представляет собой простейшую файловую структуру, предоставляющую элементу управления потоковую структуру (поток байтов). При вызове метода IPersistStreamInit::InitNew контейнер сообщает элементу управления, что производится его первая инициализация. Интерфейс IPersistStorage позволяет контейнеру требовать от элемента управления загрузить свои сохраненные данные из памяти или записать их в память. Память (storage) представляет собой объект, способный создавать управлять потоками и другими средствами хранения информации. Интерфейс IPersistPropertyBag позволяет контейнеру требовать от элемента управления загрузить свои сохраненные данные или записать их в текстовом виде.