Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Além dos caracteres de formato padrão que definem os campos do 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 callback, inclua um ou mais caracteres "X" (Código ASCII 88) em qualquer lugar no corpo da string de formato. Por exemplo, a seguinte cadeia de caracteres "'Hoje é: 'yy'/'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, finalmente, o dia do ano.
Observação
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 personalizada repetindo o caractere "X". Assim, a string de formato "XXddddMMMdd', 'yyyXXX" contém dois campos de retorno exclusivos, "XX" e "XXX".
Observação
Os campos de retorno de chamada são tratados como campos válidos, portanto, a sua aplicação deve estar preparada para lidar com mensagens de notificação DTN_WMKEYDOWN.
A implementação de campos de callback no seu controlo de seleção de data e hora consiste em três partes:
Inicializando a cadeia de caracteres de formato personalizado
Tratamento da notificação de DTN_FORMATQUERY
Tratamento da notificação de 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 Usando cadeias de caracteres de formato personalizado em um controle de seletor de data e hora. Um lugar comum para definir a cadeia de caracteres de formato personalizado é na OnInitDialog função da classe de diálogo de contenção ou OnInitialUpdate função da classe de exibição de contenção.
Tratamento da notificação de DTN_FORMATQUERY
Quando o controle analisa a cadeia de caracteres de formato e encontra um campo de retorno de chamada, o aplicativo envia mensagens de notificação DTN_FORMAT e DTN_FORMATQUERY. A cadeia de caracteres do campo de retorno de chamada é 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 callback 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 alcançado com uma chamada para a função GetTextExtentPoint32 Win32. Uma vez que o tamanho é determinado, passe o valor de volta para o aplicativo e saia da função de manipulador.
O exemplo a seguir é uma maneira de indicar o tamanho da cadeia de caracteres usada no 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ê deve fornecer um valor para o campo. Isso é feito no manipulador para a notificação de DTN_FORMAT.
Tratamento da notificação de 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 ao converter o primeiro parâmetro do manipulador de notificações para o tipo apropriado.