Verwenden der Rückruf-Felder in einem Steuerelement für die Datums- und Zeitauswahl

Neben den Standardformat Zeichen, die Datums- Zeitauswahl-Felder definieren, können Sie die Ausgabe anpassen, indem Sie bestimmte Teile einer benutzerdefinierten Formatzeichenfolge als Rückruf Feldern angeben.Um ein Feld für den Rückruf zu deklarieren, fügen Sie eine oder mehrere Zeichen ("X" ASCII-Code 88) eine beliebige Stelle im Text der Formatzeichenfolge ein.Beispielsweise ist die folgende Zeichenfolge ""heute: "yy"/"MM"/"dd" Tag "X " ("") führt das Steuerelement für die Datums- und Zeitauswahl, den aktuellen Wert als Jahr anzuzeigen, die dem Monat, dem Datum und schließlich Tag des Jahres folgt.

HinweisHinweis

Die Anzahl von X in einem Rückruf nicht im Feld entspricht der Anzahl der Zeichen, die angezeigt werden.

Sie können zwischen mehreren Feldern Rückruf in einer benutzerdefinierten Zeichenfolge unterscheiden, indem Sie das Zeichen "X".Daher enthält die Formatzeichenfolge "XXddddMMMdd, 'yyyXXX" zwei eindeutige Rückruf Feldern, "XX" und "XXX."

HinweisHinweis

Felder werden als gültige Felder Rückruf verarbeitet. Daher muss die Anwendung darauf vorbereitet sein, DTN_WMKEYDOWN Benachrichtigungsmeldungen zu bearbeiten.

Das Implementieren von Rückruf Felder im Steuerelement für die Datums- und Zeitauswahl besteht aus drei Teilen:

  • Die benutzerdefinierte Formatzeichenfolge initialisieren

  • Die DTN_FORMATQUERY Benachrichtigungen verwalten

  • Die DTN_FORMAT Benachrichtigungen verwalten

Die benutzerdefinierte Formatzeichenfolge initialisieren

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 Stelle, um eine benutzerdefinierte Formatzeichenfolge OnInitDialog Festlegen der enthaltenden Funktion in der Dialogfeldklasse oder OnInitialUpdate-Funktion der enthaltenden Ansichtsklasse.

Die Behandlung DTN_FORMATQUERY-Benachrichtigung

Wenn das Steuerelement analysiert und in der Formatzeichenfolge Feld ein Rückruf auftritt, sendet die Anwendung DTN_FORMAT und DTN_FORMATQUERY Benachrichtigungsmeldungen.Die Zeichenfolge wird im Feld Rückruf mit Benachrichtigungen enthalten, daher können Sie ermitteln, welche Feld Rückruf abgefragt wird.

Die DTN_FORMATQUERY Benachrichtigung gesendet wird, um die maximal zulässige Größe in Pixel der Zeichenfolge abzurufen, die für das aktuelle Feld Rückruf angezeigt wird.

Um diesen Wert richtig zu berechnen, müssen Sie die Höhe und die Breite der Zeichenfolge berechnen, für das Feld unter Verwendung der Anzeige des Steuerelements Schriftarten ersetzt werden müssen.Die eigentliche Berechnung der Zeichenfolge ist leicht mit einem Aufruf der Funktion GetTextExtentPoint32 Win32 erreicht.Sobald die Größe bestimmt wird, übergeben Sie den Wert wieder der Anwendung und beenden Sie die Handlerfunktion.

Im folgenden Beispiel ist eine Möglichkeit, die 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;
}

Nachdem die Größe des aktuellen Felds Rückruf, müssen Sie einen Wert für das Feld stellen berechnet wurde.Dies ist im Handler für die DTN_FORMAT Benachrichtigung ausgegeben werden.

Die Behandlung DTN_FORMAT-Benachrichtigung

Die DTN_FORMAT Benachrichtigung wird von der Anwendung verwendet, um die Zeichenfolge anzufordern, die ersetzt wird.Im folgenden Beispiel wird 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;
}
HinweisHinweis

Der Zeiger auf die NMDATETIMEFORMAT -Struktur gefunden wird, indem Sie den ersten Parameter des handlers Benachrichtigung in den richtigen Typ umwandeln.

Siehe auch

Referenz

Verwenden von CDateTimeCtrl

Konzepte

Steuerelemente (MFC)