Функция 0nTimer(), которая обрабатывает сообщения WMJTIMER, находится в модуле OnTimer.cpp, код которого приведен в листинге 5.15.
Листинг 5.15
#include "Main.h"
#include "resource.h"
void RotateWheeKHDC hdc. int Erase);
void OnTimer(HWND hWnd.UINT message.WPARAM wParam.LPARAM IParam) {
HDCdc;
switch(wParam)
//Функция вызывается по сообщению WMJTIMER и записывает номер таймера //в переменную wParam. {
case 10: //Вызов остановки колеса KillTimerC hWnd. 10 );
PostMessageC hWnd.WM_SYSC0MMAND,SC_KEYMENU.'W'); break; case 2:
KillTimerC hWnd. 2 ); //От таймера 2 нужно получить однократное сообщение о том. что истекло //3 секунды с момента вывода подсказки. Поэтому таймер сразу же уничтожается, //а область подсказки стирается выводом прямоугольника, dc - GetDC(hWnd):
Rectanglе(dc.0.rCli ent.bottom-i Hei ght.rCli ent.ri ght.rCl i ent.bottom);
ReleaseDC(hWnd.dc); break; case 1:
//Каждое сообщение, поступившее от таймера 1. приводит к вызову функции
//рисования колеса RotateWheel() и выводу на экран следующей фазы
//динамического изображения. . л продолжение &
Создание и использование меню
Листинг 5.15 {продолжение)
de - GetDC(hWnd); RotateWheel (del); ReleaseDC(hWnd.dc);
}
}
Программа обучения реализована довольно просто. При выполнении команды Обучение функция ОпМепи() устанавливает режим обучения и вызывает подменю Work при помощи следующего фрагмента кода:
Demo-3;
DefWi ndowProc(hWnd.WMJYSCOMMAND.SC_KEYMENU.1W');
Вывод подменю порождает сообщение WM_ENTERIDLE и вызов функции OnEnterldl е(). Функция OnEnterldlе() запустит движение колеса и таймер 10, чтобы отсчитать заданное время движения. По истечении заданного интервала времени в оконную процедуру поступит сообщение WMJTIMER и функция 0nTimer() при обработке сигнала таймера 10 повторно вызовет подменю Work, но уже для остановки колеса.
Текст функции OnEnterldlе(), реализующей программу обучения, приведен в листинге 5.16.
Листинг 5.16
#include <windows.h> #include "Main.h" extern int Demo;
void OnEnterIdle(HWND hWnd.WPARAM wParam.LPARAM IParam) {