КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Компьютерная графика. Создание цикла обработки сообщений в приложении средствами библиотеки OpenGLРечь идет об объектно-ориентрованном программировании, а не о структурном. Создается цикл обработки сообщений. Стартовой точкой выполнения программы является функция main(). В функции main() есть функция, которая запускает цикл обработки сообщений glutMainLoop(). В разные службы направляет сообщения. Цикл обработки выступает как разносчик сообщений и устанавливает очередь сообщения. Сообщения могут накапливаться в разных буферах. Обработчик сообщений подбирает, кто ответственен за эти сообщения. Заранее известно кто будет обрабатывать сообщения (например: отвечать за клики мыши). Функции библиотеки GLUT реализуют так называемый событийно-управляемый механизм. Это означает, что есть некоторый внутренний цикл, который запускается после соответствующей инициализации и обрабатывает, одно за другим, все события, объявленные во время инициализации. К событиям относятся: щелчок мыши, закрытие окна, изменение свойств окна, передвижение курсора, нажатие клавиши, и "пустое" (idle) событие, когда ничего не происходит. Для этого используются функции вида: • void glutDisplayFunc (void (*func) (void)) - функция рисования для окна приложения, которая вызывается при необходимости создания или восстановления изображения • void glutReshapeFunc (void (*func) (int width, int height)) - функция обработки изменения размеров окна пользователем • void glutMouseFunc (void (*func) (int button, int state, int x, int y)) - функция для регистрации действий мыши • void glutIdleFunc (void (*func) (void)) - функцию, которая будет вызываться каждый раз, когда нет событий от пользователя Контроль всех событий происходит внутри бесконечного цикла в функции void glutMainLoop(void) которая обычно вызывается в конце любой программы, использующей GLUT. Но и у разработчика приложения есть возможность на себя перехватить инициативу обработки сообщения. Для этого регистрируем в функции main idle (пустое событие) - тогда сами можем обрабатывать сообщения, а не windows. Выход из цикла – клавиша ESC.
void main(int argc, char *argv[]) //главный цикл приложения { glutInit(&argc, argv); //производит начальную инициализацию библиотеки GLUT. glutInitDisplayMode(GLUT_RGB); //инициализирует буфер кадра и настраивает полноцветный непалитровый) режим RGB. glutInitWindowSize(Width, Height); //используется для задания начальных размеров окна.
glutCreateWindow("timerAW"); // задает заголовок окна и визуализирует само окно на экране. glutDisplayFunc(Display); //регистрирует функцию Display(), которая будет вызвана при перерисовке окна. // initAW(); glutReshapeFunc(Reshape); //регистрирует функцию Reshape(), которая будет вызвана при изменении размеров окна. glutKeyboardFunc(Keyboard); //регистрирует функцию Keyboard(), которая будет вызвана при нажатии клавиши на клавиатуре. glutTimerFunc(200, timAW, 0); // a=1; glutMainLoop(); //Внутри бесконечного цикла в этой функции происходит контроль всех событий и вызов нужных функций. }
|