Для настройки таймера на использование в вашей программе можно использовать функцию API SetTimer:
SetTimer(hwnd, ID_TIMERn, iMsecInterval, TimerProc);
где первый параметр определяет окно, оконная процедура которого будет получать сообщение WM_TIMER через каждые iMsecInterval миллисекунды, ID_TIMERn – идентификатор таймера (если ваша оконная процедура получает сообщения от нескольких таймеров, то по этому параметру можно определить от какого именно), TimerProc используется в том случае, когда периодически необходимо вызывать какую-либо функцию: тогда этот параметр является адресом функции.
Рассмотрим пример использования этой функции.
Пример 1.
Программе необходимо каждую секунду обновлять данные в окне приложения и каждую минуту выполнять авто-запись в файл.
#define ID_TIMER1 1
#define ID_TIMER2 2
void CALLBACK TimerProc(HWND hwnd, UINT Msg, UINT iTimerID, DWORD dwTimer)
{
// Запись информации на диск
}
int CALLBACK WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
.....
switch (Msg)
case WM_CREATE:
SetTimer(hwnd, ID_TIMER1, 60000, (TIMERPROC)TimerProc);
SetTimer(hwnd, ID_TIMER2, 1000, NULL);
break;
case WM_TIMER:
if (wParam == ID_TINER2) InvalidateRect(hwnd, NULL, FALSE);
break;
case WM_PAINT:
. . . . . .
break;
case WM_DESTROY:
KillTimer(hwnd, ID_TIMER1);
KillTimer(hwnd, ID_TIMER2);
break;
. . . . . . . .
}
В данной программе устанавливаются два таймера во время прихода сообщения WM_CREATE. Первый из них устанавливает вызов процедуры TimerProc каждые 60000 миллисекунд, то есть каждую минуту. Установка второго таймера приводит к тому, что оконная процедура каждую секунду будет получать сообщение от таймера WM_PAINT, причем параметр wParam при этом будет содержать идентификатор таймера ID_TIMER2.
Обработка сообщения делает недействительной клиентскую область окна приложения, что автоматически приводит к посылке сообщения WM_PAINT.
При обработке сообщения WM_DESTROY приложение убивает установленные таймеры при помощи функции KillTimer, первый параметр которой определяет окно приложения, а второй – идентификатор таймера.
Следует заметить, что сообщения от таймера являются асинхронными, то есть ставятся в очередь приложения на ряду с остальными сообщениями. В связи с этим, для приложения не гарантируется, что сообщения от таймера будут попадать в оконную процедуру строго через определенные интервалы времени.