void mouse_callback_function(int button, int state,
int x, int у)
{
if(button == GLUT_LEFT_BUTTON && state == GLUT_D0WN) exit();
}
Любое другое сочетание показаний события - отпускание левой кнопки или любые манипуляции с правой кнопкой - останутся без внимания со стороны прикладной программы, поскольку в функции с обратным вызовом никаких действий на этот случай не предусмотрено.
Следующий пример продемонстрирует достоинство той структуры программы, которая была описана в предыдущей главе. Разработаем программу, которая будет вычерчивать небольшой квадратик на экране в том месте, где установлен маркер мыши в момент нажатия левой кнопки. Нажатие средней кнопки мыши должно привести к завершению работы выполнения программы.
Функция main( ) новой программы будет выглядеть практически так же, как и аналогичная функция в предыдущем примере8.
int main(int arge, char **argv) {
glutlnit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutCreateWindow("square"); myinit();
7 В некоторых операционных системах нажатие и отпускание кнопки рассматривается как единое событие.
8 Мы будем использовать соглашение об именовании функций с обратным вызовом, регламентированное в руководстве OpenGL Programmer's Guide [Оре97,а].
Ввод и взаимодействие с пользователем
glutReshapeFunc(myReshape); glutMouseFunc(mouse); glutDisplayFunc(display); glutMainLoop();
}
Событие перерисовки возбуждается операционной системой при любом изменении размеров или положения окна приложения, которое может возникнуть по требованию пользователя. Реакцию прикладной программы на это событие мы рассмотрим ниже. В этом примере нет нужды использовать функцию отображения с обратным вызовом, поскольку графические примитивы формируются только в ответ на щелчок кнопкой мыши. Но библиотека GLUT требует, чтобы каждое приложение содержало функцию отображения с обратным вызовом, а потому нам придется ее определить как пустую.
void display(){ }
На события мыши будет реагировать функция с обратным вызовом mouse(): void mouse(int btn, int state, int x, int у) {