Лабораторні роботи WinApi
Лабораторна робота №6
"Таймер"
Програмування таймеру.
Робота з системною датою та часом.
Створення декількох таймерів, та обробка повідомлень від таймеру.
В данной лабораторной работе вам необходимо изучить работу «таймера».
Таймер – это объект ядра ОС Windows, который может быть проинициализирован, после чего в очередь сообщений для вашего приложения будет приходить сообщениеWM_TIMER каждый раз по истечении заданного промежутка времени.
Для установки таймера используется функция WinApi: SetTimer().
Для уничтожения таймера используют KillTimer();
Для написания 7 лаб. работы необходимо взять за основу, 4 лаб.работу. В ней создается окно, в которое необходимо вывести следующее:
- Системную дату.
Для этого вам необходимо ее получить. Это можно сделать, вызвав функцию:
GetDateFormat();
Вызов данной функции лучше выполнить в обработке сообщения WM_CREATE, то есть при создании окна. Результатом работы функции будет заполненная текстовая строка с текущей датой, которую вы и выведете при обработке сообщения WM_PAINT.
- Системное время с точностью до секунд.
Так как время будет меняться каждую секунду, то его и обновлять необходимо будет каждую секунду.
Поэтому необходимо использовать таймер. Например, его можно создать таким вызовом:
SetTimer(hwnd, 6, 1000, NULL);
где
hwnd – дескриптор окна;
6 (второй параметр) – идентификатор таймера, почему я задал ему номер 6 а не 1 поймете ниже. Но это просто его номер.
1000 (третий параметр) – промежуток времени, задается в млсек. 1000 млсек = 1 сек.
NULL (четвертый параметр) – указатель на функцию, которая будет вызвана, для обработки сообщения WM_TIMER, если задан NULL, то вызывается ваша оконная функция.
Вызов этой функции лучше выполнить при обработке сообщения WM_CREATE.
Тут же , не забудьте вставить обратный вызов, то есть уничтожение таймера.
KillTimer(hwnd, 6);
Где второй параметр это идентификатор удаляемого таймера.
Вызов данной функции лучше сделать в обработке сообщения WM_DESTROY, то есть при уничтожении окна.
Установив таймер, вы будете получать сообщение WM_TIMER, каждую секунду.
В обработчике этого сообщения вставьте вызов функции
GetTimeFormat(), которая вам вернет системное время. Результат будет в текстовой строке, вывод которой вставьте в обработке WM_PAINT.
- Программирование пяти таймеров на разное время.
Выведите в окно пять строк следующего содержания:
Timer number 1 ( 5s. ) - OFF
Timer number 2 ( 10s. ) – OFF
Timer number 3 ( 15s. ) – OFF
Timer number 4 ( 20s. ) – OFF
Timer number 5 ( 25s. ) - OFF
Если пользователь выполнить щелчок левой кнопки мыши по какой то из пяти строк, то фраза OFF, должна измениться на фразу ON, и после чего, через соответствующий промежуток времени (5, 10, 15, 20 или 25 сек.) соответствующая строка будет выглядеть например так:
Timer number 4 ( 20s. ) – ON ( BEEP! )
Фраза BEEP, должна появляться каждый раз по истечении промежутка времени сигнализируя о том что данный таймер включен и работает. Не забудьте ее убирать для того чтоб было видно момент ее включения следующий раз.
Если пользователь выполнит повторный щелчок левой кнопкой мыши по тому же таймеру, то он должен выключиться (ON -> OFF), и после чего сигнал BEEP, не должен возле него появляться.
Пользователь может включить любое количество таймеров (он 1 до 5 одновременно), и все они должны «делать» BEEP, по истечении своего промежутка времени.
Для выполнения последнего (третьего) задания, сделайте следующее:
Вставьте обработку сообщения WM_LBUTTONDOWN, которое приходит, при нажатии левой кнопки и мыши. Проверьте координаты Миши, в которых выполнено нажатие, есть координаты совпадают с одной из строк 5 таймеров, то выполните действия по установке данного таймера.
Например для первого SetTimer(hwnd, 1, 5000, NULL);
Или для второго - SetTimer(hwnd, 2, 10000, NULL);
Перерисуйте OFF на ON.
Если таймер был включен, то выключите его
KillTimer(hwnd, 1);
Перерисуйте ON на OFF.
Как только вы установите очередной таймер, то он тоже станет присылать WM_TIMER. Для того чтоб различить от какого таймера пришло сообщение, тоесть какой промежуток времени прошел, для этого воспользуйтесь номером таймера который вы получаете вместе с сообщением WM_TIMER в параметре lParam.
Таким образом в обработчике WM_TIMER: можно выполнить следующее:
switch(lParam) {
case 1: // обработка таймера на 5 сек
break;
case 2: // обработка таймера на 10 сек
break;
case 3: // обработка таймера на 15 сек
break;
case 4: // обработка таймера на 20 сек
break;
case 6: // обработка таймера на 1 сек формирование строки системного времени
break;
}
Данная лаб.раб. рассчитана на одно лабораторное занятие.