Partager via


Utilisation des champs de rappel dans un contrôle de sélecteur de date et heure

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, nous sommes le : "aa"/"MM"/"jj" (jour "X") '"fait que le contrôle de date et d'heure affiche la valeur actuelle comme année suivie du mois, de la date, et enfin du jour.

Remarque

Le nombre "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 de rappel uniques, "XX" et "XXX".

Remarque

Les champs de rappel sont traités comme des champs valides. Votre application doit donc être prête à gérer les messages de notification DTN_WMKEYDOWN.

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

  • Initialisation de la chaîne de format personnalisée

  • Gestion de la notification DTN_FORMATQUERY

  • Gestion de la notification DTN_FORMAT

Initialisation de la chaîne de format personnalisée

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

Gestion de la notification DTN_FORMATQUERY

Lorsque le contrôle analyse la chaîne de format et rencontre un champ de rappel, l’application envoie DTN_FORMAT et DTN_FORMATQUERY messages de notification. La chaîne de rappel du champ est incluse avec les notifications pour vous permettre de déterminer quel 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 s’affiche 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 obtenu avec un appel à la fonction GetTextExtentPoint32 Win32. Une fois la taille déterminée, passez la valeur vers l'application et terminez 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 est effectuée dans le gestionnaire pour la notification DTN_FORMAT.

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

Remarque

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

Voir aussi

Utilisation de CDateTimeCtrl
Contrôles