Udostępnij za pośrednictwem


Używanie pól wywołania zwrotnego w formancie selektora dat i godzin

Oprócz standardowych znaków formatu definiujących pola selektora daty i godziny można dostosować dane wyjściowe, określając niektóre części niestandardowego ciągu formatu jako pola wywołania zwrotnego. Aby zadeklarować pole wywołania zwrotnego, uwzględnij co najmniej jeden znak "X" (kod ASCII 88) w dowolnym miejscu w treści ciągu formatu. Na przykład następujący ciąg "'Today is: 'yy'/'MM'/'dd" (Day 'X')'" powoduje, że kontrolka selektora daty i godziny wyświetla bieżącą wartość jako rok, po którym następuje miesiąc, data i koniec dzień roku.

Uwaga

Liczba znaków X w polu wywołania zwrotnego nie odpowiada liczbie wyświetlanych znaków.

Można odróżnić wiele pól wywołania zwrotnego w ciągu niestandardowym, powtarzając znak "X". W związku z tym ciąg formatu "XXddddMMMddd", "yyyXXX" zawiera dwa unikatowe pola wywołania zwrotnego, "XX" i "XXX".

Uwaga

Pola wywołania zwrotnego są traktowane jako prawidłowe pola, dlatego aplikacja musi być przygotowana do obsługi DTN_WMKEYDOWN komunikatów powiadomień.

Implementowanie pól wywołania zwrotnego w kontrolce selektora daty i godziny składa się z trzech części:

  • Inicjowanie niestandardowego ciągu formatu

  • Obsługa powiadomienia DTN_FORMATQUERY

  • Obsługa powiadomienia DTN_FORMAT

Inicjowanie ciągu formatu niestandardowego

Zainicjuj ciąg niestandardowy za pomocą wywołania metody CDateTimeCtrl::SetFormat. Aby uzyskać więcej informacji, zobacz Using Custom Format Strings in a Date and Time Picker Control (Używanie ciągów formatu niestandardowego w kontrolce selektora daty i godziny). Typowym miejscem ustawiania niestandardowego ciągu formatu jest OnInitDialog funkcja zawierającej klasę okna dialogowego lub OnInitialUpdate funkcję zawierającej klasę widoku.

Obsługa powiadomienia DTN_FORMATQUERY

Gdy kontrolka analizuje ciąg formatu i napotyka pole wywołania zwrotnego, aplikacja wysyła DTN_FORMAT i DTN_FORMATQUERY komunikatów powiadomień. Ciąg pola wywołania zwrotnego jest dołączany do powiadomień, dzięki czemu można określić, które pole wywołania zwrotnego jest wykonywane.

Powiadomienie DTN_FORMATQUERY jest wysyłane w celu pobrania maksymalnego dozwolonego rozmiaru w pikselach ciągu, który będzie wyświetlany w bieżącym polu wywołania zwrotnego.

Aby prawidłowo obliczyć tę wartość, należy obliczyć wysokość i szerokość ciągu, aby zastąpić pole czcionką wyświetlaną kontrolki. Rzeczywiste obliczenie ciągu można łatwo osiągnąć za pomocą wywołania funkcji GetTextExtentPoint32 Win32 . Po określeniu rozmiaru przekaż wartość z powrotem do aplikacji i zamknij funkcję obsługi.

Poniższy przykład to jedna z metod podawania rozmiaru ciągu wywołania zwrotnego:

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;
}

Po obliczeniu rozmiaru bieżącego pola wywołania zwrotnego należy podać wartość pola. Odbywa się to w procedurze obsługi powiadomienia DTN_FORMAT.

Obsługa powiadomienia DTN_FORMAT

Powiadomienie DTN_FORMAT jest używane przez aplikację do żądania ciągu znaków, który zostanie zastąpiony. W poniższym przykładzie pokazano jedną z możliwych metod:

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;
}

Uwaga

Wskaźnik do struktury NMDATETIMEFORMAT znajduje się przez rzutowanie pierwszego parametru programu obsługi powiadomień do odpowiedniego typu.

Zobacz też

Korzystanie z CDateTimeCtrl
Kontrolki