除了定义日期和时间选择器字段的标准格式字符之外,您还可以通过指定自定义格式字符串的一些部分自定义输出作为回调字段。 声明字段,回调包含一个或多个“X”字符 (ASCII 代码 88) 中的任何地方。格式字符串主体中。 例如,以下字符串““有:“yy”/“MM”/“dd”(日“X”)”“),显示当前日期和时间值的选取器控件作为使用后跟的年份,日期和最后年的日期。
备注
X's 数在回调字段不对应于要显示的字符数。
可以区分自定义字符串的多种回调字段之间通过重复“X”字符。 因此,XXddddMMMdd 格式字符串“,“yyyXXX”包含两个字段,回调“XX”和“”等。
备注
回调字段视为有效的字段,因此,必须准备处理应用程序的 DTN_WMKEYDOWN 通知消息。
实现和日期时间选择器控件的回调字段由三部分组成:
初始化自定义格式字符串
处理 DTN_FORMATQUERY 通知
处理 DTN_FORMAT 通知
初始化自定义格式字符串
初始化用名为的自定义字符串设置为 CDateTimeCtrl::SetFormat。 有关更多信息,请参见 在使用日期和时间选择器控件的自定义格式字符串。 将自定义格式字符串的一种常用排列中的视图类包含的对话框类或 OnInitialUpdate 函数的 OnInitDialog 函数。
处理 DTN_FORMATQUERY 通知
当分析控件格式字符串,回调遇到字段时应用程序发送 DTN_FORMAT 和 DTN_FORMATQUERY 则通知消息。 回调字段字符串包含通知,以便可以确定字段回调查询。
DTN_FORMATQUERY 通知发送回调检索在当前字段将显示字符串的像素的最大允许大小。
To properly calculate this value, you must calculate the height and width of the string, to be substituted for the field, using the control's display font. 字符串的实际计算方便地实现与 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 通知请求被替换的字符串。 下面的示例对y一种可能方法进行了演示。
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 结构的指针转换通过通知处理程序的第一个参数。查找相应的类型。