Verwenden von Rückruffeldern in einem Steuerelement für die Datums- und Zeitauswahl
Zusätzlich zu den Standardformatzeichen, die Datums- Zeitauswahl-Felder definieren, können Sie die Ausgabe anpassen, indem Sie bestimmte Teile einer benutzerdefinierten Formatzeichenfolge als Rückruffelder angeben. Um ein Rückruffeld zu deklarieren, eine oder mehrere "X Zeichen (ASCII codiert 88) überall im Text der Formatzeichenfolge ein. Beispielsweise wurde die folgende Zeichenfolge ""Today is: "yy "/"MM "/"dd" (Tag "X ")" wird das Steuerelement für die Datums- und Zeitauswahl, den aktuellen Wert als das Jahr anzuzeigen, das nach den Monat folgt, wurde und schließlich der Tag des Jahrs.
Hinweis
Die Zahl von X auf einem Rückrufgebiet entspricht nicht zur Anzahl von Zeichen, die angezeigt werden.
Sie können zwischen mehreren Rückruffeldern in einer benutzerdefinierten Zeichenfolge unterscheiden, indem Sie das "X Zeichen überprüfen. Daher enthält die Formatzeichenfolge "XXddddMMMdd, 'yyyXXX" zwei eindeutige Rückruffelder, "XX" und "USW.".
Hinweis
Rückruffelder werden als gültige Felder behandelt, daher muss die Anwendung darauf vorbereitet sein, DTN_WMKEYDOWN Benachrichtigungen bearbeiten.
Das Implementieren von Rückruffeldern im Steuerelement für die Datums- und Zeitauswahl besteht aus drei Teilen:
Initialisieren der benutzerdefinierten Formatzeichenfolge
Behandeln der DTN_FORMATQUERY Benachrichtigung
Behandeln der DTN_FORMAT Benachrichtigung
Initialisieren der benutzerdefinierten Formatzeichenfolge
Initialisieren Sie die benutzerdefinierte Zeichenfolge mit einem Aufruf von CDateTimeCtrl::SetFormat. Weitere Informationen finden Sie unter Verwenden von benutzerdefinierten Formatzeichenfolgen in einem Steuerelement für die Datums- und Zeitauswahl. Ein allgemeiner Position, an der benutzerdefinierten Formatzeichenfolge festzulegen ist in der OnInitDialog der enthaltenden Funktion Dialogfeldklasse OnInitialUpdate oder Funktion der enthaltenden Ansichtsklasse.
Behandeln der DTN_FORMATQUERY-Benachrichtigung
Wenn das Steuerelement die Formatzeichenfolge analysiert und ein Rückruffeld trifft, sendet die Anwendung DTN_FORMAT und DTN_FORMATQUERY Benachrichtigungsmeldungen. Die Rückruffeldzeichenfolge ist den Benachrichtigungen enthalten, sodass Sie ermitteln, das Rückruffeld abgefragt wird.
DTN_FORMATQUERY Die Benachrichtigung wird gesendet, dass die maximal zulässige Größe in Pixel der Zeichenfolge abzurufen, die im aktuellen Rückrufgebiet angezeigt wird.
Um diesen Wert ordnungsgemäß zu berechnen, müssen Sie die Höhe und Breite der Zeichenfolge werden, für das Feld, mit der Anzeigenschriftart des Steuerelements ersetzt werden. Die tatsächliche Berechnung der Zeichenfolge wird leicht mit einem Aufruf der GetTextExtentPoint32-Funktion von Win32 erreicht. Sobald die Größe bestimmt, den Wert in der Anwendung besteht und beendet die Handlerfunktion.
Im folgenden Beispiel ist eine Angabe der Größe der Rückrufzeichenfolge:
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;
}
Sobald sich die Größe des aktuellen Rückruffelds, müssen Sie einen Wert für das Feld angeben berechnet wurden. Dies wird im Handler für die DTN_FORMAT - Benachrichtigung erfolgt.
Behandeln der DTN_FORMAT-Benachrichtigung
DTN_FORMAT Die Benachrichtigung wird von der Anwendung, um die Zeichenfolge zu erfragen verwendet, die ersetzt wird. Das folgende Beispiel veranschaulicht eine mögliche 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;
}
Hinweis
Der Zeiger auf die NMDATETIMEFORMAT -Struktur wird gefunden, indem Sie den ersten Parameter des Benachrichtigungshandlers den richtigen Typ umwandeln.