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

}

};

//========= Основной класс, экспонирующий интерфейс IOpenGL

class ATL_NO_VTABLE COpenGL :

public CComObjectRootEx<CComSingleThreadModel>,

public CStockPropImpl<COpenGL, IOpenGL>,

public IPersistStreamInitImpl<COpenGL>,

public IOleControlImpl<COpenGL>,

public IOleObjectImpl<COpenGL>,

public IOleInPlaceActiveObjectImpl<COpenGL>,

public IViewObjectExImpl<COpenGL>,

public IOleInPlaceObjectWindowlessImpl<COpenGL>,

public ISupportErrorInfo,

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:

COpenGL();

DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |

OLEMISC_CANTLINKINSIDE |

OLEMISC_INSIDEOUT |

OLEMISC_ACTIVATEWHENVISIBLE |

OLEMISC_SETCLIENTSITEFIRST)

DECLARE_REGISTRY_RESOURCEID(IDR_OPENGL)

BEGIN_COM_MAP(COpenGL)

COM_INTERFACE_ENTRY(IOpenGL)

COM_INTERFACE_ENTRY(IDispatch)

COM_INTERFACE_ENTRY(IViewObjectEx)

COM_INTERFACE_ENTRY(IViewObject2)

COM_INTERFACE_ENTRY(IViewObject)

COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)

COM_INTERFACE_ENTRY(IOleInPlaceObject)

COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)

COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)

COM_INTERFACE_ENTRY(IOleControl)

COM_INTERFACE_ENTRY(IOleObject)

COM_INTERFACE_ENTRY(IPersistStreamInit)

COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)

COM_INTERFACE_ENTRY(ISupportErrorInfo)

COM_INTERFACE_ENTRY(IConnectionPointContainer)

COM_INTERFACE_ENTRY(ISpecifyPropertyPages)

COM_INTERFACE_ENTRY(IQuickActivate)

COM_INTERFACE_ENTRY(IPersistStorage)

COM_INTERFACE_ENTRY(IDataObject)

COM_INTERFACE_ENTRY(IProvideClassInfo)

COM_INTERFACE_ENTRY(IProvideClassInfo2)

END_COM_MAP()

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()

BEGIN_CONNECTION_POINT_MAP(COpenGL)

CONNECTION_POINT_ENTRY(__uuidof(_IOpenGLEvents))

END_CONNECTION_POINT_MAP()

BEGIN_MSG_MAP(COpenGL)

CHAIN_MSG_MAP(CComControl<COpenGL>)

DEFAULT_REFLECTION_HANDLER()

END_MSG_MAP()

DECLARE_PROTECT_FINAL_CONSTRUCT()

// ISupportsErrorInfo

STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)

{

static const IID* arr[] =

{

&IID_IOpenGL,

};

for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)

{

if (InlineIsEqualGUID(*arr[i], riid))

return S_OK;

}

return S_FALSE;

}

// IViewObjectEx

DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

// IOpenGL

public:

//========= Экспонируемые методы

STDMETHOD(GetLightParams)(LONG* pPos);

STDMETHOD(SetLightParam)(SHORT lp, LONG nPos);

STDMETHOD(GetFillMode)(ULONG* pMode);

STDMETHOD(SetFillMode)(ULONG nMode);

STDMETHOD(GetQuad)(BYTE* bQuad);

STDMETHOD(SetQuad)(BYTE bQuad);

STDMETHOD(ReadData)(void);

//======= Переменные, необходимые для реализации интерфейса

OLE_COLOR m_clrFillColor;

long   m_BkClr;       // Цвет фона окна

int    m_LightParam[11];// Параметры освещения

int    m_xPos, m_yPos; // Текущая позиция мыши

HGLRC  m_hRC;         // Контекст OpenGL

HDC    m_hdc;       // Контекст Windows

float  m_AngleX;    // Угол поворота вокруг оси X

float  m_AngleY;    // Угол поворота вокруг оси Y

float  m_AngleView; // Угол перспективы

float  m_fRangeX;   // Размер объекта вдоль X

float  m_fRangeY;   // Размер объекта вдоль Y

float  m_fRangeZ;   // Размер объекта вдоль Z

float  m_dx;      // Квант смещения вдоль X

float  m_dy;      // Квант смещения вдоль Y

float  m_xTrans;    // Cмещение вдоль X

float  m_yTrans;    // Cмещение вдоль Y

float  m_zTrans;    // Cмещение вдоль Z