Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 é: 'yy'/'MM'/'dd' (Dia 'X')'" faz com que o controle seletor de data e hora exiba o valor atual como o ano seguido pelo mês, data e, finalmente, o dia do ano.
Observação
O número de Xs em um campo de callback 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 callback são tratados como campos válidos, portanto, seu aplicativo deve estar preparado para lidar com mensagens de notificação de DTN_WMKEYDOWN.
Implementar campos de callback 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
Inicializando 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 Como usar cadeias de caracteres de formato personalizado em um controle 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 obter o tamanho máximo permitido em pixels da cadeia de caracteres que será exibida no campo de callback atual.
Para calcular corretamente esse valor, você deve calcular a altura e a largura do texto para substituir o 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 callback atual tiver sido calculado, você deve 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 que 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.