Общие замечания

Для инкапсуляции даты/времени в MFC предназначен класс CTime. Даты, которые могут содержать объекты данного типа, находятся в диапазоне от 01.01.1970 до 18.01.2038 (это связано с тем, что они хранятся в поле типа time_t, который «унаследован» аж от MS-DOS). Класс CMonthCalCtrl инкапсулирует элемент управления общего назначения Month Calendar (окно класса «SysMonthCal32»), который представляет собой месячный календарь с возможностью задания диапазона отображаемых дат. Класс CDateTimeCtrl инкапсулирует элемент управления общего назначения Date-Time Picker (окно класса «SysDateTimePick32»), который позволяет пользователю задавать дату или время.

Класс CTime

Заголовочный файл #include <afxwin.h>
Непосредственный предок
Объектная модель generic

Ниже перечислены основные методы класса CTime.

Конструирование (construction)

CTime(void);

Конструирует неинициализированный объект.

CTime(
   const CTime& time
);

Конструирует объект как копию time.

CTime(
   int nYear,
   int nMonth,
   int nDay,
   int nHour,
   int nMin,
   int nSec,
   int nDST = -1
);

Конструирует объект, инициализируя дату и время заданными значениями. Если задать параметр nDST равным 0, то объект никогда не будет учитывать переход на летнее время; если задать nDST больше 0, то переход на летнее время будет учитываться всегда. И наконец, если задать nDST равным -1, то необходимость учитывать переход на летнее время будет распознаваться автоматически (в зависимости от форточных настроек).

CTime(
   const SYSTEMTIME& st,
   int nDST = -1
);

Конструирует объект, инициализируя дату и время значениями полей структуры st (тип SYSTEMTIME описан в документации по Win32 API). Параметр nDST имеет тот же самый смысл, что и в предыдущем случае.

CTime(
   const FILETIME& ft,
   int nDST = -1
);

Конструирует объект, инициализируя дату и время значениями полей структуры ft (тип FILETIME описан в документации по Win32 API). Параметр nDST имеет тот же самый смысл, что и в предыдущем случае.

Заметим, что преобразования значений типа SYSTEMTIME к типу FILETIME и обратно можно воспользоваться функциями Win32 API SystemTimeToFileTime и FileTimeToSystemTime соответственно.

Получение составляющих (extraction)

int GetYear(void) const;

Возвращает год в диапазоне от 1970 до 2038.

int GetMonth(void) const;

Возвращает месяц в диапазоне от 1 до 12.

int GetDay(void) const;

Возвращает день в диапазоне от 1 до 31.

int GetHour(void) const;

Возвращает час в диапазоне от 0 до 23.

int GetMinute(void) const;

Возвращает минуту в диапазоне от 0 до 59.

int GetSecond(void) const;

Возвращает секунду в диапазоне от 0 до 59.

int GetDayOfWeek(void) const;

Возвращает номер дня недели в диапазоне от 1 до 7, причем 1 соответствует воскресенью.

Преобразование (conversion)

BOOL GetAsSystemTime(
   SYSTEMTIME& stDest
) const;

Преобразует текущее значение даты/времени к типу SYSTEMTIME и записывает результат преобразования в структуру stDest.

CString Format(
   LPCTSTR pszFmtStr
) const;
CString Format(
   UINT uFmtID
) const;

Преобразует текущее значение даты/времени в строку на основании заданной форматирующей строки. Через параметр pszFmtStr необходимо передавать саму форматирующую строку, а через параметр uFmtID — идентификатор форматирующей строки в String Table.

Форматирующая строка составляется по тому же принципу, что и для функции sprintf стандартной библиотеки, и может, помимо обычного текста, содержать следующие форматирующие последовательности:

ФП результат
%a сокращенное название дня недели
%A полное название дня недели
%b сокращенное название месяца
%B полное название месяца
%c дата и время в соответствии с системными настройками
%d день месяца от 1 до 31
%D общее количество дней в дате
%H час от 0 до 23
%I час от 1 до 12
%j день года от 1 до 366
%m месяц от 1 до 12
%M минута от 0 до 59
%p символ «до/после полудня» в соответствии с системными настройками
%S секунда от 0 до 59
%U номер недели в году от 0 до 53, считая началом недели воскресенье
%w день недели от 0 до 6, причем 0 соответствует воскресенью
%W номер недели в году от 0 до 53, считая началом недели понедельник
%x дата в соответствии с системными настройками
%X время в соответствии с системными настройками
%y год без века от 0 до 99
%Y год полностью от 1970 до 2038

Операторы (operators)

CTime operator =(
   const CTime& time
);
CTime operator =(
   time_t time
);

Присваивает данному объекту значение time.

Для класса CTime определены также операторы отношения ==, !=, >, <, >= и <=, позволяющие сравнивать два объекта следующим образом:

CTime time1;
CTime time2;
...
if (time1 != time2)
{
   AfxMessageBox(_T("Время не совпадает!"));
}

Класс CMonthCalCtrl

Заголовочный файл #include <afxdtctl.h>
Непосредственный предок класс CWnd
Объектная модель DYNAMIC

Ниже перечислены основные методы класса CMonthCalCtrl.

Конструирование (construction)

CMonthCalCtrl(void);
BOOL Create(
   DWORD fdwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT uID
);

В качестве одного из стилей, задаваемых параметром fdwStyle необходимо обязательно указывать WS_CHILD. Кроме этого, обычно используется стиль WS_VISIBLE, а также один или несколько стилей, специфичных для данного элемента управления:

MCS_MULTISELECT
Сделать допустимым выбор непрерывного диапазона дней (максимально возможный диапазон по умолчанию составляет в этом случае 7 дней).
MCS_NOTODAY
Не отображать «сегодняшнюю» дату в нижней части окна.
MCS_NOTODAYCIRCLE
Не обводить в календаре «сегодняшний» день красным кружком.
MCS_WEEKNUMBERS
Отображать номера недель в левой части окна.

Через параметр rect необходимо передать размеры создаваемого окна; параметр pParentWnd должен определять родительское окно и не может быть равен NULL. Наконец, через параметр uID передается идентификатор создаваемого элемента управления.

BOOL Create(
   DWORD fdwStyle,
   const POINT& point,
   CWnd* pParentWnd,
   UINT uID
);

В данном варианте метода параметр point задает координаты левого верхнего угла окна, при этом назначаются стандартные системные ширина и высота.

Оба варианта метода Create возвращают ненулевое значение при успешном создании окна и нулевое — в противном случае.

Атрибуты (attributes)

BOOL GetMinReqRect(
   RECT* prcDest
) const;

Записывает в поля right и bottom структуры, адресуемой параметром prcDest, минимально возможные ширину и высоту окна, в соответствии с текущими системными метриками и используемым шрифтом. Поля left и top получат нулевые значения.

int SetMonthDelta(
   int nNumMonths
);

Метод назначает интервал «прокрутки» календаря в месяцах и возвращает предыдущее значение. Если ранее этот интервал не назначался, возвращается значение 0.

int GetMonthDelta(void) const;

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

BOOL SetFirstDayOfWeek(
   int nDay,
   int* pnPrev = NULL
);

Назначает номер первого дня недели равным nDay и записывает в переменную по адресу pnPrev (если он не равен NULL) предыдущее значение. Понедельнику соответствует значение 0, вторнику — значение 1, etc. Возвращает ненулевое значение, если предыдущий первый день недели не соответствовал стандартным системным установкам.

int GetFirstDayOfWeek(
   BOOL* pfLocal = NULL
) const;

Возвращает номер первого дня недели и записывает в переменную по адресу pfLocal (если он не равен NULL) ненулевое значение, если текущая установка не соответствует стандартной системной.

COLORREF SetColor(
   int nRegion,
   COLORREF crColor
);

Назначает цвет crColor области окна календаря nRegion и возвращает предыдущее значение цвета этой области. Параметр nRegion может принимать одно из следующих значений:

MCSC_BACKGROUND
Фон между месяцами.
MCSC_MONTHBK
Фон дней месяца.
MCSC_TEXT
Текст дней месяца.
MCSC_TRAILINGTEXT
Текст дней, не относящихся к отображаемому месяцу.
MCSC_TITLEBK
Фон заголовка.
MCSC_TITLETEXT
Текст заголовка.
COLORREF GetColor(
   int nRegion
) const;

Возвращает цвет области nRegion окна календаря.

Операции (operations)

void SetToday(
   const CTime* pTimeSrc
);
void SetToday(
   const SYSTEMTIME* pstSrc
);

Назначает «сегодняшний» день.

BOOL GetToday(
   CTime& timeDest
) const;
BOOL GetToday(
   SYSTEMTIME* pstDest
) const;

Записывает в timeDest или по адресу pstDest текущий «сегодняшний» день.

Класс CDateTimeCtrl

Заголовочный файл #include <afxdtctl.h>
Непосредственный предок класс CWnd
Объектная модель DYNAMIC

Ниже перечислены основные методы класса CDateTimeCtrl.

Конструирование (construction)

CDateTimeCtrl(void);
BOOL Create(
   DWORD fdwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT uID
);

В качестве одного из стилей, задаваемых параметром fdwStyle необходимо обязательно указывать WS_CHILD. Кроме этого, обычно используется стиль WS_VISIBLE, а также один или несколько стилей, специфичных для данного элемента управления:

DTS_LONGDATEFORMAT
Отображать дату в «длинном» системном формате.
DTS_SHORTDATEFORMAT
Отображать дату в «коротком» системном формате.
DTS_TIMEFORMAT
Отображать время в системном формате.

Заметим, что эти стили являются взаимоисключающими — при создании элемента управления должен указываться только один из них. Конкретный формат представления даты/времени определяется настройками, сделанными пользователем в Regional Options. Помимо перечисленных, доступны следующие стили:

DTS_UPDOWN
Использовать элемент управления Up-Down для изменения значения даты (при использовании стиля DTS_TIMEFORMAT данный стиль указывать бессмысленно).
DTS_RIGHTALIGN
Выравнивать «выпадающий» календарь по правой границе элемента управления (по умолчанию он выравнивается по левой; (при использовании стиля DTS_TIMEFORMAT данный стиль указывать бессмысленно).
DTS_APPCANPARSE
Пользователю будет предоставлена возможность редактировать текст в элементе управления; при этом родительское окно будет получать соответствующее извещение (DTN_USERSTRING) всякий раз, когда потребуется проверка введенной пользователем строки на корректность.

Через параметр rect необходимо передать размеры создаваемого окна; параметр pParentWnd должен определять родительское окно и не может быть равен NULL. Наконец, через параметр uID передается идентификатор создаваемого элемента управления. При успешном создании окна метод Create возвращает ненулевое значение.

Атрибуты (attributes)

COLORREF SetMonthCalColor(
   int nRegion,
   COLORREF crColor
);

Назначает цвет crColor области nRegion окна «выпадающего» календаря и возвращает предыдущее значение цвета этой области. Возможные значения параметра nRegion приведены в описании метода SetColor класса CMonthCalCtrl.

COLORREF GetMonthCalColor(
   int nRegion
) const;

Возвращает цвет области nRegion окна «выпадающего» календаря.

BOOL SetFormat(
   LPCTSTR pszFormat
);

Позволяет назначить форматирующее выражение, на основании которого составляется строка, отображаемая в элементе управления. В форматирующем выражении pszFormat помимо управляющих последовательностей можно использовать любой текст, однако он должен заключаться в одинарные кавычки (апострофы). Исключение составляют пробелы и знаки пунктуации. Для включения в форматирующее выражение самого символа апострофа, его необходимо написать два раза подряд. Ниже перечислены допустимые управляющие последовательности:

УП результат
d день в виде одной или двух цифр
dd день в виде двух цифр (с возможным ведущим нулем)
ddd трехбуквенное наименование дня недели
dddd полное наименование дня недели
h час от 1 до 12 (одной или двумя цифрами)
hh час от 1 до 12 (всегда двумя цифрами, с возможным ведущим нулем)
H час от 0 до 23 (одной или двумя цифрами)
HH час от 0 до 23 (всегда двумя цифрами, с возможным ведущим нулем)
m минута в виде одной или двух цифр
mm минута в виде двух цифр (с возможным ведущим нулем)
M месяц в виде одной или двух цифр
MM месяц в виде двух цифр (с возможным ведущим нулем)
MMM трехбуквенное наименование месяца
MMMM полное наименование месяца
p односимвольное обозначение «до/после полудня»
tt двухсимвольное обозначение «до/после полудня»
yy год без века
yyyy год полностью

Рассмотрим несколько примеров:

CDateTimeCtrl dtpBirthday;
...
// отображать строку вида '03.02.1972'
dtpBirthday.SetFormat(_T("dd.MM.yyyy"));
...
// отображать строку вида 'birthday date is 3.2.72'
dtpBirthday.SetFormat(_T("\'birthday date is\' d.M.yy"));

При успешном назначении форматирующего выражения метод SetFormat возвращает ненулевое значение.

CMonthCalCtrl* GetMonthCalCtrl(void) const;

Возвращает указатель на объект класса CMonthCalCtrl, соответствующий окну «выпадающего» календаря.

void SetMonthCalFont(
   HFONT hFont,
   BOOL fRedraw = TRUE
);

Назначает «выпадающему» календарю шрифт hFont. Если параметр fRedraw задать равным TRUE, окно календаря будет немедленно перерисовано.

CFont* GetMonthCalFont(void) const;

Возвращает шрифт, используемый окном «выпадающего» календаря. Этот объект может быть временным.

BOOL SetRange(
   const CTime* pMinTime,
   const CTime* pMaxTime
);

Назначает допустимый диапазон даты/времени, которые может задать пользователь и возвращает ненулевое значение при успешном выполнении.

DWORD GetRange(
   CTime* pMinTime,
   CTime* pMaxTime
) const;

Записывает в переменные по адресу pMinTime и pMaxTime текущий допустимый диапазон даты/времени, которые может задать пользователь.

Операции (operations)

BOOL SetTime(
   const CTime* pTimeSrc,
);
BOOL SetTime(
   const SYSTEMTIME* pstSrc,
);

Назначает текущие дату/время для элемента управления и возвращает ненулевое значение при успешном выполнении.

DWORD GetTime(
   CTime& timeDest,
) const;
DWORD SetTime(
   SYSTEMTIME* pstDest,
) const;

Записывает в переменную, на которую ссылается timeDest, или в переменную по адресу pstDest текущие дату/время, заданные пользователем.

обновлено
29.03.2006
 
Проверка PR и ТИЦ