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 determinadas partes de uma cadeia de caracteres de formato personalizado como campos de retorno de chamada. Para declarar um campo de retorno de chamada, inclua um ou mais caracteres "X" (Código ASCII 88) 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 do seletor de data e hora exiba o valor atual como o ano seguido pelo mês, data e, por fim, o dia do ano.
Observação
O número de Xs 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 personalizada repetindo o caractere "X". Assim, a cadeia de caracteres de formato "XXddddMMMdd", "yyyXXX" contém dois campos de retorno de chamada exclusivos, "XX" e "XXX".
Observação
Os campos de retorno de chamada são tratados como campos válidos e, portanto, seu aplicativo deve estar preparado para tratar mensagens de notificação DTN_WMKEYDOWN.
A implementação de campos de retorno de chamada no controle do seletor de data e hora consiste em três partes:
Inicializar a cadeia de caracteres de formato personalizado
Tratamento da notificação DTN_FORMATQUERY
Tratamento da notificação DTN_FORMAT
Inicializar a cadeia de caracteres de formato personalizado
Inicialize a cadeia de caracteres personalizada com uma chamada para CDateTimeCtrl::SetFormat
. Para obter mais informações, consulte Usar cadeias de caracteres de formato personalizado em um controle de seletor de data e hora. Um local comum para definir a cadeia de caracteres de formato personalizado está na função OnInitDialog
da classe de diálogo ou na função OnInitialUpdate
da classe de exibição.
Tratamento da notificação DTN_FORMATQUERY
Quando o controle analisa a cadeia de caracteres de formato e encontra um campo de retorno de chamada, o aplicativo envia as mensagens de notificação DTN_FORMAT e DTN_FORMATQUERY. A cadeia de caracteres do campo de retorno de chamada está incluída nas notificações para que você possa determinar qual campo de retorno de chamada está sendo consultado.
A notificação DTN_FORMATQUERY é enviada para recuperar o tamanho máximo permitido em pixels da cadeia de caracteres que será exibida no campo de retorno de chamada atual.
Para calcular corretamente esse valor, você deve calcular a altura e a largura da cadeia de caracteres a ser substituída pelo campo, usando a fonte de exibição do controle. O cálculo real da cadeia de caracteres é facilmente obtido com uma chamada para a função GetTextExtentPoint32 Win32. Depois que o tamanho for determinado, passe o valor de volta para o aplicativo e saia da função de manipulador.
O exemplo a seguir é um método para 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;
}
Depois que o tamanho do campo de retorno de chamada atual tiver sido calculado, você deverá fornecer um valor para o campo. Isso é feito no manipulador para a notificação DTN_FORMAT.
Tratamento da notificação DTN_FORMAT
A notificação DTN_FORMAT é usada pelo aplicativo para solicitar a cadeia de caracteres a ser substituída. 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;
}
Observação
O ponteiro para a estrutura NMDATETIMEFORMAT é encontrado pela conversão do primeiro parâmetro do manipulador de notificação para o tipo adequado.