Использование таймера
Трехмерные объекты GLU
Создание glu объекта сводится к следующим этапам:
1. Создание объекта типа GLUquadricObj командой gluNewQuadric.
2. Установка свойств созданного объекта командой gluQuadricDrawStyle.
3. Рисование объекта.
4. Удаление объекта командой gluDeleteQuadric.
При программировании с использованием glu доступны следующие команды: void gluQuadricDrawStyle (GLUquadric * qObject,GLenum drawStyle) ,где qObject – указатель на quadric объект; drawStyle – стиль вывода трехмерного объекта. Возможные значения параметра drawStyle : GLU_FILL – сплошной объект, GLU_LINE – каркасный объект, GLU_POINT – рисуются только точки.
Рассмотрим команды:
1) рисования цилиндра:
void gluCylinder (GLUquadric * qobj,GLdouble baseRadius,GLdouble topRadius, GLdouble height, GLint slices,GLint stacks), где qObject – указатель на quadric объект; baseRadius – радиус первого основания; topRadius – радиус второго основания; height – высота; slices –количество слоев; stacks – количество секторов;
2) рисования диска:
void gluDisk (GLUquadric * qobj,GLdouble innerRadius, GLdouble outerRadius, GLint slices,GLint loops), где qObject – указатель на quadric объект; innerRadius – внутренний радиус; s outerRadiu – внешний радиус; slices – количество слоев; loops – количество огибающих;
3) рисования дискового сектора:
void gluPartialDisk (GLUquadric * qobj,GLdouble innerRadius, GLdouble outerRadius,GLint slices, GLint loops,GLdouble startAngle, GLdouble endAngle), где startAngle – начальный угол; endAngle – конечный угол сектора;
4) рисования сферы:
void gluSphere (GLUquadric * qobj,GLdouble radius,GLint slices, GLint loops).
Работа виртуального таймера основана на передаче сообщений. Приложение может заказать для любого своего окна несколько таймеров, которые будут периодически посылать в функцию окна сообщение с кодом WM_TIMER.
Есть и другой способ, также основанный на передаче сообщений. При использовании этого способа сообщения WM_TIMER посылаются не функции окна, а специальной функции, описанной с ключевым словом _export. Эта функция напоминает функцию окна и, так же как и функция окна, вызывается не из приложения, а из Windows. Функции, которые вызываются из Windows, имеют специальный пролог и эпилог и называются функциями обратного вызова (callback function). Функция окна и функция, специально предназначенная для обработки сообщений таймера, являются примерами функций обратного вызова.
Для создания виртуального таймера приложение должно использовать функцию SetTimer:
UINT WINAPI SetTimer(HWND hwnd, UINT idTimer, UINT uTimeout, TIMERPROC tmprc);Первый параметр функции (hwnd) должен содержать идентификатор окна, функция которого будет получать сообщения от таймера, или NULL. В последнем случае с создаваемым таймером не связывается никакое окно и сообщения от таймера будут приходить в специально созданную для этого функцию.
Второй параметр (idTimer) определяет идентификатор таймера (он не должен быть равен нулю). Идентификатор используется только в том случае, если первый параметр функции SetTimer содержит идентификатор окна. Так как для одного окна можно создать несколько таймеров, для того чтобы различать сообщения, приходящие от разных таймеров, приложение при создании должно снабдить каждый таймер собственным идентификатором.
Если первый параметр указан как NULL, второй параметр функции игнорируется, так как для таймера задана специальная функция, получающая сообщения только от этого таймера.
Третий параметр (uTimeout) определяет период следования сообщений от таймера в миллисекундах. Физический таймер тикает приблизительно 18,21 раза в секунду (точное значение составляет 1000/54,925). Поэтому, даже если указать, что таймер должен тикать каждую миллисекунду, сообщения будут приходить с интервалом не менее 55 миллисекунд.
Последний параметр (tmprc) определяет адрес функции, которая будет получать сообщения WM_TIMER (мы будем называть эту функцию функцией таймера). Этот параметр необходимо обязательно указать, если первый параметр функции SetTimer равен NULL.
Если приложение больше не нуждается в услугах таймера, оно должно уничтожить таймер, вызвав функцию KillTimer:
BOOL WINAPI KillTimer (HWND hwnd, UINT idTimer);Первый параметр функции (hwnd) определяет идентификатор окна, указанный при создании таймера функцией SetTimer.
Второй параметр (idTimer) - идентификатор уничтожаемого таймера. Это должен быть либо тот идентификатор, который был указан при создании таймера (если таймер создавался для окна), либо значение, полученное при создании таймера от функции SetTimer (для таймера, имеющего собственную функцию обработки сообщений).
Функция KillTimer возвращает значение TRUE при успешном уничтожении таймера или FALSE, если она не смогла найти таймер с указанным идентификатором.
Рассмотрим способ работы с таймером - подключение таймера к окну. В этом случае функция окна, к которому подключен таймер, будет получать сообщения от таймера с кодом WM_TIMER.
Этот способ самый простой. Вначале надо вызвать функцию SetTimer, указав ей в качестве параметров идентификатор окна, идентификатор таймера и период, с которым от таймера должны приходить сообщения:
#define FIRST_TIMER 1 int nTimerID; nTimerID = SetTimer(hwnd, FIRST_TIMER, 1000, NULL);В данном примере создается таймер с идентификатором FIRST_TIMER, который будет посылать сообщения примерно раз в секунду.
Для уничтожения таймера, созданного этим способом, следует вызвать функцию KillTimer, указав параметры следующим образом:
KillTimer(hwnd, FIRST_TIMER);Для изменения интервала посылки сообщений следует вначале уничтожить таймер, а потом создать новый, работающий с другим периодом времени:
KillTimer(hwnd, FIRST_TIMER); nTimerID = SetTimer(hwnd, FIRST_TIMER, 100, NULL);