Delen via


Callback-velden gebruiken in een datum- en tijdkiezer

Naast de standaardnotatietekens die datum- en tijdkiezervelden definiëren, kunt u de uitvoer aanpassen door bepaalde onderdelen van een tekenreeks voor aangepaste notatie op te geven als callback-velden. Als u een callback-veld wilt declareren, moet u een of meer 'X'-tekens (ASCII-code 88) ergens in de hoofdtekst van de notatietekenreeks opnemen. De volgende tekenreeks 'Vandaag is: 'yy'/'MM'/'dd' (dag 'X')', zorgt ervoor dat de datum- en tijdkiezer de huidige waarde weergeeft als het jaar gevolgd door de maand, datum en ten slotte de dag van het jaar.

Opmerking

Het aantal X's in een callbackveld komt niet overeen met het aantal tekens dat wordt weergegeven.

U kunt onderscheid maken tussen meerdere callback-velden in een aangepaste tekenreeks door het teken X te herhalen. De notatietekenreeks XXdddMMMdd, 'yyXXX' bevat dus twee unieke callbackvelden, 'XX' en 'XXX'.

Opmerking

Callback-velden worden behandeld als geldige velden, dus uw toepassing moet worden voorbereid om DTN_WMKEYDOWN meldingsberichten te verwerken.

Het implementeren van callbackvelden in uw besturingselement voor datum- en tijdkiezer bestaat uit drie onderdelen:

  • Initialisatie van de aangepaste opmaaktekenreeks

  • De melding DTN_FORMATQUERY verwerken

  • De DTN_FORMAT melding verwerken

De aangepaste opmaak tekenreeks initialiseren

Initialiseer de aangepaste tekenreeks met een aanroep naar CDateTimeCtrl::SetFormat. Zie Aangepaste notatietekenreeksen gebruiken in een besturingselement voor datum- en tijdkiezer voor meer informatie. Een veelgebruikte plaats om de tekenreeks voor aangepaste notatie in te stellen, bevindt zich in de functie van de OnInitDialog dialoogvensterklasse of OnInitialUpdate functie van de weergaveklasse die u wilt gebruiken.

De melding DTN_FORMATQUERY verwerken

Wanneer het besturingselement de notatietekenreeks parseert en een callback-veld tegenkomt, verzendt de toepassing DTN_FORMAT en DTN_FORMATQUERY meldingsberichten. De callback-veldtekenreeks is opgenomen in de meldingen, zodat u kunt bepalen welk callback-veld wordt opgevraagd.

De DTN_FORMATQUERY melding wordt verzonden om de maximale toegestane grootte op te halen in pixels van de tekenreeks die wordt weergegeven in het huidige callback-veld.

Als u deze waarde correct wilt berekenen, moet u de hoogte en breedte van de tekenreeks berekenen, om te worden vervangen door het veld, met behulp van het weergavelettertype van het besturingselement. De werkelijke berekening van de tekenreeks wordt eenvoudig bereikt met een aanroep naar de functie GetTextExtentPoint32 Win32 . Zodra de grootte is bepaald, geeft u de waarde weer door aan de toepassing en sluit u de handlerfunctie af.

Het volgende voorbeeld is een methode voor het opgeven van de grootte van de callback-tekenreeks:

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

Zodra de grootte van het huidige callback-veld is berekend, moet u een waarde opgeven voor het veld. Dit wordt gedaan in de handler voor de DTN_FORMAT melding.

De DTN_FORMAT melding verwerken

De DTN_FORMAT melding wordt door de toepassing gebruikt om de tekenreeks aan te vragen die wordt vervangen. In het volgende voorbeeld ziet u één mogelijke methode:

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

Opmerking

De aanwijzer naar de NMDATETIMEFORMAT-structuur wordt gevonden door de eerste parameter van de meldingshandler naar het juiste type te casten.

Zie ook

CDateTimeCtrl gebruiken
Besturingselementen