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

OBJECT_ENTRY_AUTO(__uuidof(GraphProp), CGraphProp)

Новый класс CGraphProp поддерживает функциональность страницы свойств и окна диалога. Однако, запустив сервер и вызвав из контектного меню его свойства, вы не увидите новой страницы. Там будут только те две страницы, которые были и до того, как вы подключили поддержку страницы свойств. Для того, чтобы новая страница действительно попала в блок страниц элемента, надо ввести новый элемент в карту свойств разрабатываемого элемента COpenGL. Откройте файл OpenGL.h, найдите в нем карту свойств. Она начинается строкой:

BEGIN_PROP_MAP(COpenGL)

Введите в нее новый элемент:

PROP_ENTRY("Parameters", 1, CLSID_GraphProp)

который привязывает (binds) новую страницу к существующему блоку страниц свойств. Как видите, страница создается и связывается с объектом COpenGL по правилам COM, то есть с помощью уникального идентификатора ко-класса CLSID_GraphProp. Единица определяет индекс DISPID (dispatch identifier) — 32-х битный идентификатор, который используется упоминавшейся выше функцией Invoke для идентификации методов, свойств и аргументов. Карта свойств теперь должна выглядеть следующим образом:

BEGIN_PROP_MAP(COpenGL)

PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)

PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)

PROP_ENTRY("FillColor", DISPID_FILLCOLOR, CLSID_StockColorPage)

PROP_ENTRY("Parameters", 1, CLSID_GraphProp)

END_PROP_MAP()

Здесь важно уяснить, что одна строка типа PROP_ENTRY соответствует какой-то функциональности, скрытой в каркасе сервера. Например, стандартное свойство Fill Color реализовано с помощью одной переменной m_clrFillColor и пары функций FillColor, упоминания о которых вы видели в IDL-файле. Тела этих функций остались за кулисами. То же справедливо относительно страницы свойств.

Чтобы использовать функции библиотеки OpenGL, надо подключить их к проекту. На этапе компоновки они будут интегрированы в коды COM-сервера. Добавьте имена двух библиотек OpenGL в список библиотечных файлов, компонуемых вместе с нашей DLL.

opengl32.lib glu32.lib

Эти строки можно ввести в поле Additional Dependencies диалога Project4Properties (вкладка Linker4Input). Но того же результата можно добиться и по-другому — с помощью директив #pragma comment (lib. . .). Вспомните, что мы делали это в проектах OpenGL. Добавьте в файл stdafx.h такие директивы:

#pragma warning(disable : 4136)

#pragma warning(disable : 4305)

#pragma comment (lib, "opengl32.lib") // Эти директивы использует Linker

#pragma comment (lib, "glu32.lib")

#include <commctrl.h>

#include <math.h>  // Будем пользоваться математическими функциями

#include <vector>  // Будем пользоваться стандартным контейнером

using namespace std;

#include <GL/gl.h> // Будем пользоваться OpenGL

#include <GL/glu.h>

Вновь запустите приложение и убедитесь, что новая пустая страница свойств появилась в диалоге Properties. Позже мы вставим в нее 11 ползунков для управления параметрами освещения сцены, кнопку смены файла данных и combo-box для выбора режима заливки полигонов, а сейчас вернемся к классу COpenGL и будем заниматься созданием самого изображения.

Развитие класса COpenGL

Вместо тестового изображения с надписью ATL 7.0, которым мы научились кое-как управлять, мы собираемся поместить в окно COM-объекта OpenGL-изображение поверхности в трехмерном пространстве. Точнее, мы хотим дать клиенту нашего COM-объекта возможность пользоваться всей той функциональностью, которая была разработана в Windows-проекте OpenGL (если вы успели его выполнить). Вы помните, что там мы пользовались вспомогательным классом Point3D, который здесь нам тоже понадобится. Нужны будут и все переменные, которые были там использованы для управления сценой OpenGL. Сейчас мы введем эти данные в состав класса COpenGL.