Сегодня вы научитесь:
Таймер можно установить так,чтобы он срабатывал с определенным интервалом. Когда таймер срабатывает, приложению отсылается сообщение WM_TIMER. С помощью нашей среды программирования можно добавить к приложению функцию, которая будет обрабатывать данное сообщение.
События таймера ставятся в очередь событий приложения лишь в том случае, если эта очередь пуста и приложение неактивно (простаивает). И наоборот событие таймера не ставится в очередь событий,если оно произошло в тот момент, когда приложение занято.Windows ставит в очередь событий только одно сообщение таймера. Все сообщения о событиях, которые произойдут тогда, когда приложение занято, будут проигнорированы. Независимо от количества проигнорированных сообщений Windows может поставить в очередь только одно сообщение от таймера.
Чтобы запустить или остановить таймер,вам необходимо указать идентификатор таймера(ID), который может принимать любое целое значение. Этот идентификатор используется приложением для запуска или остановки таймера, а так же для определения сработавшего таймера.
В нашем приложении будут использованы два таймера. Первый таймер будет применяться для отображения часов в окне нашего приложения. Второй таймер будет срабатывать через интервал времени указанный пользователем в диалоговом окне. Пользователь может в любой момент запустить или остановить таймер.
Создание проекта.
Таблица 5.1
Static Text | Caption | Timer &Interval |
Edit Box | ID | IDC_EINTERVAL |
Button | ID Caption |
IDC_BSTARTTIME &Start Time |
Button | ID Caption Disabled |
IDC_BSTOPTIMER S&top Timer TRUE |
Static Text | Caption | Time |
Static Text | ID Caption |
IDC_STATICTIME Current Time |
Static Text | Caption | Count |
Static Text | ID Caption |
IDC_STATICCOUNT 0 |
Button | ID Caption |
IDC_EXIT E&xit |
Вверх
Листинг 5.1
//Добавить пункт меню
ASSERT(IDB_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
CMenu* pSysMenu = GetSistemMenu(FALSE);//
SetIcon(m_hIcon, TRUE);//установить большой значек
//запустить таймер часов
SetTimer(ID_CLOCK_TIMER, 1000, NULL);
return TRUE;
}
Как видим здесь в функцию нам надо добавить всего одну строку кода:
SetTimer(ID_CLOCK_TIMER, 1000, NULL);
остальное все сделал мастер.
Из листинга видно, что запускает таймер часов функция SetTimer()
SetTimer(ID_CLOCK_TIMER, 1000, NULL);
В качестве первого аргумента функции SetTimer передается идентификатор
таймера.
Второй аргумент определяет частоту, с которой будет запускаться
событие таймера.В данном случае событие таймера запускается каждые
1000 миллисекунд, или раз в секунду.
Третьим необязательным аргументом является адрес функции обратного вызова.
Функция обратного вызова предназначена для обработки событыя таймера.
Если передать функции SetTimer в качестве третьего аргумента NULL(пустой
указатель), тогда сообщение WM_TIMER будет отослано в очередь сообщений
приложения.
Вот как эта функция объявлена в классе CWnd
Вверх
Листинг 5.2 Функция OnTimer
CTime curTime = CTime::GetCurrentTime();
//поместить текущее время в переменную в соответствующем формате
m_sTime = curTime.Format("%H:%M:%S");
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
Эта функция OnTimer в данном случае нами переопределяется.
Этой функции передается в аргумент идентификатор таймера, и эта функция
будет вызываться системой всякий раз, когда наступит событие таймера.
А событие (сигнал от таймера) будет наступать всякий раз по прошесвию интервала, который мы указали в функции SetTimer при установке таймера.
В листинге 5.2 декларируется экземпляр класса CTime и его значение
инициализируется текущим системным значением.
CTime curTime = CTime::GetCurrentTime();
Затем вызывается метод Format() объекта curTime класса CTime.
Этот метод преобразует полученное в предыдущей строке системное
время в общепринятый стандарт.
Текущее время записывается в строке m_sTime.Для преобразования
текущего времени в общепринятый формат используется метод Format.
m_sTime = curTime.Format("%H:%M:%S");
После этого диалоговое окно обновляется текущим временем.
UpdateData(FALSE);
Скомпилируйте и запустите приложение.В центре диалогового окна
появятся часы.-они будут отображать текущее время.
АВ:
Итак здесь функция OnTimer привязана к событию таймера WM_TIMER.
То есть каждый раз когда таймер срабатывает, вызывается эта функция
которая вызывает текущее время, преобразует его в удобный для восприятия
формат и помещает это значение в управляющий элемент Static Text
А событие таймера (срабатывание таймера) происходит как мы помним
один раз в секунду.Следовательно каждую секунду отражается текущее
время в элементе Static Text
Вверх
Вверх
В Листинге 5.2 приведен один из этих методов:
CTime curTime = CTime::GetCurrentTime();
Здесь для инициализации нового объекта текущим временем используется
метод GetCurrentTime(), который возвращает объект CTime.
Другим методом создания и инициализиции объекта CTime является
использование следующей версии конструктора :
CTime(int Year, int iMonth, int iDay, int iHour, int iMin, int iSec,
int iDst);
Данный конструктор инициализирует объект значениями года, месяца, дня,
часа, минут, секунд.Последний параметр (Daylight Saving Time) летнее
время, указывает следует ли учитывать переход на летнее время и обратно.
Если значение этого параметра 0. - тогда используется стандартное поясное
время.Если значение больше 0, - учитывается переход на летнее время,
Если значение меньше 0 (значение по умолчанию) то будет ли учитываться
переход на летнее время зависит от значений параметров заданных при
конфигурации компьютера.
Вверх
После создания и инициализации объекта CTime необходимо извлечь
из объекта значение даты и времени.Функции которые используются для
этой цели перечислены ниже в таб.5.2
Таблица 5.2
Добавление идентификаторов таймеров
В данном приложении будут использоваться два таймера. Чтобы однозначно определить
таймер,ему следует присвоить уникальный идентификатор. Добавьте в приложение
идентификаторы используемых таймеров.
Теперь в приложении можно использовать идентификаторы обоих таймеров.
Запуск таймера часов
Чтобы запустить таймер часов,отредактируйте функцию OnInitDialog
Воспользуйтесь знаниями полученными в предыдущих главах и измените
тело функции в соответствии с листингом 5.1
BOOL CTimerDlg::OnInitDialog
{
//"About ..." (О программе к системному меню
//IDM_ABOUTBOX должен быть в области системных команд
ASSERT(IDB_ABOUTBOX < 0xF000);
if(pSysMenu != NULL) //пустой указатель
{
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
//если основное окно приложения не диалог
SetIcon(m_hIcon, FALSE);//установить маленький значек
// Timer Functions
UINT SetTimer(UINT nIDEvent, UINT nElapse,
Вызов этой функции организован так : Ее адрес передается функции Windows
в качестве аргумента.Теперь.когда операционная система знает адрес
этой функции, она вызывает ее непосредственно каждый раз, когда определит
что произошло событие, для обработки которого операционная система
должна вызывать функцию обратного вызова.
Обработка событий таймера часов
После запуска таймера часов, необходимо написать код, обрабатывающий
события таймера.
void CTimersDlg::OnTimer(UINT nIDEvent)
{
А вот как она объявлена в классе CWnd
afx_msg void OnTimer(UINT nIDEvent);
Библиотека MFC Класс CTime
Класс CTime охватывает многие функциональные возможности, необходимые
при создании приложений, работающих с датой/временем.В классе CTime
используется универсальное глобальное время(по Гринвичу).Это позволяет
легко работать как с местным временем (определяется параметрами заданными
при настройке компьютера), так и со средним временем по гринвичскому
мередиану.
Создание и инициализация даты и времени
При простом декларировании объекта CTime создается пустой объект.
Он не может быть использован до тех пор, пока не будет инициализирован
временем.Но есть несколько методов создания объекта данного класса.
И в них объект инициализируется сразу после его создания.
Извлечение даты и времени
GetYear | Возвращает год |
GetMonth | Возвращает месяц |
GetDay | Возвращает день месяца |
GetHour | Возвращает часы |
GetMinute | Возвращает минуты |
GetSecond | Возвращает секунды |
GetDayWeek | Возвращает дни недели(1=воскресенье, 7=суббота) |
Format | Возвращает в CString местное время в формате определяемом строкой форматирования.Строка форматирования передается данной функции в качестве параметра.Коды форматов даты и времени приведены в таб 5.3 |
FormatGmt | Возвращает в CString среднее время по Гринвичу в формате определяемом строкой форматирования.Строка форматирования передается данной функции в качестве параметра.Коды форматов даты и времени приведены в таб 5.3 |
%a | Сокращенное название дня недели |
%A | Полное название дня недели |
%b | Сокращенное название месяца |
%B | Полное название месяца |
%c | Стандартный формат даты и времени для данной местности (Определяется параметрами задаваемыми с помощью панели управления) |
%d | День месяца |
%D | Целое количество дней в CTime |
%H | Время в 24-часовом формате |
%I | Время в 12-часовом формате |
%J | День года |
%m | Порядковый номер месяца |
%M | Минуты |
%p | Индикатор AM/PM |
%S | Секунды |
%U | Порядковый номер недели в году;первым днем недели считается воскресенье |
%w | Порядковый номер дня недели |
%W | Порядковый номер недели в году;первым днем недели считается понедельник |
%x | Дата в стандартном формате для данной местности |
%X | Время в стандартном формате для данной местности |
%y | Две последние цифры года (двузначное число) |
%Y | Год полностью |
%z %Z | Полное или сокращенное название часового пояса |
%% | Знак процента |
Назад |
Вверх |
Вперед
Содержание