Значение переменной id можно в дальнейшем использовать для установки этого окна в качестве текущего и перенаправления в него всех последующих операторов графического вывода: glutSetWindow(id); Во втором окне можно установить другие настройки параметров, обратившись к функции glutInitDisplayMode() перед вызовом glutCreateWindow(). Более того, каждое окно может иметь свой набор функций с обратным вызовом, поскольку функции регистрации имеют силу только по отношению к текущему окну.
3.6. Меню
В прикладной программе с помощью графических примитивов и функций обработки событий мыши можно создать собственные средства графического интерфейса. Например, можно сформировать ползунковый регулятор, изображенный на рис. 3.16. Для этого потребуется сформировать на экране изображения прямоугольников и вывести текст надписей шкалы, а затем, обрабатывая события мыши, получать информацию о желаемом перемещении ползунка регулятора. Конечно, программирование такого элемента управления - задача довольно утомительная, особенно если попытаться воспроизводить разного рода объемные эффекты изображения отдельных деталей механизма (если хочется, чтобы регулятор выглядел на экране, "как живой"). В большинстве операционных систем имеется свой набор элементов управления для графического интерфейса, но поскольку в этой книге мы не "привязываемся" к определенной операционной системе, то обсуждать специфику их использования не будем. Но, к счастью, в библиотеке GLUT имеются функции поддержки работы с всплывающими меню (pop-up menus), которые можно использовать в приложениях, нуждающихся в интенсивном диалоге с пользователем.
Работа с меню в прикладной программе включает несколько достаточно простых операций. Сначала нужно определить в программе пункты меню. Нужно связать меню с определенной кнопкой мыши. И последнее - нужно определить функцию с обратным вызовом для
3.6. Меню
обработки выбора каждого пункта меню. Ниже мы продемонстрируем, как это делается, на примере меню из трех пунктов. Выбор первого пункта будет завершать выполнение приложения, в выбор второго и третьего - изменять размеры квадратиков, вычерчиваемых функцией drawSquare(). Функцию обработки меню с обратным вызовом назовем demo_menu(). В функцию main() поместим вызовы функций, которые формируют меню и связывают его с правой кнопкой мыши: