glutReshapeFunc (myReshape); glutMouseFunc (mouse); glutKeyboardFunc(key); glutMainLoop();
}

Функция myinit () очищает экран, устанавливает значения глобальных переменных и формирует дисплейных список для отображения 128 символов.

132 Глава 3. Ввод и взаимодействие с пользователем

void myinit(void) {

/* Установка шрифта в дисплейном списке */ int i;

base = glGenLists(128);
for(i=0;i<128;i++)
{
glNewList(base+i, GL_COMPILE); glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i);

/* Для установки штрихового шрифта раскомментируйте следующий оператор */

/*glutStrokeCharacter(GLUT_STROKE_ROMAN, i); */
glEndList();
}
glListBase(base); glViewport(0,0, ww, wh);

/* Настройка параметров отсекающего прямоугольника в соответствии с размерами окна операционной системы X window. Такая настройка позволяет избежать масштабирования координат объектов при изменении размеров окна приложения. */

glMatrixMode(GL_PR0JECTI0N);
glLoadIdentity();
glOrtho(0.0, (GLdouble)ww , 0.0,
(GLdouble)wh , -1.0, 1.0);

/* Настройка цвета фона окна и очистка окна приложения */ glClearColor (0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glFlushO;

}

Функция display ( ) очищает окно, устанавливает цвет фона и выводит изображения кнопок. Кнопки представляют собой прямоугольники со сторонами, соответствующими примерно 10% высоты и ширины окна. Такой способ вычерчивания обеспечивает изменение размеров кнопок при изменении размеров окна. На поле каждого прямоугольника затем вычерчиваются условные обозначения соответствующих функций в виде простейших фигур.

Функция myReShape() в этом примере дублирует рассмотренную в разделе 3.5.2 одноименную функцию с обратным вызовом.

Функция pick( ) выясняет, какой объект на экране выбран с помощью мыши, и работает в сочетании с функцией обработки события мыши mouse( ). В OpenGL поддерживается метод выбора обобщенных объектов, который довольно сложен в реализации. Но если в некоторой задаче нас интересует только определенная прямоугольная область экрана, например занятая кнопкой, то проще разработать собственный метод выбора. Та процедура, которая представлена в данной программе, работает следующим образом. Как только возбуждается событие мыши, функция mouse ( ) вызывает функцию pick( ) и с помощью последней выясняет, в какой части экрана расположен маркер мыши. Поскольку кнопки занимают на экране прямоугольные области, то не представляет особого труда выяснить, где находится маркер мы-


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