共用方式為


在日期時間選擇器控制項中使用回呼欄位

除了定義日期和時間選擇器欄位的標準格式字元以外,您也可以指定自訂字串的某些部分以自訂輸出,做為回呼欄位。 若要宣告回呼欄位,請在格式字串的主體的任何位置包含一個或多個「X」字元 (ASCII 碼 88)。 例如,下列字串「'Today is: 'yy'/'MM'/'dd' (Day 'X')'」讓日期和時間選擇控制項以年、月、日期、年的天數顯示目前的值。

注意事項注意事項

回呼欄位的 X 數值不會對應至要顯示的字元數值。

您可以重複「X」字元,以區別自訂字串的多個回呼欄位。 因此,格式字串「XXddddMMMdd', 'yyyXXX」包含兩個唯一的回呼欄位, 「XX」和「XXX」。

注意事項注意事項

回呼欄位視為有效欄位,因此您的應用程式必須準備處理 DTN_WMKEYDOWN 通知訊息。

實作日期和時間選擇器控制項的回呼欄位,包含三個部分:

  • 初始化自訂格式字串

  • 處理 DTN_FORMATQUERY 通知

  • 處理 DTN_FORMAT 通知

初始化自訂格式字串

呼叫 CDateTimeCtrl::SetFormat 初始化自訂字串。 如需詳細資訊,請參閱 在日期和時間選擇器控制項使用自訂格式字串。 設定自訂格式字串的位置通常是在包含對話方塊類別的 OnInitDialog 函式,或是包含檢視類別的 OnInitialUpdate 函式。

處理 DTN_FORMATQUERY 通知

當控制項剖析格式字串並遇到回呼欄位時,應用程式會傳送 DTN_FORMATDTN_FORMATQUERY 通知訊息。 回呼欄位字串包含通知,讓您可判斷哪一個回呼欄位正在進行查詢。

會傳送 DTN_FORMATQUERY 通知以擷取目前回呼欄位中顯示字串之像素的最大容許大小。

若要適當地計算這個值,您必須使用控制項顯示字型,計算要被替代給欄位的字串之高度和寬度。 字串的實際計算可以呼叫 GetTextExtentPoint32 Win32 函式輕鬆達成。 一旦大小決定後,請將值傳遞至應用程式並結束處理函式。

下列範例是提供回呼字串的大小的一個方法:

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

一旦目前回呼欄位的大小被計算後,您必須為欄位提供值。 這會在 DTN_FORMAT 通知的處理常式進行。

處理 DTN_FORMAT 通知

應用程式使用 DTN_FORMAT 通知來要求會被取代的字串。 下列範例示範可能的一個方法:

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;
}
注意事項注意事項

轉換通知處理常式的第一個參數至適當的型別,可以找到對 NMDATETIMEFORMAT 結構的指標。

請參閱

參考

使用 CDateTimeCtrl

概念

控制項 (MFC)