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


Использование полей обратного вызова элемента выбора даты и времени

В дополнение к символам стандартного формата, поля определяются выбора даты и времени, можно настраивать свой вывод, определив части строки пользовательского формата как поля обратного вызова. Для объявления поля обратного вызова включите один знак «x» (код ASCII 88) в любом месте внутри тела строки формата. Например, следующая строка «today is: » yy «/» MM «/«dd» (день «x»)» в результате элемент управления " выбор даты и времени отображать текущее значение как год за средой месяц, дата и, наконец день года.

Примечание

Номер 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)