Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Пиривет сайт с работой закладчиком Работа курьером Значение финансов в повседневной жизни известно каждому, но что делать, если зарплата на постоянной работе невелика или ее вообще нет? Если у Вас нет профессии или возникли иные сложности, то...
Модные тренды медицинской одежды - новая эра стиля и комфорта в 2024 году https://fkmed.r... C нами Вы убедитесь: качественная, комфортная и модная медицинская одежда существует! В каталоге на сайте представлена медицинская одежда для врачей и...
14 070 руб https://www.eco... 38 900 руб https://www.eco... и выберите из списка ниже: Купить в 1 клик https://www.eco... По типу двигателя снегоотбрасыватель может быть: Купить в 1 клик https://www.eco...
Все изделия хорошо сидят на фигуре и отличаются высокой степенью комфортности https://fkmed.r... Комбинированные ткани с применением хлопка и синтетики - это оптимальный вариант для пошива формы https://fkmed.r... Специальная пропитка...
53 990 руб https://www.eco... Экономия 4 160 руб https://www.eco... Купить в 1 клик https://www.eco... Главными элементами устройства являются двигатель, металлический или пластиковый корпус и лопасти для уборки снега https://www.eco... Тип...

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Среда программирования: 
Visual C

Всплывающие меню также включено в функции 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.

Комментарии

Aikut аватар
Опубликовано Aikut в 7. Ноябрь 2014 - 9:34.

Можете исходный код тоже выставить.
А то у меня проблема в отладке "error C2065: red: необъявленный идентификатор"

Горбунов Андрей аватар
Опубликовано Горбунов Андрей в 17. Декабрь 2015 - 10:26.

Исходный код здесь в уроке 10
http://grafika.me/node/136