À 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é.