用于日期和时间选择器控件的回调字段
除了定义日期和时间选择器字段的标准格式字符之外,还可以通过指定自定义格式字符串的某些部分自定义您的输出作为回调字段。若要声明回调字段中,包括一个或多个 “X”字符 (ASCII 代码 88) 中的任意位置格式字符串的主体。例如,下面的字符串 ““today is:“yy'/“MM'/“dd (日 " X ") “导致日期和时间选择器控件显示当前值作为月、日期和最后中的日执行的年份。
说明 |
---|
X's 数在回调字段的不对应于要显示的字符数。 |
可以区分在一个自定义字符串中的多个回调域之间循环访问 “X”字符。因此,格式字符串 “XXddddMMMdd, “yyyXXX”包含两个回调字段, “XX”和 “XXX”。
说明 |
---|
回调字段视为有效的字段,因此,必须准备应用程序处理 DTN_WMKEYDOWN 通知消息。 |
实现回调中的字段日期和时间选择器控件由三部分组成:
初始化自定义格式字符串
处理 DTN_FORMATQUERY 通知
处理 DTN_FORMAT 通知
初始化自定义格式字符串
初始化具有名为的自定义字符串传递 CDateTimeCtrl::SetFormat。有关更多信息,请参见 用于日期和时间选择器控件的自定义格式字符串。设置自定义格式字符串中的一个常见排列控件中所包含的视图类包含的对话框类或 OnInitialUpdate 功能的 OnInitDialog 功能。
处理 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;
}
说明 |
---|
转换通知处理程序的第一个参数发现 bug NMDATETIMEFORMAT 结构的指针适当类型的。 |