Продолжаем развивать наш проект.
Добавляем идентификатор таймера в заголовочный файл диалогового окна.
// diaDlg.h : header file
//
#if !defined(AFX_DIADLG_H__EBFF09CD_7067_11D5_B617_89F1B6D3EB46__INCLUDED_)
#define AFX_DIADLG_H__EBFF09CD_7067_11D5_B617_89F1B6D3EB46__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define ID_TIMER_1 100
/////////////////////////////////////////////////////////////////////////////
// CDiaDlg dialog
В объявлении класса окна диалога добавляем функцию и переменную.
class CDiaDlg : public CDialog
{
............
// Implementation
afx_msg void OnTimer(UINT); // функция реакции на таймер
bool Test; // установка удаление таймера
protected:
............
};
В таблице откликов диалога.
BEGIN_MESSAGE_MAP(CDiaDlg, CDialog)
..........
//}}AFX_MSG_MAP
ON_WM_TIMER() // реагировать на таймер
END_MESSAGE_MAP()
Реализация функции в ответ на таймер.
void CDiaDlg::OnTimer( UINT uTime)
{
m_List.AddString("Timer !");
}
Реализация функции при нажатия на кнопку.
void CDiaDlg::OnButton1()
{
if (!Test) // если таймер не установлен
{
Test=true; // установить его (логически)
SetTimer(ID_TIMER_1,1000,NULL); // а теперь физически
}
else // а иначе (установлен)
{
Test=false; // убить логически
KillTimer(ID_TIMER_1); // физически
}
}
Изменяем конструктор диалогового окна.
CDiaDlg::CDiaDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDiaDlg::IDD, pParent)
{
..........
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Test=false; // таймер не установлен
}
Вот такой результат Вы должны получит в результате сборки и запуска программы.
Таймер позволяет синхронизировать процессы с реальным временем. Работает он так - после запуска таймера, через указанный интервал, вызывается процедура внутри которой и происходит анализ, реакция или подсчет вызовов.
Первым делом в файле заголовка ресурсов мы объявили идентификатор таймера. Таймеров в программе может быть несколько с разными интервалами, а событие вызова таймера одно. Так вот, при его вызове передается таймер, который сработал.
Далее в классе диалогового окна мы объявили функцию реакции. Её имя и параметры оговорены заранее, так как она виртуальная afx_msg. Как найти функцию соответствующую событию ? Наведите курсор на событие, а в нашем случае ON_WM_TIMER() и нажмите F1.
ON_WM_TIMER() afx_msg void OnTimer( UINT );
Переменную Test я завел для остановки и запуска таймера. Следующим шагом, объявлена реакция на событие в таблице откликов. Реализация реакции простая. В наш список добавляется строка "Timer !", для визуального контроля над процессом.
Дальше у нас реакция на нажатие кнопки. Смотри в корень! Запускается и останавливается таймер в зависимости от содержания переменной Test. SetTimer запускает таймер. В эту функцию передаётся идентификатор (имя) таймера и интервал реакции.
CWnd::SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer));
// nIDEvent Не нулевой идентификатор таймера
// UINT nElapse Интервал задержки
// void (CALLBACK EXPORT* lpfnTimer) Функция вызова. Если NULL то будет генерироваться сообщение
После использования таймер нужно убить с помощью функции KillTimer, указав идентификатор таймера.
CWnd::KillTimer(int nIDEvent);
// nIDEvent Не нулевой идентификатор таймера
//Функция возвращает ненулевое значение в случае удачного попадания, ой убийства таймера.
Последние строки это установка начального значения переменной Test в самом начале. Итак, запускаем. Нажимаем на кнопку, в списке добавляются строки. Нажимаем еще раз - всё остановилось. Вот так.
У таймера должен быть ненулевой идентификатор.
#define ID_TIMER_1 100
Реакция на таймер должна быть в таблице отклика.
ON_WM_TIMER()
И функция должна быть реализована.
afx_msg void OnTimer( UINT );
Запуск - Остановка.
SetTimer(....);
KillTimer(....);