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