Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИГС / Lab_02 / labor_02.doc
Скачиваний:
34
Добавлен:
17.04.2018
Размер:
431.1 Кб
Скачать

Пример программы моделирования движения в Windows.

Пусть код программы находится в файле mov01.cpp. Отметим особенности работы программы, написанной дляWindows, и описывающей движение графических объектов. Во-первых, для моделирования движения используется специальный математический аппарат, это аппарат аффинных преобразований.

Во-вторых, движение происходит в некотором цикле изменения координат движущейся фигуры. Наиболее просто было бы использовать, например цикл do{}while, где для задержки используется функцияdelay(). Действительно в однопользовательских операционных системах прошлого, таких какDOS, для анимации использовались простые циклы.

В Windowsпрограммах роль цикла движения выполняет цикл обработки сообщений, а для задержки используется системный таймер. Таймер создается вызовом функцииSetTimer().

UINT SetTimer(HWND hWnd, UINT nIDEvent,

UINT uElapse, TIMERPROC lpTimerFunc );

Первый параметр hWnd– это идентификатор окна, в котором создан таймер. Второй параметр nIDEvent– это идентификатор таймера. Дело в том для данного окна можно создать несколько таймеров. Третий параметрuElapse– это период следования сообщений от таймера в миллисекундах. Четвертый параметр должен быть равенNULL.

После создания таймера, таймер начинает периодически посылать в окно сообщениеWM_TIMER. Чтобы прекратить работу таймера его надо уничтожить функциейKillTimer().

BOOL KillTimer( HWND hWnd, UINT uIDEvent);

Создание и уничтожение таймера в программе mov01.cppследует следующей схеме. В начале работы программы после нажатия любой клавиши, создается таймер и начинается движение графических объектов. При следующем нажатии любой клавиши таймер уничтожается и движение приостанавливается. При очередном нажатии любой клавиши движение возобновляется вновь. Поэтому создание и уничтожение таймера происходит в функцииMove_OnKeydown().

//функция, обрабатывающая сообщение WM_KEYDOWN

void Move_OnKeydown(HWND hwnd)

{

if(MoveStop == 0)

{

KillTimer(hwnd, 1);

MoveStop = 1;

}

else

{

SetTimer(hwnd, 1, uElapse, NULL);

MoveStop = 0;

}

}

Эта функция вызывается в ответ на сообщение WM_KEYDOWN, Поэтому в функции окнаWndProc()должны быть соответствующие строчки кода.

switch(msg)

{

case WM_KEYDOWN:

Move_OnKeydown(hwnd);

break;

}

Когда таймер создан, он регулярно посылает в окно сообщение WM_TIMER. Это сообщение обрабатывается в функции окнаWndProc(), вызовом другой функцииMove_OnTimer().

switch(msg)

{

case WM_TIMER:

Move_OnTimer(hwnd);

break;

}

В-третьих, отметим особенности работы программы с контекстом окна на экране монитора. Отметим следующие моменты. Начальное расположение графических объектов рисуется в ответ на сообщение WM_PAINT, с помощью функцииMove_OnPaint(). В этой функции получение контекста и освобождение контекста производится с помощью функцийBeginPaint()и EndPaint().

Рисование движущихся объектов происходит в ответ на сообщение WM_TIMER, с помощью функцииMove_OnTimer(). В этой функции получение контекста и освобождение контекста производится с помощью другой пары функцийGetDC()и ReleaseDC().

Компилируем, запускаем программу mov01.exe, и результат работы этой программы показан на Рис.15.

Рис. 15.

Результат работы программы mov01.cpp.

Соседние файлы в папке Lab_02