Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Прога лабы 5 семестр

.pdf
Скачиваний:
20
Добавлен:
11.02.2015
Размер:
728.33 Кб
Скачать

21

поле Optional Property Name (см. рис. 17). После выполнения всех этих действий щелкнуть на кнопке OK. Окно ClassWizard должно выглядеть так, как представлено на рисунке 18.

Рис. 17. Диалоговое окно Add Member Variables для свойства shape

Рис. 18. Вкладка Memeber Variables

22

Для добавления стандартной страницы свойств (например Color), необходимо открыть файл ButtonCtl.cpp и изменить таблицу страниц свойств, определяющую все страницы свойств, предоставляемые элементом, в соответствии со следующим фрагментом программы.

BEGIN_PROPPAGEIDS(CButtonCtrl, 2)

PROPPAGEID(CButtonPropPage::guid)

PROPPAGEID(CLSID_CColorPropPage)

END_PROPPAGEIDS(CButtonCtrl)

23

ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ

1.Измените OnDraw, так чтобы цвет эллипса менялся с зелёный на синий.

2.Измените кнопку так, чтобы в красный прямоугольник был вписан зеленый эллипс и по левому щелчку мыши цвет прямоугольника менялся на синий.

3.Добавьте событие, по правому щелчку мыши кнопка должна менять форму (свойство shape).

4.Добавьте свойство visible и методы get/set такие, что при одном значении свойства кнопка будет видимой, а при другом значении нет. Сделайте необходимые изменения в странице свойств. Если необходимо исправьте код функции OnDraw.

5.Измените функцию OnDraw так, чтобы ширина кнопки уменьшилась.

6.Измените кнопку так, чтобы в красный прямоугольник был вписан зеленый эллипс и по левому щелчку мыши цвет эллипса менялся на синий.

7.Добавьте в страничку свойств ещё один checkbox, который отвечает за свойство select.

8.Измените OnDraw, так чтобы цвет эллипса менялся с синего на черный.

9.Измените функцию OnDraw так, чтобы высота кнопки уменьшилась.

10.Измените цвет переднего плана на чёрный.

КОНТРОЛЬНЫЕ ВОПРОСЫ

1.Как добавить в проект стандартную страничку свойств?

2.Для чего необходима пара макросов BEGIN_PROPPAGEIDS и END_PROPPAGEIDS?

3.Что такое контекст устройства?

4.Объясните строчку: Bool ButtonCtrl::SetSelect(bool bNewValue).

5.Что такое конструктор класса, сколько их должно быть и когда вызывается конструктор класса?

6.Что такое полиморфизм, и где в лабораторной работе использовалось это свойство объектно-ориентированного программирования.

7.В тексте программы встречается строчка

fBrush.CreateSolidBrush (GetSelect()?RGB(255, 0, 0):RGB (0, 255, 255));

Какого цвета будет кнопка, если переменная m_select=3 и почему. Изменится ли цвет, если переменная m_select примет значение (-1).

8.Приведите пример события, отличного от используемого в лабораторной работе?

9.Где можно отредактировать страничку свойств?

10.Какая функция используется для закрашивания прямоугольника?

24

ЛАБОРАТОРНАЯ РАБОТА №3

РАЗРАБОТКА ЭЛЕМЕНТА УПРАВЛЕНИЯ ACTIVEX С ИСПОЛЬЗОВАНИЕМ БИБЛИОТЕКИ ШАБЛОНОВ (ATL)

Цель работы: Освоить основные этапы разработки объектов Active X с помощью ATL, на примере создания собственного объекта-многоугольника.

Ход работы:

1.Создание проекта.

2.Добавление элемента управления в проект.

3.Добавление свойства элементу управления.

4.Изменение кода отвечающего за отрисовку элемента.

5.Добавление страницы свойств.

Общие понятия

ATL (Active Template Library) – это библиотека шаблонов классов С++, позволяющая создавать СОМ-объекты. Библиотека содержит базовые классы, реализующие функциональность любого СОМ-объекта, классы реализующие основные интерфейсы OLE и ActiveX, а также вспомогательные классы для реализации обычных и диалоговых окон, для описания исполняемых модулей, хранения строк и т.п.

При использовании библиотеки шаблонов новый класс создаётся путём подстановки других классов в качестве параметров шаблона, а не путём наследования, как в обычных библиотеках (например, MFC).

Создание проекта

В среде Visual C++ выберете File/New, затем вкладку Projects. Затем выберете тип проекта ATL COM AppWizard. В качестве имени проекта выберете Polygon (рис. 19). В поле Location указать путь к папке файлов проекта D:\Education.

25

Рис. 19. Выбор типа проекта.

Нажмите OK и мастер создания приложения предложит вам несколько вариантов для конфигурирования начального ATL проекта (рис.20).

26

Рис. 20. Выбор типа сервера.

Так мы создаём элемент управления, то в качестве типа сервера выберем динамическую библиотеку (DLL). Нажмите Finish. Мастер создания приложения (ATL COM AppWizard) автоматически создаст несколько файлов, основные из которых:

Polygon.cpp

Содержит реализацию функций DllMain, DllCanUnloadNow, DllGetClassObject,

 

DllRegisterServer and DllUnregisterServer. Также содержит карту объекта, которая

 

является списком ATL объектов вашего проекта. Она изначально пуста, так как вы

 

ещё не создали ни одного объекта.

 

 

Polygon.def

Стандартный файл определений Windows для DLL.

 

 

Polygon.dsw

Файл проекта.

 

 

Polygon.dsp

Файл, содержащий настройки проекта.

 

 

Polygon.idl

Файл описывающий интерфейсы вашего проекта. Файл написан на языке описания

 

интерфейсов (IDL).

 

 

Чтобы сделать Polygon DLL полезной необходимо добавить элемент управления,

используя ATL Object Wizard.

27

Добавление элемента управления

Для того чтобы добавить объект в ATL проект используйте ATL Object Wizard. Выберете Insert / New ATL Object и увидите окно, показанное на рис.21.

Рис. 21. Добавление объекта в ATL проект

В окне Category выберете Controls, а в окне Objects – Full Control. Нажмите Next.

Появится окно изображённое на рис. 22.

Рис. 22. Свойства добавляемого объекта

В поле Short Name введите PolyCtl, остальные поля заполнятся автоматически. Внимание! Не торопитесь нажимать клавишу OK.

Поле Class определяет имя С++ класса, создаваемого для реализации элемента управления. Поля .H File and .CPP File определяют файлы содержащие определение С++ класса. Поле CoClass определяет имя компонентного класса для данного элемента управления. Поле

28

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

Выберете вкладку Attributes. Отметьте пункты Support ISupportErrorInfo и Support Connection Points (для поддержания исходящих интерфейсов в IDL файле).

Выберете вкладку Stock Properties (стандартные свойства) (рис. 23).

Рис. 23. Вкладка стандартных свойств

Добавим в список поддерживаемых свойств (Supported) свойство FillColor (залить цветом), так как мы будем заливать наш многоугольник (polygon). Нажмите OK.

ATL Object Wizard создал ещё несколько файлов:

PolyCtl.h

Содержит реализацию (большую часть) класса CPolyCtl.

 

 

PolyCtl.cpp

Содержит оставшиеся части класса CPolyCtl.

 

 

PolyCtl.rgs

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

 

 

PolyCtl.htm

HTML файл, который содержит ссылку на разрабатываемый элемент управления.

 

Таким образом, мы можем увидеть наш элемент управления в окне браузера.

 

 

Теперь соберём проект. В меню Build выберете Build Polygon.dll (или F7). Протестируем наш элемент в ActiveX Control Test Container-e (меню Tools). В тест контейнере выберете Insert New Control из меню Edit, затем выберете PolyCtl class. Вы должны увидеть прямоугольник с надписью "ATL 3.0 : PolyCtl". Закройте тест контейнер.

29

Добавление свойства элементу управления

Интерфейс IPolyCtl содержит пользовательские методы и свойства.

Рис. 24. Добавление свойства

В качестве типа выберете short, а в качестве имени свойства – Sides (рис.25).

30

Рис. 25. Ввод параметров свойства

Данный диалог добавляет get и put функции (get_Sides и put_Sides) в файлы PolyCtl.h и PolyCtl.cpp (определение и реализацию(пустую) соответственно). Для установки и получения значения свойства необходимо иметь переменную, которая бы хранила это свойство. Откройте файл PolyCtl.h (через вкладку File View) и вставьте следующую строчку после объявления переменной m_clrFillColor:

OLE_COLOR m_clrFillColor;

short m_nSides;

POINT m_arrPoint[100;]

Теперь реализуем get и put методы. Вам необходимо добавить код в функции get_Sides и put_Sides, чтобы они выглядели следующим образом:

STDMETHODIMP CPolyCtl::get_Sides(short *pVal)

{

*pVal = m_nSides; return S_OK;

}

STDMETHODIMP CPolyCtl::put_Sides(short newVal)

{

if (newVal > 2 && newVal < 101)

{

m_nSides = newVal; return S_OK;

}

else