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

Однако, как это часто бывает в жизни программиста, мы не увидим ничего, кроме пустой рамки объекта. В таком состоянии можно остаться надолго, если не хватает квалификации и опыта отладки COM DLL-серверов. Вначале не видны даже пути поиска причины отказа. Никаких грубых промахов, вроде бы не было. Процесс создания окна внедренного объекта происходит где-то за кадром.

Неточность закралась на начальной стадии создания заготовки ATL Control. Если опыта или знаний недостаточно, то надо все начинать заново, очень помгает рассматривать работающие примеры и скрупулезно сравнивать код. В такого рода занятиях я првел пару мучительных дней, но все-таки нашел причину отказа. Она, как это тоже часто бывает, оказалась очень простой и очевидной. Мы забыли установить один флажок при создании ко-класса, который устанавливает в TRUE переменную:

CComControl::m_bWindowOnly

Наш класс COpenGL, конечно же, унаследовал эту переменную. Она указывает COM, что элемент ActiveX должен создавать окно, даже если контейнер поддерживает элементы, не создающие окон. Приведем оригинальный текст: "m_bWindowOnly — Flag indicating the control should be windowed, even if the container supports windowless controls".

Я не вижу четкой логической связи этого текста с тем, что мы наблюдаем, но тем не менее установка флага помогает. Итак вставьте в конструктор нашего ко-класса "невинный" оператор:

m_bWindowOnly = TRUE;

Изображение псевдо-научной поверхности должно появиться в окне компонента, внедренного в окно клиентского приложения, каким является тестовый контейнер. Оно должно появиться и в окне компонента, внедренного в Word или Excell, или в любое другое приложение, являющееся контейнером COM-объектов. Проверьте это.

Диалог свойств

Далее рассмотрим, как развить функциональность новой страницы диалога свойств компонента COM. Создайте облик диалоговой страницы. Форма диалога уже существует, вы найдете ее в ресурсах ATL-приложения. Вставьте в нее элементы управления так, чтобы она приобрела вид, показанный на рисунке.

На рисунке показано окно диалога в активном состоянии, но вам еще предстоит поработать, чтобы довести его до этого вида. Здесь очень важно не торопиться и быть внимательным. Опыт подтверждает, что большая часть ошибок вносится на стадии работы с ресурсами. Визуальные редакторы расслабляют внимание и ошибки появляются там, где вы меньше всего их ждете.

В основных чертах окно имеет тот же облик, что и окно диалога по управлению освещением сцены, разработанное ранее (в MFC-проекте). Но здесь есть два новых элемента, функциональность которых ранее была спрятана в командах меню. Так как в рамках этого проекта мы не имеем меню, то нам пришлось использовать элементы управления, сосредоточенные в нижней части окна диалоговой вставки. Во-первых, не забудьте, что справа от каждого ползунка вы должны расположить элемент типа Static Text, в окне которого будет отражено текущее положение движка в числовой форме.

Кнопка Выбор файла, как и ранее, позволяет пользователю открыть файловый диалог и выбрать файл с данными для нового изображения. Выпадающий список Заполнение позволяет выбрать режим изображения полигонов (GL_FILL, GL_POINT или GL_LINE), а кнопка Quads/Strip изменяет режим использования примитивов при создании поверхности. Идентификаторы элементов управления мы сведем в таблицу