Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
System programming / Конспект лекций / Лекция 4 Мышь.doc
Скачиваний:
54
Добавлен:
08.05.2015
Размер:
46.59 Кб
Скачать

Программная реализация

Для настройки таймера на использование в вашей программе можно использовать функцию 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, первый параметр которой определяет окно приложения, а второй – идентификатор таймера.

Следует заметить, что сообщения от таймера являются асинхронными, то есть ставятся в очередь приложения на ряду с остальными сообщениями. В связи с этим, для приложения не гарантируется, что сообщения от таймера будут попадать в оконную процедуру строго через определенные интервалы времени.