Comment traiter la notification DTN_FORMAT
Cette rubrique montre comment traiter une notification de format envoyée par le contrôle du sélecteur de date et d’heure (DTP).
Bon à savoir
Technologies
Prérequis
- C/C++
- Programmation de l’interface utilisateur Windows
Instructions
Un contrôle DTP envoie la notification DTN_FORMAT pour demander du texte qui sera affiché dans un champ de rappel du contrôle. Votre application doit gérer cette notification pour permettre au contrôle DTP d’afficher des informations qu’il ne prend pas en charge en mode natif.
L’exemple de code C++ suivant est une fonction définie par l’application (DoFormat) qui traite DTN_FORMAT codes de notification en fournissant une chaîne de texte pour un champ de rappel. L’application appelle la fonction GetDayNum définie par l’application pour demander le numéro de jour à utiliser dans la chaîne de rappel.
// DoFormat processes DTN_FORMAT to provide the text for a callback
// field in a DTP control. In this example, the callback field
// contains a value for the day of year. The function calls the
// application-defined function GetDayNum (below) to retrieve
// the correct value. StringCchPrintf truncates the formatted string if
// the entire string will not fit into the destination buffer.
void WINAPI DoFormat(HWND hwndDP, LPNMDATETIMEFORMAT lpDTFormat)
{
HRESULT hr = StringCchPrintf(lpDTFormat->szDisplay,
sizeof(lpDTFormat->szDisplay)/sizeof(lpDTFormat->szDisplay[0]),
L"%d",GetDayNum(&lpDTFormat->st));
if(SUCCEEDED(hr))
{
// Insert code here to handle the case when the function succeeds.
}
else
{
// Insert code here to handle the case when the function fails or the string
// is truncated.
}
}
Fonction getDayNum définie par l’application
L’exemple de fonction défini par l’application DoFormat appelle la fonction getDayNum définie par l’application suivante pour demander le numéro de jour en fonction de la date du jour. GetDayNum renvoie une valeur INT qui représente le jour actuel de l’année, de 0 à 366. Cette fonction appelle une autre fonction définie par l’application, IsLeapYr, pendant le traitement.
// GetDayNum is an application-defined function that retrieves the
// correct day of year value based on the contents of a given
// SYSTEMTIME structure. This function calls the IsLeapYr function to
// check if the current year is a leap year. The function returns an
// integer value that represents the day of year.
int WINAPI GetDayNum(SYSTEMTIME *st)
{
int iNormYearAccum[ ] = {31,59,90,120,151,181,
212,243,273,304,334,365};
int iLeapYearAccum[ ] = {31,60,91,121,152,182,
213,244,274,305,335,366};
int iDayNum;
if(IsLeapYr(st->wYear))
iDayNum=iLeapYearAccum[st->wMonth-2]+st->wDay;
else
iDayNum=iNormYearAccum[st->wMonth-2]+st->wDay;
return (iDayNum);
}
Fonction isLeapYr définie par l’application
La fonction définie par l’application GetDayNum appelle la fonction IsLeapYr pour déterminer si l’année en cours est une année bissextile. IsLeapYr retourne une valeur BOOL qui est TRUE s’il s’agit d’une année bissextile et FALSE dans le cas contraire.
// IsLeapYr determines if a given year value is a leap year. The
// function returns TRUE if the current year is a leap year, and
// FALSE otherwise.
BOOL WINAPI IsLeapYr(int iYear)
{
BOOL fLeapYr = FALSE;
// If the year is evenly divisible by 4 and not by 100, but is
// divisible by 400, it is a leap year.
if ((!(iYear % 4)) // each even fourth year
&& ((iYear % 100) // not each even 100 year
|| (!(iYear % 400)))) // but each even 400 year
fLeapYr = TRUE;
return (fLeapYr);
}
Rubriques connexes