Поделиться через


С помощью поля обратного вызова в элементе управления "Выбор даты и времени"

В дополнение к символам стандартного формата, которые определяют поля даты и времени, и можно настраивать свой выход путем указания одной части, как поля пользовательского формата обратного вызова.Для объявления поля обратного вызова, включите один или несколько знаков «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 найден с помощью приведения первый параметр обработчика уведомления к нужному типу.

См. также

Ссылки

Использование CDateTimeCtrl

Основные понятия

Элементы управления (MFC)