С помощью поля обратного вызова в элементе управления "Выбор даты и времени"
В дополнение к символам стандартного формата, которые определяют поля даты и времени, и можно настраивать свой выход путем указания одной части, как поля пользовательского формата обратного вызова.Для объявления поля обратного вызова, включите один или несколько знаков «x» (код 88 ASCII) в любом месте в теле strings.Например, следующая строка ««Сегодня: »/«MM «yy»/«dd» (день «x»)» «приводит к тому, что элемент управления " выбор даты и времени, чтобы отобразить текущее значение как год за которым следуют месяц, дату, и наконец день года.
Примечание |
---|
Число х в поле обратного вызова не соответствует количеству символов, которые будут отображаться. |
Можно различать нескольким полям обратного вызова в пользовательской строке с повторными знак «x».Таким образом, строка формата «XXddddMMMdd, 'yyyXXX» содержит 2 уникальных поля обратного вызова, «XX» и «XXX».
Примечание |
---|
Поля обратного вызова, считаются допустимыми полями, поэтому необходимо подготовить приложение для обработки сообщений уведомлений DTN_WMKEYDOWN . |
Реализация поля обратного вызова в данном элементе управления " выбор даты и времени состоит из 3 частей:
Инициализировать пользовательский формат
Обработка уведомления DTN_FORMATQUERY
Обработка уведомления DTN_FORMAT
Инициализировать пользовательский формат
Инициализация пользовательская строка с вызовом CDateTimeCtrl::SetFormat.Дополнительные сведения см. в разделе Использование пользовательские форматы даты и времени в элементе управления " выбор.Общий макет, чтобы задать пользовательский формат в функции OnInitDialog ваших содержащего класса или функции диалогового окна OnInitialUpdate для содержащего класса представления.
Обработка уведомления DTN_FORMATQUERY
Если элемент управления анализирует строку форматирования и обнаруживает поле обратного вызова, приложение отправляет сообщения уведомлений DTN_FORMAT и DTN_FORMATQUERY.Строка, представляющая поля обратного вызова включена с уведомлениями поэтому можно определить, какое поле запрашивается обратного вызова.
Уведомление отправляется DTN_FORMATQUERY чтобы получить максимально допустимый размер в пикселях) строки, которая будет отображаться в текущем поле обратного вызова.
Для правильного вычисления это значение необходимо рассчитать высоту и ширину строки быть замещенным для поля, используя плакатный шрифт элемента управления.Реальное вычисление строки легко достиганной с вызовом функции GetTextExtentPoint32 Win32.Как только размер определяется, передайте значения обратно к приложению и оставьте функция обработчика.
В следующем примере один метод, указав размер строки обратного вызова:
void CMyDialog::OnDtnFormatqueryDatetimepicker1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMDATETIMEFORMATQUERY pDTFormatQuery =
reinterpret_cast<LPNMDATETIMEFORMATQUERY>(pNMHDR);
CDC* pDC = NULL;
CFont* pFont = NULL;
CFont* pOrigFont = NULL;
// Prepare the device context for the GetTextExtentPoint32 call.
pDC = GetDC();
if (NULL == pDC)
{
return;
}
pFont = GetFont();
if(NULL == pFont)
{
pFont = new CFont();
VERIFY(pFont->CreateStockObject(DEFAULT_GUI_FONT));
}
pOrigFont = pDC->SelectObject(pFont);
// Check to see if this is the callback segment desired. If so,
// use the longest text segment to determine the maximum
// width of the callback field, and then place the information into
// the NMDATETIMEFORMATQUERY structure.
if(!_tcscmp(_T("X"), pDTFormatQuery->pszFormat))
{
::GetTextExtentPoint32(pDC->m_hDC, _T("366"), 3, &pDTFormatQuery->szMax);
}
// Reset the font in the device context then release the context.
pDC->SelectObject(pOrigFont);
ReleaseDC(pDC);
*pResult = 0;
}
Один раз размер текущего поля обратного вызова, вычисляется, необходимо указать значение для поля.Это делается в обработчике для уведомления DTN_FORMAT .
Обработка уведомления DTN_FORMAT
Уведомление DTN_FORMAT используется приложением для запроса символьную строку, которая будет заменена.В следующем примере показан один из возможных метод:
void CMyDialog::OnDtnFormatDatetimepicker1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMDATETIMEFORMAT pDTFormat = reinterpret_cast<LPNMDATETIMEFORMAT>(pNMHDR);
COleDateTime oCurTime;
m_DateTimeCtrl.GetTime(oCurTime);
_itot_s(oCurTime.GetDayOfYear(), pDTFormat->szDisplay,
sizeof(pDTFormat->szDisplay) / sizeof(TCHAR), 10);
*pResult = 0;
}
Примечание |
---|
Указатель на структуру NMDATETIMEFORMAT найден с помощью приведения первый параметр обработчика уведомления к нужному типу. |