3.8. Простая программа рисования ши - на одной из кнопок или на рабочем поле окна. Эта информация возвращается функции mouse(), которая и берет на себя остальную работу. Поскольку область экрана, на которой выполнен щелчок мышью, определяется функцией pick(), то mouse(), анализируя текущий режим, либо выводит на экран соответствующий примитив, либо запоминает текущие координаты маркера мыши. Например, если пользователь выбрал режим построения треугольников, щелкнув перед этим на кнопке с изображением треугольника, программа должна запомнить положение первых двух вершин, а после указания третьей вершины построить треугольник. Соответствующий фрагмент текста функции mouse () представлен ниже.
case (TRIANGLE): /* Функция pick() определила ранее, что был выполнен щелчок на кнопке с изображением треугольника */ switch(count) /* Счетчик количества вершин */ {
case(O): /* Сохранить координаты первой вершины */ count++; хр[0] = х; УР[0] = у; break;
case(l): /* Сохранить координаты второй вершины */ count++; хр[1] = х; УР[1] = у; break;
case(2): /* Третья вершина. Вычертить треугольник */ if(fill) glBegin(GL_POLYGON); else glBegin(GL_LINE_LOOP);
glVertex2i(xp[0],wh-yp[0]);
glVertex2i(xp[1],wh-yp[1]);
glVertex2i(x,wh-y); glEnd();
draw_mode=0; /* Сбросить переменную режима */ count=0; Обратите внимание на то, что первым щелчком кнопкой мыши был выбран режим вычерчивания треугольников, а последующие щелчки подсчитываются и соответствующие координаты вершин сохраняются. Если же пользователь щелкнет на другой кнопке до того, как введет положение третьей вершины треугольника, выбирается новый режим и данные о предыдущих вершинах утрачиваются.
Функция key () заполняет надпись символами, которые пользователь вводит с клавиатуры, и выводит эту надпись на экран, void key(unsigned char k, int xx, int yy) {
if(draw_mode!=TEXT) return; /* Символы выводятся на экран до тех пор, пока не изменится режим. */ glRasterPos2i(rx,ry);
glCallList(k); /* Вывести на экран дисплейный список, соответствующий коду введенного символа к. */ rx+=glutBitmapWidth (GLUT_BITMAP_9_BY_15, к);