Всплывающие меню также включено в функции GLUT. Добавление меню в приложение обеспечивает простой способ для взаимодействия и выбора опций, чем клавиатура, избегая того, чтобы помнить все эти клавиатурные сокращения. Первое, что мы должны сделать, это создать меню. Функция glutCreateMenu GLUT имеет следующий синтаксис:
int glutCreateMenu(void (*func)(int value));
Параметры:
*func - функция, которая будет обрабатывать события для вновь созданного меню.
Возвращаемое значение этой функции является идентификатором. Мы можем иметь столько меню, сколько хотим для нашего приложения. И для каждого меню функция обратного вызова будет указана. Затем мы добавляем некоторые записи в меню. Сделать это нужно в glutAddMenuEntry.
void glutAddMenuEntry(char *name, int value);
Параметры:
*name - имя строки, которая будет отображаться в меню.
value - это значение, которое будет возвращаться в функцию обратного вызова, когда пункт меню будет выбран.
Эта функция добавляет запись в ранее добавленные строки, то есть в нижней части меню. В GLUT нет функции, чтобы добавить запись в середине меню. Помните, что GLUT не претендует на полноценное API. GLUT разработан, чтобы сделать нашу жизнь проще при разработке прототипов графических приложений.
Итак, теперь у вас есть всплывающее меню, но есть еще одна вещь, которую мы должны сделать: ппривязка меню к нажатию кнопки мыши, то есть мы должны указать, когда должно всплывать меню. Функция, отвечающая за эти действия является glutAttachMenu:
void glutAttachMenu(int button);
Параметры:
button - целое число, указывающее, какая кнопка меню будет использована.
Кнопка должна иметь одно из следующих значений:
- GLUT_LEFT_BUTTON;
- GLUT_MIDDLE_BUTTON;
- GLUT_RIGHT_BUTTON
Функция, которая является примером использования всех вышеперечисленных функций:
... #define RED 1 #define GREEN 2 #define BLUE 3 #define ORANGE 4 ... void createGLUTMenus() { int menu; // создать меню // сообщить GLUT что "processMenuEvents" будет // обрабатывать события menu = glutCreateMenu(processMenuEvents); //добавить записи в нашем меню glutAddMenuEntry("Red",RED); glutAddMenuEntry("Blue",BLUE); glutAddMenuEntry("Green",GREEN); glutAddMenuEntry("Orange",ORANGE); // прикрепить меню правой кнопки glutAttachMenu(GLUT_RIGHT_BUTTON); }
Теперь мы напишем функции для обработки событий меню. Как вы, наверное, догадались, мы собираемся установить цвет с помощью нашего меню. Обратите внимание, что наша функция должна быть вызвана processMenuEvents, а название, которое мы предоставляем, мы создали для меню в функции выше. Кроме того, глядя на синтаксис glutCreateMenu мы знаем, что он будет иметь параметр, представляющий выбранный пункт меню.
void processMenuEvents(int option) { switch (option) { case RED : red = 1.0f; green = 0.0f; blue = 0.0f; break; case GREEN : red = 0.0f; green = 1.0f; blue = 0.0f; break; case BLUE : red = 0.0f; green = 0.0f; blue = 1.0f; break; case ORANGE : red = 1.0f; green = 0.5f; blue = 0.5f; break; } }
Единственное, что осталось сделать, это добавить вызов createGLUTMenus в main(). Перед тем, как закончить с созданием в GLUT всплывающего меню, мы рассмотрим еще две функции. Первая из них позволяет разорвать связь между клавишей мыши и меню. Ранее мы прикрепили меню кнопки мыши с помощью функции glutAttachMenu. В некоторых случаях это может быть полезно, чтобы разорвать созданную связь, то есть, когда пользователь больше не нажимает мышью в меню. В GLUT это делается с помощью функции glutDetachMenu. Эта функция заставляет GLUT прекратить предоставление меню при нажатии кнопки мыши. Синтаксис выглядит следующим образом:
void glutDetachMenu(int button);
Параметры:
- button – клавиша для разрыва связи.
Кнопка в параметрах принимает те же значения, что и для glutAttachMenu. Таким образом, в нашем предыдущем примере, если мы хотим, чтобы освободить кнопку мыши от пункта меню, мы должны написать:
... glutDetachMenu(GLUT_RIGHT_BUTTON); ...
И, наконец, если мы хотим освободить ресурсы, используемые в меню, то мы можем уничтожить его. GLUT делает это функцией glutDestroyMenu и имеет следующий синтаксис:
void glutDestroyMenu(int menuIdentifier);
Параметры:
menuIdentifier - это уничтожаемый идентификатор меню. Это должно быть то же значение, ID, возвращаемое функцией glutCreateMenu.
Вы теперь знаете основы построения меню с помощью GLUT. Далее мы рассмотрим некоторые другие возможности всплывающих меню.
Готовый код мы с Вами рассмотрим в уроке № 10, скриншоты с меню приложены из урока 10.
Комментарии
Можете исходный код тоже выставить.
А то у меня проблема в отладке "error C2065: red: необъявленный идентификатор"
Исходный код здесь в уроке 10
http://grafika.me/node/136