Лабораторні роботи WinApi

Лабораторна робота №6

 "Таймер"

Програмування таймеру.
Робота з системною датою та часом. 
Створення декількох таймерів, та обробка повідомлень від таймеру.

 

В данной лабораторной работе вам необходимо изучить работу «таймера».

 

Таймер – это объект ядра ОС Windows, который может быть проинициализирован, после чего в очередь сообщений для вашего приложения будет приходить сообщениеWM_TIMER каждый раз по истечении заданного промежутка времени.

 

Для установки таймера используется функция WinApi: SetTimer().

Для уничтожения таймера используют KillTimer();

 

Для написания 7 лаб. работы необходимо взять за основу, 4 лаб.работу. В ней создается окно, в которое необходимо вывести следующее:

  1. Системную дату.

Для этого вам необходимо ее получить. Это можно сделать, вызвав функцию:

GetDateFormat();

Вызов данной функции лучше выполнить в обработке сообщения WM_CREATE, то есть при создании окна. Результатом работы функции будет заполненная текстовая строка с текущей датой, которую вы и выведете при обработке сообщения WM_PAINT.

  1. Системное время с точностью до секунд.

Так как время будет меняться каждую секунду, то его и обновлять необходимо будет каждую секунду.

Поэтому необходимо использовать таймер. Например, его можно создать таким вызовом:

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.

 

  1. Программирование пяти таймеров на разное время.

Выведите в окно пять строк следующего содержания:

 

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;

}

 

Данная лаб.раб. рассчитана на одно лабораторное занятие.