Введение обработчиков сообщений Windows
Класс copenGL должен реагировать на сообщение WM_SIZE и корректировать видимый объем сцены. Мы будем использовать режим просмотра с учетом перспективы. Его определяет функция gluPerspective. Введите в класс copenGL обработку WM_SIZE и вставьте в нее следующие коды:
LRESULT COpenGL::OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM IParam, BOOL& bHandled) { // Распаковываем длинный параметр и узнаем размеры окна UINT сх = LOWORD (IParam), су = HIWORD (IParam); //====== Вычисляем максимальные диспропорции окна double dAspect = cx<=cy? double (су) /сх : double (сх) /су; //==== Задаем тип текущей матрицы (матрица проекции) glMatrixMode (GL_PROJECTION); //====== Приравниваем ее к единичной диагональной glLoadldentity (); //== Параметры перспективы (45 градусов – угол обзора) gluPerspective (45., dAspect, 1., 10000.); glViewport (0, 0, сх, су); DrawScene (); bHandled = TRUE; return 0; }
Функция glViewport, как вы помните, задает прямоугольник просмотра. При закрытии окна внедренного объекта необходимо освободить память, занимаемую контекстом передачи, и отказаться от услуг таймера, с помощью которого мы будем производить анимацию вращения изображения. Введите в класс обработчик сообщения WM_DESTROY и измените ее стартовый код, как показано ниже:
LRESULT COpenGL::OnDestroy (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { KillTimer(l); if (m_hRC) { wglDeleteContext(m_hRC); m_hRC = 0; } bHandled = TRUE; return 0; }