Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.