Usando campos de retorno de chamada em um controle de seletor de data e hora
Além dos caracteres de formato padrão que definem campos de seletor de data e hora, você pode personalizar sua saída especificando algumas partes de uma cadeia de caracteres de formato personalizada como campos de retorno de chamada. Para declarar um campo de retorno de chamada, contém um ou mais caracteres de “X” (88) código ASCII em qualquer lugar no corpo da cadeia de caracteres de formato. Por exemplo, a seguinte cadeia de caracteres “é “hoje: ” “aa/” mm “/“dd” (dia “X ")” “faz com que o controle de seletor de data e hora exibe o valor atual como o ano seguido por mês, a data e, finalmente o dia do ano.
Dica
O número de x em um campo de retorno de chamada não corresponde ao número de caracteres que serão exibidos.
Você pode distinguir entre vários campos de retorno de chamada em uma cadeia de caracteres personalizado repetindo o caractere “X”. Assim, a cadeia de caracteres de formato “XXddddMMMdd, 'yyyXXX” contém dois campos exclusivos de retorno de chamada, “XX” e “XXX”.
Dica
Os campos de retorno de chamada são tratados como campos válidos, de modo que o aplicativo deve estar preparado para tratar notificações de DTN_WMKEYDOWN .
Implementar campos de retorno de chamada no controle de seletor de data e hora consiste em três partes:
Inicializando a cadeia de caracteres de formato personalizada
Tratando a notificação de DTN_FORMATQUERY
Tratando a notificação de DTN_FORMAT
Inicializando a cadeia de caracteres de formato personalizada
Inicializar a cadeia de caracteres personalizado com uma chamada a CDateTimeCtrl::SetFormat. Para obter mais informações, consulte Usando cadeias de caracteres de formato personalizadas em um controle de seletor de data e hora. Um local comum para definir a cadeia de caracteres de formato personalizada está na função de OnInitDialog da sua classe da caixa de diálogo ou função contentora de OnInitialUpdate da sua classe de que contém a exibição.
Tratando a notificação de DTN_FORMATQUERY
Quando o controle analisa a cadeia de caracteres de formato e localize um campo de retorno de chamada, o aplicativo envia notificações de DTN_FORMAT e de DTN_FORMATQUERY . A cadeia de caracteres de campo de retorno de chamada é incluída com as notificações para que você possa determinar qual campo de retorno de chamada está sendo consultado.
A notificação de DTN_FORMATQUERY é enviada para recuperar o tamanho máximo permitido em pixels de cadeia de caracteres que será exibida no campo atual de retorno de chamada.
Para calcular corretamente esse valor, você deve calcular a altura e a largura da cadeia de caracteres, a ser substituído para o campo, usando a fonte da exibição do controle. O cálculo real da cadeia de caracteres é obtida facilmente com uma chamada à função de GetTextExtentPoint32 o Win32. Uma vez que o tamanho é determinado, passa o valor de volta ao aplicativo e sair da função do manipulador.
O exemplo a seguir é um método de fornecer o tamanho da cadeia de caracteres de retorno de chamada:
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;
}
O tamanho do campo atual de retorno de chamada é calculada uma vez, você deve fornecer um valor para o campo. Isso é feito no manipulador para a notificação de DTN_FORMAT .
Tratando a notificação de DTN_FORMAT
A notificação de DTN_FORMAT é usada pelo aplicativo solicitar a cadeia de caracteres que será preterida. O exemplo a seguir demonstra um método possível:
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;
}
Dica
O ponteiro para a estrutura de NMDATETIMEFORMAT for localizado convertendo o primeiro parâmetro do manipulador de notificação para o tipo correto.