Класс-оболочка
Обычно при создании приложения-контейнера для элемента ActiveX придерживаются следующей стратегии:
- Вставляют уже зарегистрированный элемент ActiveX в форму приложения контейнера, используя так называемую галерею объектов (Gallery).
- В одном из классов контейнера определяют переменную того же типа, что и класс-оболочка для внедренного элемента.
- Программируют поведение элемента, управляя им с помощью этой переменной.
Первый шаг этого алгоритма вы уже выполнили, теперь введите в состав проекта два новых файла OpenGLh и OpenGLcpp, которые будут содержать коды класса-оболочки copenGL. Вот содержимое файла заголовков (OpenGLh):
#pragma once //=========== COpenGL wrapper class class COpenGL: public CWnd { protected: DECLARE_DYNCREATE(COpenGL) public: //==== Метод для добывания CLSID нашего элемента CLSID const& GetClsidO { static CLSID const clsid = { 0x519d9ed8, Oxbc4'6, 0x4367, { Ox9c, OxcO, 0x49, 0x81, 0x40, Oxf3, 0x94, 0x16 } }; return clsid; } virtual BOOL Create(LPCTSTR IpszClassName, LPCTSTR IpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL) { return CreateControl(GetClsid(), IpszWindowName, dwStyle, rect, pParentWnd, nID) } BOOL Create (LPCTSTR IpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE, BSTR bstrLicKey = NULL) { return CreateControl(GetClsidO, IpszWindowName, dwStyle, rect, pParentWnd, nID, pPersist, bStorage, bstrLicKey); } //====== Методы, экспонируемые элементом ActiveX public: void SetFillColor(unsigned long newValue); unsigned long GetFillColor(); void GetLightParams(long* pPos); void SetLightParam(short Ip, long nPos); void ReadData(); void SetFillMode(DWORD mode); void GetFillMode(DWORD* pMode); void GetQuad(BOOL* bQuad); void SetQuad(BOOL bQuad); };
Самым важным моментом в процедуре вставки класса является правильное задание CLSID того класса OpenGL, который был зарегистрирован в операционной системе при создании DLL-сервера, то есть нашего элемента ActiveX. He пытайтесь сравнивать те цифры, которые приведены в книге, с теми, которые были приведены в ней же до этого момента, так как в процессе отладки пришлось не раз менять как классы, так и целиком приложения. Мне не хочется отслеживать эти жуткие номера. Если вы хотите вставить правильные цифры, то должны взять их из вашей версии предыдущего приложения ATLGL. Например, откройте файл ATLGL.IDL и возьмите оттуда CLSID для ко-класса OpenGL, то есть найдите такой фрагмент этого файла:
[ uuid(519D9ED8-BC46-4367-9CCO-498140F39416), helpstring ("OpenGL Class") ] coclass OpenGL { [default] interface IOpenGL; [default, source] dispinterface _IOpenGLEvents; };
И скопируйте первую строку:
uuid(519D9ED8-BC46-4367-9CCO-498140F39416),
Но с вашими цифрами и вставьте ее в качестве комментария в файл OpenGLh нового проекта TestGL. Затем аккуратно, соблюдая формат, принятый для структуры CLSID, перенесите только цифры в поля статической структуры clsid, которую вы видите в методе GetClsid класса-оболочки. Цифры должны быть взяты из принесенной строки, но их надо отформатировать (разбить) по-другому принципу.