Partager via


À l'aide de les champs de rappel dans un contrôle Date Time Picker

Outre les caractères de format standard qui définissent les champs de sélecteur de date et d'heure, vous pouvez personnaliser la sortie en spécifiant certaines parties d'une chaîne de format personnalisée comme champs de rappel. Pour déclarer un champ de rappel, incluez un ou plusieurs caractères « X » (code ASCII 88) n'importe où dans le corps de la chaîne de format. Par exemple, la chaîne suivante "'Aujourd'hui, c'est : 'yy'/'MM'/'dd' (jour 'X') '" fait que le contrôle de date et heure affiche la valeur actuelle comme année suivie du mois, de la date, et enfin le jour.

Notes

Le nombre de X dans un champ de rappel ne correspond pas au nombre de caractères affichés.

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

Notes

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

Implémenter les champs de rappel du contrôle Date Time Picker se fait en trois parties :

  • Initialiser la chaîne de format personnalisée

  • Gérer la notification DTN_FORMATQUERY

  • Gérer la notification DTN_FORMAT

Initialiser la chaîne de format personnalisé

Initialisez la chaîne personnalisée par un appel à CDateTimeCtrl::SetFormat. Pour plus d'informations, consultez Utilisation des chaînes de format personnalisé dans un contrôle de date et d'heure. Un emplacement commun pour définir la chaîne de format personnalisé dans la fonction OnInitDialog de la classe de la classe de dialogue contenante ou dans la fonction OnInitialUpdate de la classe d'affichage contenante.

Gérer la notification DTN_FORMATQUERY

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

La notification 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 champ de rappel actuel.

Pour calculer correctement cette valeur, vous devez calculer la hauteur et la largeur de la chaîne, à remplacer pour le champ, en utilisant la police d'affichage du contrôle. Le calcul réel de la chaîne est facilement effectué par un appel à la fonction Win32 GetTextExtentPoint32. Une fois la taille déterminée, passe la valeur vers l'application et termine la fonction gestionnaire.

L'exemple suivant est une méthode pour 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 calculée, vous devez fournir une valeur pour le champ. Cette opération s'effectue dans le gestionnaire de la notification DTN_FORMAT .

Gérer la notification DTN_FORMAT

La notification DTN_FORMAT est utilisée par l'application pour demander la chaîne de caractères qui sera remplacée. L'exemple de code 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;
}

Notes

Le pointeur vers la structure NMDATETIMEFORMAT se trouve en convertissant le premier paramètre du gestionnaire de notification en type approprié.

Voir aussi

Référence

À l'aide de CDateTimeCtrl

Concepts

contrôles (MFC)