Partager via


Utilisation des champs de rappel dans un contrôle Picker Date aller-retour

En plus de les caractères de format standard qui définissent des champs de sélecteur de date et d'heure, vous pouvez personnaliser votre sortie en spécifiant certaines parties d'une chaîne de format personnalisée en tant que champs de rappel.Pour déclarer un champ de rappel, incluez un ou plusieurs caractères « X » (code ASCII 88) n'importe où dans la chaîne de format.Par exemple, la chaîne suivante « « today is :  » « yy »/« MM/« dd » (jour « X ") » entraîne l'affichage dans le contrôle Date Time Picker la valeur actuelle comme année suivie du mois, date, et enfin l'année.

[!REMARQUE]

Le nombre de x dans un domaine de rappel ne correspond pas au nombre de caractères qui seront affichés.

Vous pouvez distinguer plusieurs champs de rappel dans une chaîne personnalisée de répéter le caractère « X ».Ainsi, la chaîne de format « XXddddMMMdd, 'yyyXXX » contient deux champs uniques de rappel, « XX » et « XXX ».

[!REMARQUE]

Les champs de rappel sont traités en tant que champs valides, votre application doit être préparée traiter les messages de notification de DTN_WMKEYDOWN .

Implémenter les champs de rappel dans votre contrôle Date Time Picker se compose de trois parties :

  • Initialiser la chaîne de format personnalisée

  • Gérer la notification de DTN_FORMATQUERY

  • Gérer la notification de DTN_FORMAT

Initialiser la chaîne de format personnalisée

Initialisez la chaîne personnalisée avec un appel à CDateTimeCtrl::SetFormat.Pour plus d'informations, consultez l' Utilisation de chaînes de format personnalisées dans un contrôle Date Time Picker.Un emplacement commun pour définir la chaîne de format personnalisée se trouve dans la fonction d' OnInitDialog de votre classe de boîte de dialogue ou fonction conteneur d' OnInitialUpdate de votre classe d'affichage conteneur.

Gérer la notification de DTN_FORMATQUERY

Lorsque le contrôle analyse la chaîne de format et rencontre un champ de rappel, l'application des messages envoie de DTN_FORMAT et de DTN_FORMATQUERY notification.La chaîne de rappel de champ est fournie avec les notifications vous pouvez déterminer que le champ de rappel est interrogé.

La notification de DTN_FORMATQUERY est envoyée pour récupérer la taille maximale autorisée en pixels de la chaîne qui sera affichée dans le domaine de rappel actuel.

Pour calculer correctement cette valeur, vous devez calculer la hauteur et la largeur de la chaîne, pour être substitué au champ, à l'aide de la police de l'affichage du contrôle.Le calcul réel de la chaîne est facilement accompli par un appel à la fonction de GetTextExtentPoint32 Win32.Une fois la taille est déterminée, passe la valeur dans l'application et quitte la fonction gestionnaire.

l'exemple suivant est une méthode de fournir la taille de la chaîne de rappel :

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

Une fois la taille du champ de rappel actuel a été calculées, vous devez fournir une valeur pour le champ.Cela s'effectue dans le gestionnaire pour la notification de DTN_FORMAT .

Gérer la notification de DTN_FORMAT

La notification de DTN_FORMAT est utilisée par l'application afin de demander la chaîne de caractères qui est remplacée.L'exemple suivant illustre une méthode possible :

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

[!REMARQUE]

Le pointeur à la structure de NMDATETIMEFORMAT est trouvé en effectuant le premier paramètre du gestionnaire de notification en type approprié.

Voir aussi

Référence

Utilisation CDateTimeCtrl

Concepts

Contrôles (MFC)