Udostępnij przez


Jak przetworzyć powiadomienie DTN_FORMAT

W tym temacie przedstawiono sposób przetwarzania powiadomienia o formacie wysyłanego przez kontrolkę selektora daty i godziny (DTP).

Co musisz wiedzieć

Technologii

Warunki wstępne

  • C/C++
  • Programowanie interfejsu użytkownika systemu Windows

Instrukcje

Kontrolka DTP wysyła powiadomienie DTN_FORMAT, aby zażądać tekstu, który ma być wyświetlany w polu zwrotnym kontrolki. Aplikacja musi obsługiwać to powiadomienie, aby umożliwić kontrolce DTP wyświetlanie informacji, które nie są obsługiwane natywnie.

Poniższy przykład kodu C++ to funkcja zdefiniowana przez aplikację (DoFormat), która przetwarza kody powiadomień DTN_FORMAT, dostarczając ciąg tekstowy dla pola wywołania zwrotnego. Aplikacja wywołuje zdefiniowaną przez nią funkcję GetDayNum, aby zażądać numeru dnia, który ma być użyty w ciągu wywołania zwrotnego.

//  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.
 }
}

funkcja zdefiniowana przez aplikację GetDayNum

Przykładowa funkcja zdefiniowana przez aplikację DoFormat wywołuje następującą funkcję GetDayNum zdefiniowaną przez aplikację, aby zażądać numeru dnia na podstawie bieżącej daty. GetDayNum zwraca wartość INT reprezentującą bieżący dzień roku z zakresu od 0 do 366. Ta funkcja wywołuje inną funkcję zdefiniowaną przez aplikację, IsLeapYr, podczas przetwarzania.

//  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);
}        

Funkcja zdefiniowana przez aplikację IsLeapYr

Funkcja zdefiniowana przez aplikację GetDayNum wywołuje funkcję IsLeapYr, aby określić, czy bieżący rok jest rokiem przestępnym. IsLeapYr zwraca wartość BOOL, która jest TRUE, jeśli jest to rok przestępny, a FALSE w przeciwnym razie.

//  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);
}        

Używanie Kontrolek Selekcji Daty i Godziny

Dokumentacja Kontrolki Wybierania Daty i Czasu

selektor daty i godziny