除了定義日期和時間選擇器欄位的標準格式字元之外,您還可以將自訂格式字串的某些部分指定為回呼字段,以自定義輸出。 若要宣告回呼欄位,請在格式字串中的任意位置加入一個或多個「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_FORMAT和DTN_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結構的指標。