Всплывающее меню OpenGL, отображенное демонстрационной программой создания меню как показано на рис. 11.16. Опция меню подсвечивается при наведении на нее курсора. Для выбора подсвеченной опции отпускается правая кнопка мыши. Если выбор пал на “одноцветное заполнение”, треугольник заполняется цветом, заданным для последней вершины (в данном примере это красный). В конце процедуры отображения меню 1 ШОр^оп мы включили команду д11^Рс^КесИзр1ау (раздел 6.4), чтобы указать, что треугольник должен быть перерисован при отображении меню.

Рис. 11.16. Всплывающее меню OpenGL, отображенное демонстрационной программой создания меню как показано на рис. 11.16. Опция меню подсвечивается при наведении на нее курсора. Для выбора подсвеченной опции отпускается правая кнопка мыши. Если выбор пал на “одноцветное заполнение”, треугольник заполняется цветом, заданным для последней вершины (в данном примере это красный). В конце процедуры отображения меню 1 ШОр^оп мы включили команду д11^Рс^КесИзр1ау (раздел 6.4), чтобы указать, что треугольник должен быть перерисован при отображении меню.

♦include <GL/glut.h>

GLsizei winWidth = 400, winHeight = 400;

/* Исходный размер окна на экране. */

GLfloat red = 1.0, green = 1.0, blue = 1.0;

/* Вначале треугольника закрашен белым. */

GLenum fillMode = GL_SMOOTH;

/* Заполнение треугольника: интерполяция цвета. */

void init (void) {

glClearColor (0.6, 0.6, 0.6, 1.0);

/* Сделать цвет окна серым. */

glMatrixMode (GL_PR0JECT10N); gluOrtho2D (0.0, 300.0, 0.0, 300.0);

}

void fillOpt\on (GLint selectedOption)

{

switch (selectedOption)

{

case 1: fillMode = GL_FLAT; break;

/* Визуализация плоской поверхности. */

case 2: fillMode = GLJ3M00TH; break;

/* Визуализация Гуро. */

)

glutPostRedisplay ( );

}

void displayTriangle (void)

{

glClear (GL_COLOR_BUFFER_BIT); glShadeModel (fillMode);

/* Выбрать метод заполнения треугольника. */

glColor3f (red, green, blue);

/* Выбрать цвет первых двух вершин. */

glBegin (GL_TRIANGLES); glVertex2i (280, 20); glVertex2i (160, 280); glColor3f (red, 0.0, 0.0);

/* Выбрать цвет'последней вершины красным. */

glVertex2i (20, 100); glEnd ( );

glFlush ( );

}

void reshapeFcn (GLint newWidth, GLint newHeight)

{

glViewport (0, 0, newWidth, newHeight);

glMatrixMode (GL_PROJECTION); glLoadldentity ( );

gluOrtho2D (0.0, GLfloat (newWidth), 0.0,

GLfloat (newHeight));

displayTriangle ( ); glFlush ( );

void main (inttarge, char **argv) { glutlnit (&argc, argv);

glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (200, 200); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Пример меню");

init ( );

glutDisplayFunc (displayTriangle);

glutCreateMenu (fillOption); // Создать всплывающее меню. glutAddMenuEntry ("Одноцветное заполнение", 1); glutAddMenuEntry ("Заполнение с интерполяцией цвета", 2);

/* Выбор опции меню с использованием правой кнопки

* МЫШИ.

*/

glutAttachMenu (GLUT_RIGHT_BUTTON); glutReshapeFunc (reshapeFcn); glutMainLoop ( );

}

СОЗДАНИЕ НЕСКОЛЬКИХ МЕНЮ GLUT И УПРАВЛЕНИЕ ИМИ

Создаваемое меню соотносится с текущим окном на экране дисплея (раздел 6.4). Для одного окна на экране дисплея можно создать несколько меню, а также можно предусмотреть разные меню для разных окон. При создании каждого меню ему присваивается целочисленный идентификатор, начиная со значения 1, соотнесенного с первым меню. Целочисленный идентификатор меню возвращается процедурой glutCreateMenu, и это значение можно записать, используя оператор

menuID = glutCreateMenu (menuFcn); Только что созданное меню становится текущим меню для текущего окна на экране дисплея. Чтобы активизировать любое меню для текущего окна на экране дисплея, используем такой оператор.


⇐ вернуться назад | | далее ⇒