共用方式為


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

除了定義日期和時間選擇器欄位的標準格式字元,您可以自訂您的輸出,藉由指定為回呼欄位的自訂格式字串的特定部份。 若要宣告回呼欄位,包含一或多個 「 X 」 字元 (ASCII 碼 88) 任何一處本文的格式字串。 比方說,下列字串"' 目前是: 'yy '/' MM '/' dd' (天 '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)