次の方法で共有


DTN_FORMAT 通知の処理方法

このトピックでは、日付と時刻の選択 (DTP) コントロールによって送信される書式通知を処理する方法について説明します。

知っておくべきこと

テクノロジ

前提条件

  • C/C++
  • Windows ユーザー インターフェイス プログラミング

手順

DTP コントロールは、DTN_FORMAT 通知を送信して、コントロールの [コールバック] フィールドに表示されるテキストを要求します。 DTP コントロールがネイティブでサポートしていない情報を表示できるようにするには、アプリケーションでこの通知を処理する必要があります。

次の C++ コード例は、[コールバック] フィールドのテキスト文字列を指定して通知コード DTN_FORMAT 処理するアプリケーション定義関数 (DoFormat) です。 アプリケーションは GetDayNum アプリケーション定義関数を呼び出して、コールバック文字列で使用する日番号を要求します。

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

GetDayNum アプリケーション定義関数

アプリケーション定義のサンプル関数 DoFormat は、次の GetDayNum アプリケーション定義関数を呼び出して、現在の日付に基づいて日番号を要求します。 GetDayNum は、0 から 366 までの年の現在の日を表す INT 値を返します。 この関数は、処理中に別のアプリケーション定義関数 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);
}        

IsLeapYr アプリケーション定義関数

アプリケーション定義関数 GetDayNumIsLeapYr 関数を呼び出して、現在の年がうるう年かどうかを判断します。 IsLeapYr は、うるう年の場合は TRUEBOOL 値を返し、それ以外の場合は 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);
}        

日付と時刻の選択コントロールの使用

日付と時刻の選択コントロール リファレンス

日付と時刻の選択