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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.