Дополнительные инструменты для рисования
Пример 3.2.8. Короткое окно Пусть R = 2, а экранное окно такое же, как и в предыдущем примере. Тогда имеем случай а), и порту просмотра назначается высота 180 пикселов и ширина 320 пикселов.
Изменение размеров экранного окна; событие Resize
В оконной системе пользователь может изменять размеры экранного окна динамически, обычно протаскиванием мышью одного из углов окна. Это действие генерирует событие resize (изменение размеров), на которое система может реагировать. Функция glutReshapeFuncO из инструментария OpenGL специфицирует функцию myReshape, вызываемую при возникновении данного события:
glutReshapeFunc(myReshape)
// specifies the function called on a resize event // задает функцию, вызываемую по событию resize
(Данный оператор появляется в ma1n() наряду с другими вызовами, определяющими функции обратного вызова.) Кроме того, эта зарегистрированная функция вызывается, когда окно открывается впервые, и должна иметь следующий прототип:
void myReshape(GLsizei w. GLsizei H):
При выполнении данной функции система автоматически передает в нее новую ширину и высоту того экранного окна, которое эта функция может затем использовать в своих вычислениях. (Glsizei является 32-битным целым; см. табл. 2.1.)
Что должна делать myReshapeC )? Если пользователь увеличивает экранное окно, можно использовать прежний порт просмотра (почему?), однако пользователь может захотеть увеличить порт просмотра, чтобы использовать преимущества увеличенного размера окна. Если же пользователь уменьшает свое экранное окно, пересекая при этом одну из границ порта просмотра, то он почти наверняка захочет пересчитать новый порт просмотра.
Создание согласованного порта просмотра Обычно требуется найти новый порт просмотра так, чтобы он вписался в новое экранное окно и имел такое же форматное соотношение, что и мировое окно. Согласование форматных соотношений порта просмотра и мирового окна позволит избежать искажений в новом изображении. В листинге 3.4 приведен вариант функции myReshapeC ), осуществляющей желаемое согласование: она находит максимальный порт просмотра с тем же форматным соотношением, как у окна, который впишется в новое экранное окно. Эта подпрограмма получает ширину и высоту нового экранного окна через свои параметры. Ее код является просто выражением результата с рис. 3.13.