for(int i = 0: i <- last: i++)
glVertex2i(List[i].x. List[i].y):
glEndO: gIFlushO:
}
else if(button - GLUT_RIGHT_BUTT0N && state " GLUTJXW last - -1: // reset the list to empty // обнуляем список }
Движение мыши Когда мышь перемещается (на расстояние, превышающее некоторое минимальное), а одна из кнопок удерживается в нажатом положении, происходит событие другого типа. Функция обратного вызова - назовем ее myMovedMouseC) - связывается с данным событием посредством подпрограммы
glutMotionFunc(myMovedMouse):
Данная функция обратного вызова должна иметь два параметра, ее прототип myMovedMouseC int х, int у): значения х и у, разумеется, представляют собой позицию мыши в тот момент, когда рассматриваемое событие происходит.
Пример 2.4.5. Черчение «от руки» толстой кистью
Допустим, что мы хотим создать кривую посредством плавного перемещения мыши вдоль некоторой траектории с нажатой кнопкой. Кроме того, мы хотим, чтобы эта «кисть» для рисования имела форму квадрата. Это можно осуществить, если разработать функцию myMovedMouseC), которая будет рисовать квадрат в текущей позиции мыши:
void myMovedMouse(int mouseX. int mouseY) {
GLint x = mouseX;
Начальная стадия: рисование фигур
// grab the mouse position // перехватываем позицию мыши
GLint у - screenHeight - mouseY; // flip it as usual
// как обычно, зеркально отражаем координату у GLint brushSize - 20:
glRectiCx.y. х + brushSize. у + brushSize): glFlushO:
}
2.4.2. Взаимодействие с помощью клавиатуры
Как уже указывалось ранее, нажатие клавиши на клавиатуре вызывает событие клавиатуры (keyboard event). Функция обратного вызова myKeyboardO регистрируется с данным типом события посредством подпрограммы glutKeyboardFunc(myKeyboard), которая должна иметь примерно следующий вид:
void myKeyboard(unsigned int key. int x. int у); Величина key определяется ASCII-кодом' нажатой клавиши. Величины х и у сообщают позицию мыши в момент возникновения события. (Как и раньше, у измеряется числом пикселов вниз относительно верхней стороны окна.)