void drawSquare(int х, int у) {
y=wh-y;
glColor3ub((char)rand()%256, (char)rand()%256,
(char)rand()%256);
glBegin(GL_POLYGON);
glVertex2f(x+size, y+size);
glVertex2f(x-size, y+size);
glVertex2f(x-size, y-size);
glVertex2f(x+size, y-size); glEnd(); glFlush();
}
Остается только вставить в текст программы необходимые директивы iinclude, и получим программу, которая будет вполне удовлетворительно работать до тех пор, пока пользователь не попытается изменить размеры окна приложения.
3.5.2. События окна Большинство современных операционных систем позволяет пользователю изменять размеры окон приложений и перемещать их по поверхности экрана. Эта процедура, как правило, выполняется с помощью мыши путем перетаскивания какого-либо из углов окна. При этом операционная система возбуждает событие, которое относится к группе события окна (window event). В прикладной программе должна присутствовать функция, которая будет реагировать на это событие9. Продумывая реакцию приложения на изменение размеров окна, следует обратить внимание на следующие вопросы.
1. Следует ли перерисовать все объекты, которые были вычерчены в области окна перед тем, как его размеры изменились?
2. Как следует отреагировать на изменение соотношения сторон окна приложения?
3. Нужно ли после этого изменять размеры или атрибуты новых примитивов?
9 Существует функция перерисовки с обратным вызовом, которая вызывается по умолчанию, но она может выполнять совсем не те операции, которые желательны для данного пршожения.
Ввод и взаимодействие с пользователем
Однозначных ответов на эти вопросы не существует - здесь все зависит от специфики конкретного приложения. Если на экране изображена реальная сцена, то, скорее всего, следует сохранить нормальное соотношение сторон, чтобы изображение не оказалось искаженным. Но при этом может оказаться так, что часть области окна будет не использована или часть сцены не "впишется" в окно измененного размера. Если при изменении размеров окна нужно воспроизвести в нем все ранее вычерченные объекты, то необходим какой-то механизм сохранения информации об этих объектах и их повторной перерисовки. Чаще всего это выполняется в теле единственной функции, например функции display (), которую мы уже использовали в программе из главы 2. Эта функция регистрируется в качестве функции отображения с обратным вызовом. Но в данном примере этот механизм не подходит, поскольку было решено, что программа будет вычерчивать квадратики только в ответ на действия пользователя в интерактивном режиме.