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

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

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

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

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

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

Рейтинг@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