В этой программе все квадратики должны иметь один и тот же размер, который не зависит от размеров и формы (соотношения сторон) окна приложения. При каждом изменении размеров окна приложения оно очищается, и мы фактически начинаем "с чистого листа". В качестве показаний событие перерисовки передает в прикладную программу высоту и ширину нового окна. Эти параметры используются для переопределения прямоугольника отсечения с помощью функции glu0rtho2D() и нового видового окна с тем же соотношением сторон. Затем окно очищается, причем в качестве цвета фона устанавливается черный цвет. Таким образом, функция перерисовки с обратным вызовом будет иметь вид

void myReshape(GLsizei w, GLsizei h) {

/* Настроить прямоугольник отсечения */

glMatrixMode(GL_PR0JECTI0N); glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h); glMatrixMode(GL_MODELVIEW); glLoadIdentity();

/* Настроить параметры видового окна и очистить его */

glviewport(0,0,w,h); glClearColor (0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR BUFFER_BIT); glFlush();
}

Полный текст программы читатель найдет в приложении А.

Но предлагаемый вариант функции перерисовки не единственно возможный. Можно, например, изменять размеры вычерчиваемых в дальнейшем квадратиков в соответствии с новыми размерами окна приложения. Помимо события изменения размеров окна приложения, существуют и другие, связанные с перекомпоновкой окон на экране, - перемещение окна без изменения его размеров, перевод окна "на передний план" и т.д. Для всех таких событий, если в приложении планируется реагировать на них каким-то образом, нужно предусмотреть свои функции обработки с обратным вызовом, аналогичные myReshape(), или можно "положиться" на те функции по умолчанию, которыми обеспечивает приложение библиотека GLUT.

В разработанную программу можно ввести и еще одно усовершенствование - пусть она вычерчивает квадратики, пока пользователь будет перемещать мышь, удерживая кнопку нажатой. В этом случае необходимо определить в программе соответствующую функ-


⇐ Предыдущая| |Следующая ⇒