Ручная коррекция класса
Класс COpenGL будет обслуживать окно внедренного СОМ-объекта. Он должен иметь достаточное количество данных и методов для управления изображаемой поверхностью, поэтому далее вручную введем сразу много изменений в файл с описанием класса COpenGL. При изменении файла заголовков класса мы нарушим стиль, заданный стартовой заготовкой, и вернемся к более привычному, принятому в MFC-приложениях. Перенесем существующее тело конструктора, а также функции OnDraw в файл реализации класса OpenGLcpp. В файле OpenGL.h останутся только декларации этих функций.
Ниже приведено полное описание класса COpenGL с учетом нововведений, упрощений и исправлений. Вставьте его вместо того текста, который есть в файле OpenGL.h. После этого вставим в файл новые сущности с помощью инструментов Studio .NET:
// OpenGL.h: Declaration of the COpenGL #pragma once #include " resource.h" // main symbols #include <atlctl.h> #include "_IOpenGLEvents_CP.h" //========== Вспомогательный класс class CPointSD public: fldat x; float y; float z; // Координаты точки в 3D //====== Набор конструкторов и операция присвоения CPoint3D () { х = у = z = 0; } CPoint3D (float c1, float c2, float c3) x = с1; z = c2; у = сЗ; CPoint3D& operator=(constCPoint3D& pt) x = pt.x; z = pt .z; У = pt.y; return *this; } CPointSD (const CPoint3D& pt) *this = pt; //==== Основной класс, экспонирующий интерфейс IQpenGL class ATL_NO_VTABLE COpenGL: p.ublic CQomObjectRootEx<CComSingleThreadModel>, public CStockPropImpKCOpenGL, IOpenGL>, public IPersistStreamInitImpl<COpenGL>, public I01eControlImpl<COpenGL>, public I01eObjectImpl<COpenGL>, public I01eInPlaceActiveObjectImpl<COpenGL>, public IViewObjectExImpl<COpenGL>, public I01eInPlaceObjectWindowlessImpl<COpenGL>, public ISupportErrorlnfo, public IConnectionPointContainerImpl<COpenGL>, public CProxy_IOpenGLEvents<COpenGL>, public IPersistStorageImpl<COpenGL>, public ISpecifyPropertyPagesImpl<COpenGL>, public IQuickActivateImpl<COpenGL>, public IDataObjectImpl<COpenGL>, public IProvideClassInfo2Impl<&CLSID_OpenGL, &_uuidof(_IOpenGLEvents), &LIBID_ATLGLLib>, public CComCoClass<COpenGL, &CLSID_OpenGL>, public CComControl<COpenGL> { public: //===== Переменные, необходимые для реализации интерфейса OLE COLOR m clrFillColor; // Цвет фона окна int m LightParamfll]; // Параметры освещения int m xPos, m yPos; // Текущая позиция мыши HGLRC m hRC; // Контекст OpenGL HDC m hdc; // Контекст Windows GLfloat m AngleX; // Угол поворота вокруг оси X GLfloat m AngleY; // Угол поворота вокруг оси Y GLfloat m AngleView; // Угол перспективы GLfloat m fRangeX; // Размер объекта вдоль X GLfloat m fRangeY; // Размер объекта вдоль Y GLfloat m fRangeZ; // Размер объекта вдоль Z GLfloat m dx; // Квант смещения вдоль X GLfloat m dy; // Квант смещения вдоль Y GLfloat m xTrans; // Смещение вдоль X GLfloat m yTrans; // Смещение вдоль Y GLfloat m zTrans; // Смещение вдоль Z GLenum m FillMode; // Режим заполнения полигонов bool m_bCaptured; // Признак захвата мыши bool m bRightButton; // Флаг правой кнопки мыши bool m bQuad; // Флаг использования GL QUAD UINT m xSize; // Текущий размер окна вдоль X UINT m zSize; // Текущий размер окна вдоль Y