Учебник по Visual C++ .Net

         

Введение методов в интерфейс IOpenGL


lOpenGL : IDispatch

{

[propput, bindable, requestedit, id(DISPID_FILLCOLOR)]

HRESULT FillColor([in]OLE_COLOR clr);

[propget, bindable, requestedit, id(DISPID_FILLCOLOR)]

HRESULT FillColor([out, retval]OLE_COLOR* pclr);

[id(l), helpstring("method GetLightParams")]

HRESULT GetLightParams([out] int* pPos);

};

в файле заголовков появилась строка декларации метода ко-класса, который реализует функциональность интерфейса:

STDMETHODIMP GetLightParams(int* pPos);

и, наконец, в файле реализации ко-класса появилась стартовая заготовка тела метода:

STDMETHODIMP COpenGL::GetLightParams(int *pPos)

{

// TODO: Add your implementation code here

return S_OK;



}

Повторите описанные действия и введите в интерфейс еще один метод SetLightParam, который изменяет один из параметров освещения сцены OpenGL. При задании параметров этого метода добейтесь такого описания в окне Parameter List:

[in] short lp [in] int nPos;

Введите в состав интерфейса еще один метод ReadData, на сей раз без параметров. Он будет реагировать на кнопку и производить чтение файла с данными о новом графике. Для управления обликом поверхности графика нам понадобятся две пары методов типа get-set. Введите в интерфейс следующие методы:

  • GetFillMode с параметром [out] DWORD* pMode;
  • SetFillMode С параметром [in] DWORD nMode;
  • GetQuad с параметром [out] BOOL* bQuad;
  • SetQuad с параметром [in] BOOL bQuad.

    Найдите новые методы в IDL-файле и убедитесь, что мастер автоматически пронумеровал методы (1,2,...), присвоив им индексы типа DISPID:

    [id(l), helpstring("method GetLightParams")]

    HRESULT GetLightParams([out] int* pPos);

    [id(2), helpstring("method SetLightParam")]

    HRESULT SetLightParam([in] short Ip, [in] int nPos);

    [id(3), helpstring("method ReadData")]

    HRESULT ReadData(void);

    [id(4), helpstring("method GetFillMode")]

    HRESULT GetFillMode([out] DWORD* pMode);

    [id(5), helpstring("method SetFillMode")]

    HRESULT SetFillMode([in] DWORD nMode);

    [id(6), helpstring("method GetQuad")]

    HRESULT GetQuad([out] BOOL* bQuad);

    [id(7), helpstring("method SetQuad")]

    HRESULT SetQuad([in] BOOL bQuad);

    С помощью этих индексов методы будут вызываться клиентами, получившими указатель на интерфейс диспетчеризации IDispatch. Мы уже обсуждали способ, который используется при вызове методов по индексам DISPID. Непосредственный вызов производит метод IDispatch: : invoke. Тот факт, что наш объект поддерживает IDispatch, мы определили при создании ATL-заготовки. Если вы не забыли, то мы тогда установили переключатель типа интерфейса в положение Dual. Это означает, что объект будет раскрывать свои методы как с помощью vtable, так и с помощью IDispatch. Некоторые детали этого процесса обсуждались в предыдущем уроке.



    Содержание раздела