Verarbeiten der DTN_FORMAT Benachrichtigung
In diesem Thema wird veranschaulicht, wie Sie eine Formatbenachrichtigung verarbeiten, die vom DTP-Steuerelement (Datums- und Uhrzeitauswahl) gesendet wird.
Wichtige Informationen
Technologien
Voraussetzungen
- C/C++
- Programmierung der Windows-Benutzeroberfläche
Anweisungen
Ein DTP-Steuerelement sendet die DTN_FORMAT Benachrichtigung, um Text anzufordern, der in einem Rückruffeld des Steuerelements angezeigt wird. Ihre Anwendung muss diese Benachrichtigung verarbeiten, damit das DTP-Steuerelement Informationen anzeigen kann, die es nicht nativ unterstützt.
Das folgende C++-Codebeispiel ist eine anwendungsdefinierte Funktion (DoFormat), die DTN_FORMAT Benachrichtigungscodes verarbeitet, indem eine Textzeichenfolge für ein Rückruffeld bereitgestellt wird. Die Anwendung ruft die anwendungsdefinierte GetDayNum-Funktion auf, um die in der Rückrufzeichenfolge zu verwendende Tagnummer anzufordern.
// 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.
}
}
Die anwendungsdefinierte GetDayNum-Funktion
Die anwendungsdefinierte Beispielfunktion DoFormat ruft die folgende anwendungsdefinierte GetDayNum-Funktion auf, um die Tagnummer basierend auf dem aktuellen Datum anzufordern. GetDayNum gibt einen INT-Wert zurück, der den aktuellen Tag des Jahres von 0 bis 366 darstellt. Diese Funktion ruft während der Verarbeitung eine andere anwendungsdefinierte Funktion auf, IsLeapYr.
// 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);
}
Die anwendungsdefinierte IsLeapYr-Funktion
Die anwendungsdefinierte Funktion GetDayNum ruft die IsLeapYr-Funktion auf, um zu bestimmen, ob das aktuelle Jahr ein Schaltjahr ist. IsLeapYr gibt einen BOOL-Wert zurück, der TRUE ist, wenn es sich um ein Schaltjahr handelt, andernfalls FALSE .
// 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);
}
Zugehörige Themen