Класс CTime // Абсолютное время

Лекция 5.

Использование таймера.

Рассмотрим вопрос, связанный с использованием таймера в наших приложениях. Для этого нам необходимо познакомиться с парочкой методов из класса CWnd.

Метод UINT CWnd::SetTimer(UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)); - позволяет определить таймер с порядковым номером nIDEvent и указать через какой промежуток времени в миллисекундах будет срабатывать таймер UINT nElapse. По сути дела, система установит указанный Вами таймер и, по истечении времени nElapse, будет посылать приложению сообщение WM_TIMER. Замечу, что эти сообщения не аккумулируются. То есть, если в очереди сообщений приложения уже присутствует сообщение от таймера, то новое добавляться не будет.

BOOL CWnd::KillTimer (int nIDEvent); - удаляет таймер nIDEvent, установленный ранее с помощью метода SetTimer. Возвращаемое значение не ноль, если таймер был удален.

Таким образом, Если Вы хотите использовать таймер(ы) в Вашей программе, Вам необходимо: запустить таймер вызвав функцию SetTimer, написать обработчик сообщения WM_TIMER (см. рисунок) и уничтожить таймер, когда в нем отпадет необходимость.

Рис. 1. Окно мастера классов, в котором создается обработчик сообщения WM_TIMER для класса диалога

В качестве примера разработаем приложение, которое выполняет функции секундомера (точность 0,1 сек.). Создадим проект на основе диалога и разместим в редакторе ресурсов на диалоговом окне 3 кнопки – Start, Stop и Reset, а также элемент статический текст, в котором будет отображаться значение прошедшего времени. При нажатии на кнопку Start таймер запускается, при нажатии на кнопку Stop – останавливается, а при нажатии на кнопку Reset – сбрасывается.

Рис. 2.

С элементом управления Статический текст связываем переменную, для чего используем мастер классов (Ctrl+Shift+X). Чтобы идентификатор (ИД) элемента управления Статический текст появился в окне Переменные-члены, необходимо в свойствах этого элемента управления в редакторе ресурсов изменить вручную ИД с IDC_STATIC на IDC_STAIC1. Переменная, связанная с этим элементом управления, имеет тип CStatic категории Control, и называется m_static.

Рис. 3.

Добавим в класс диалога переменную-член:

double m_t;

Чтобы это сделать, необходимо в Окне классов выбрать класс диалога и вызвать для него контекстное меню, нажав правую кнопку мыши. В контекстном меню выбрать подменю добавить, в котором выбрать пункт Добавить переменную, как показано на рисунке 4.

Рис. 4.

В обработчике нажатия на кнопку Start запускаем таймер:

void CProject5Dlg::OnBnClickedButton1()

{

// TODO: добавьте свой код обработчика уведомлений

SetTimer(1,100,NULL); // порядковый номер таймера 1 (первый параметр)

}

В обработчике нажатия на кнопку Stop останавливаем таймер:

void CProject5Dlg::OnBnClickedButton2()

{

// TODO: добавьте свой код обработчика уведомлений

KillTimer(1);

}

В обработчике нажатия на кнопку Reset Обнуляем значение счетчика времени и обновляем текст на элементе Статический текст:

void CProject5Dlg::OnBnClickedButton3()

{

// TODO: добавьте свой код обработчика уведомлений

m_t=0;

m_static.SetWindowText(_T("0.0s"));

}

В обработчике сообщения WM_TIMER, который добавляется с помощью мастера классов (рис. 1), пишем код:

void CProject5Dlg::OnTimer(UINT_PTR nIDEvent)

{

// TODO: добавьте свой код обработчика сообщений или вызов стандартного

if(nIDEvent==1){ // проверка порядкового номера таймера

m_t=m_t+0.1; // добавляем 0.1 сек к счетчику времени

CAtlString s; // объявляем объект для работы со строками

s.Format(_T("%.1fs"),m_t); // форматируем строку (для преобразования числа в строку)

m_static.SetWindowTextW(s); // вывод значения в элемент Статический текст

}

CDialogEx::OnTimer(nIDEvent);

}

Результат выполнения программы представлен на рис. 5.

Рис. 5.

Часто встречаемые классы.
CTime, CTimeSpan

В данном разделе вашему вниманию предлагаются классы CTime и класс CTimaSpan. Класс CTime представляет абсолютное время и дату. Класс CTimaSpan представляет относительное время в секундах. Можно сказать, что объект класса CTimaSpan это временной интервал между двумя объектами класса CTime. Так как объект класса CTimaSpan хранится в знаковом 4-х байтном значении, то длина максимального временного интервала составляет примерно (+/-)68 лет.

Класс CTime // Абсолютное время

CTime(); // Конструктор по умолчаниюCTime(const CTime& timeSrc); // Конструктор копированияCTime(time_t time); // Конструктор с параметром // объект структуры time_t (см. MSDN)CTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec, int nDST = -1);// Конструктор с параметрами:// год (от 1.1.1970 до 18.1.2038)// месяц (1 - 12)// день (1 - 31)// часы// минуты// секунды// DST = 0 - стандартное время;// DST > 0 - учет перехода на летнее время// DST < 0 - автоматический выбор между первыми двумя вариантами

static CTime PASCAL GetTickCount()

// Возвращает объект класса CTime, который хранит информацию// о текущей дате и текущем времени time_t GetTime() const; // Возвращает время в виде объекта // структуры time_tint GetYear() const; // Возвращает год, записанный // в объекте CTimeint GetMonth() const; // Возвращает месяц, записанный // в объекте CTime (1-12, 1 - Январь)int GetDay() const; // Возвращает день, записанный // в объекте CTime (1-31)int GetHour() const; // Возвращает часы, записанные // в объекте CTime (0-23)int GetMinute() const; // Возвращает минуты, записанные // в объекте CTime (0-59)int GetSecond() const; // Возвращает секунды, записанные // в объекте CTime (0-59)int GetDayOfWeek() const; // Возвращает день недели, основанный // данных, записанных в объекте // CTime (1 - Воскресенье и т. д.) const CTime& operator =(const CTime& timeSrc);const CTime& operator =(time_t t);// Перегруженный оператор присваивания CTime operator +(CTimeSpan timeSpan) const;CTime operator -(CTimeSpan timeSpan) const;CTimeSpan operator -(CTime time) const;const CTime& operator +=(CTimeSpan timeSpan);const CTime& operator -=(CTimeSpan timeSpan);// Сложение и вычитание времен BOOL operator ==(CTime time) const;BOOL operator!=(CTime time) const;BOOL operator <(CTime time) const;BOOL operator >(CTime time) const;BOOL operator <=(CTime time) const;BOOL operator >=(CTime time) const;// Сравнение времен CString Format(LPCTSTR pFormat) const;// Форматирование времени в строку// Пример использования:// CString s = t.Format("%A, %B %d, %Y");// Типы:// %a - сокращенное названия дня недели// %A - полное название дня недели// %b - сокращенное название месяца// %B - полное название месяца// %c - дата и время, отображаемые соответственно настройкам Windows// %d - день месяца (01-31)// %H - часы (00-23)// %I - часы (01-12)// %j - день года (001-366)// %m - месяц (01-12)// %M - минуты (00-59)// %p - AM/PM индикатор для 12-часового формата дня// %S - секунды (00-59)// %U - номер недели года (00-53) // Воскресенье - первый день недели// %w - день недели (0-6) // 0 - Воскресенье// %W - номер недели года (00-53) // Понедельник - первый день недели// %x - дата, отображаемая соответственно настройкам Windows// %X - время, отображаемое соответственно настройкам Windows// %y - год без века (00-99)// %Y - год с веком// %z, %Z - имя временной зоны или ее аббревиатура// ничего, если имя временной зоны неизвестно// %% - знак процента Следующий фрагмент кода демонстрирует принцип получения времени:

CTime t;

t=CTime::GetTickCount();

CAtlString s=t.Format(_T("%H:%M:%S"));

SetWindowText(s);

Этот код можно добавить в обработчик сообщения таймера. Тогда после запуска приложения в заголовке диалогового окна будет отображаться текущее время.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: