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

GLenum m_FillMode; // Режим заполнения полигонов

bool m_bCaptured; // Признак захвата мыши

bool m_bRightButton;// Флаг правой кнопки мыши

bool m_bQuad;     // Флаг использования GL_QUAD

UINT m_xSize;     // Текущий размер окна вдоль X

UINT m_zSize;     // Текущий размер окна вдоль Y

vector <Point3D> m_cPoints; // Массив вершин поверхности

//======= Неэкспонируемые методы класса

void DrawScene();     // Подготовка изображения

void DefaultGraphic();  // Создание графика по умолчанию

void SetGraphPoints(BYTE* buff, DWORD nSize); // Создание массива

void SetLight();             // Установка параметров освещения

bool DoRead(HANDLE hFile);// Чтение данных из файла

void SetBkColor();             // Установка цвета фона

//====== Вспомогательные методы

HRESULT FinalConstruct() { return S_OK; }

void FinalRelease() { }

void OnFillColorChanged();

HRESULT OnDraw(ATL_DRAWINFO& di);       // Реакция на WM_PAINT

};

OBJECT_ENTRY_AUTO(__uuidof(OpenGL), COpenGL)

Обратите внимание на тот факт, что в классе COpenGL присутствует карта сообщений, которой вы привыкли пользоваться  в рамках библиотеки MFC.

BEGIN_MSG_MAP(COpenGL)

CHAIN_MSG_MAP(CComControl<COpenGL>)

DEFAULT_REFLECTION_HANDLER()

END_MSG_MAP()

Среди многочисленных предков класса COpenGL вы можете увидеть шаблон класса CComControl, который инкапсулирует функциональность оконного элемента управления. Он происходит от класса CComControlBase и шаблона CWindowImpl. Последний по умолчанию происходит от класса CWindow. Класс CWindow содержит внутри себя Windows-описатель окна типа HWND и во многом повторяет класс CWnd, кроме тех его черт, которые унаследованы от CObject. Именно с оконной частью наследства COpenGL мы будем работать, реализуя функциональность окна OpenGL. CWindow, как и CWnd, способен обрабатывать сообщения Windows. Сейчас мы покажем как ввести в класс COpenGL реакции на нужные нам сообщения.

1.  Поставьте фокус в строку с именем класса COpenGL в окне ClassView и вызовите перейдите в окно свойств;

2.  Нажмите кнопку Messages, выберите из списка сообщений WM_CREATE и добавьте обработчик этого сообщения <Add> OnCreate;

3.  Выберите из списка и добавьте обработчики на все другие сообщения, которые нужны для управления изображением в окне OpenGL: WM_DESTROY, WM_ERASEBKGND, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_SIZE, WM_TIMER.

Фокус переходит в файл OpenGL.cpp, так как пустые тела функций мастер помещает именно туда. Просмотрите карту сообщений. В ней должны появиться строки такого формата:

MESSAGE_HANDLER(WM_CREATE, OnCreate)

Каждая строка связывает сообщение с функцией его обработки. В файле заголовков появились декларации этих функций. Перейдем к файлу реализации класса. Введите в него тело конструктора:

COpenGL::COpenGL()

{

DefaultGraphic(); // Подготовка графика по умолчанию

m_hRC = 0;              // Контекст передачи пока отсутствует

m_AngleX = 35.f;  // Начальный разворот изображения

m_AngleY = 20.f;

m_AngleView = 45.f;     // Угол зрения для матрицы проекции

m_BkClr = RGB(0, 0, 96);  // Начальный цвет фона

m_FillMode = GL_FILL; // Начальный режим заполнения внутренних точек полигона

//====== Начальное смещение относительно центра сцены. Сдвиг назад на полтора размера объекта

m_zTrans = -1.5f*m_fRangeX;

m_xTrans = m_yTrans = 0.f;

m_dx = m_dy = 0.f; // Начальные значения квантов смещения (для анимации)

m_bCaptured = false;            // Мышь не захвачена

m_bRightButton = false; // Правая кнопка не нажата

m_bQuad = true;          // Рисуем четырехугольниками

m_LightParam[0] = 50; // X position   // Начальные значения параметров освещения

m_LightParam[1] = 80; // Y position

m_LightParam[2] = 100;// Z position

m_LightParam[3] = 15; // Ambient light

m_LightParam[4] = 70; // Diffuse light

m_LightParam[5] = 100;// Specular light

m_LightParam[6] = 100;// Ambient material

m_LightParam[7] = 100;// Diffuse material

m_LightParam[8] = 40; // Specular material

m_LightParam[9] = 70; // Shininess material

m_LightParam[10] = 0; // Emission material