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

Вход на сайт

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

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

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

Спасибо за реализацию, она действительно быстрая. Но не все линии отрисовывает в нужную сторону... Необходимо добавить проверку для случая X-линии if(y1 "<" y0) grad=-grad; и аналогично для Y-линии if(x1 "<" x0) grad=-grad; P.S. На...
Отличные уроки(учу GL по ним), только в renderScene нужно добавить очистку буфера цвета и буфера глубины. При изменении размеров треугольники размножаются)
как исправить это , сделал все по инструкции
Timer1 - выдает ошибку. Использовал IdleTimer1, работает! unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, OpenGLContext, GL, GLU; type { TForm1 } TForm1 =...
в коде присутствуют ошибки! // Считываем координаты procedure TForm1.getCoords(Sender: TObject); var j1:longint; begin n:= StrToInt(Edit2.Text); //число точек s1:=Edit1.Text; s2:=''; i := 1; j:=1; k:=0...

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

Яндекс.Метрика Рейтинг@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