Usando campos de retorno de chamada em uma data e um controle de selecionador de tempo
Além dos caracteres formato padrão que definem os campos de selecionador de data e hora, você pode personalizar sua saída especificando determinadas partes de uma seqüência 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" (ASCII código 88) em qualquer lugar no corpo de seqüência de formato.Por exemplo, a seguinte seqüência de caracteres "' hoje é: 'AA' / 'MM' / 'dd' (dia 'X')'" faz com que o controle de selecionador de data e hora exibir o valor atual como o ano seguido por mês, data e finalmente o dia do ano.
Observação |
---|
O número de x em um retorno de chamada campo não corresponde ao número de caracteres que será exibido. |
Você pode distinguir entre vários campos de retorno de chamada em uma seqüência personalizada, repetindo o caractere "X".Assim, a seqüência de caracteres de formato "XXddddMMMdd', ' yyyXXX" contém dois campos de retorno de chamada exclusivo, "XX" e "XXX".
Observação |
---|
Campos de retorno de chamada são tratados como campos válidos, portanto, seu aplicativo deve estar preparado para lidar com DTN_WMKEYDOWN mensagens de notificação. |
Implementação de campos de retorno de chamada no seu controle de selecionador de data e hora consiste em três partes:
Inicializando a cadeia de caracteres de formato personalizado
Tratamento de DTN_FORMATQUERY notificação
Tratamento de DTN_FORMAT notificação
Inicializando a cadeia de caracteres de formato personalizado
Inicializar a seqüência personalizada com uma chamada para CDateTimeCtrl::SetFormat.Para obter mais informações, consulte Usando seqüências de formato personalizado em uma data e um controle de selecionador de tempo.É um lugar comum para definir a seqüência de caracteres de formato personalizado na OnInitDialog função de sua classe diálogo ou OnInitialUpdate função de sua classe modo de exibição.
Manipulação a notificação DTN_FORMATQUERY
Quando o controle analisa a seqüência de formato e encontra um campo de retorno de chamada, o aplicativo envia DTN_FORMAT e DTN_FORMATQUERY mensagens de notificação.A seqüência de caracteres de campo de retorno de chamada está incluída com as notificações para que possa determinar qual campo de retorno de chamada está sendo consultado.
O DTN_FORMATQUERY notificação é enviada para recuperar o tamanho máximo permitido em pixels da seqüência de caracteres que será exibido no campo de retorno de chamada atual.
Para calcular corretamente esse valor, você deve calcular a altura e largura da cadeia de caracteres a ser substituído para o campo, usando a fonte de exibição do controle.O cálculo real da seqüência de caracteres é feito facilmente com uma chamada para o GetTextExtentPoint32 função do Win32.Uma vez determinado o tamanho, passar o valor de volta para o aplicativo e a função de manipulador de sair.
O exemplo a seguir é um método de fornecer o tamanho da seqüência 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 tenha sido calculado, você deve fornecer um valor para o campo.Isso é feito no manipulador para o DTN_FORMAT notificação.
Manipulação a notificação de DTN_FORMAT
O DTN_FORMAT notificação é usada pelo aplicativo para solicitar a seqüência 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 o NMDATETIMEFORMAT estrutura é encontrada, lançando o primeiro parâmetro do manipulador de notificação para o tipo apropriado. |