Compartilhar via


Usando campos de retorno de chamada em uma data e controle do selecionador de horário

Juntamente com sistema autônomo caracteres de formato padrão que definem sistema autônomo campos de selecionador de data e time, você pode personalizar a saída especificando determinadas partes de uma seqüência de caracteres de formato personalizado sistema autônomo campos de retorno de chamada.Para declarar um campo de retorno de chamada, inclua um ou mais caracteres "X" (88 de códigos ASCII) em qualquer lugar no corpo da seqüência de caracteres de formato.Por exemplo, a seguinte seqüência de caracteres "' hoje é: ' AA '/' MM '/' dd '(dia 'X')' "faz o controle de selecionador de data e time exibir o valor corrente sistema autônomo o ano seguido do mês, data e por último dia do ano.

Observação:

O número de x em um retorno de chamada de 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 sistema autônomo campos válido, para que seu aplicativo deve ser preparado para lidar com DTN_WMKEYDOWN mensagens de notificação.

Implementando retorno de chamada campos em seu controle de selecionador de data e time consiste em três partes:

  • Inicializando a seqüência de caracteres de formato personalizado

  • Manipulando o DTN_FORMATQUERY notificação

  • Manipulando o DTN_FORMAT notificação

Inicializando a seqüência de formato personalizado

Inicializar a seqüência personalizada com uma telefonar para CDateTimeCtrl::SetFormat. Para obter mais informações, consulte Usando cadeias de caracteres de formato personalizado em uma data e o controle do selecionador de horário.Um lugar comum para conjunto a seqüência de caracteres de formato personalizado é no OnInitDialog função de sua classe de caixa de diálogo contendo ou OnInitialUpdate função de classe seu modo de exibição.

Manipulação de notificação DTN_FORMATQUERY

Quando o controle analisa a seqüência de caracteres de formato e encontra um campo de retorno de chamada, o aplicativo envia DTN_FORMAT and 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 você possa determinar qual campo de retorno de chamada é que está sendo consultado.

The DTN_FORMATQUERY notificação é enviada para recuperar o dimensionar máximo permitido em pixels da seqüência de caracteres que será exibido no campo de retorno de chamada corrente.

Para calcular esse valor corretamente, você deve calcular a altura e largura da seqüência de caracteres, seja substituído para o campo usando a fonte de exibição do controle.Cálculo real da seqüência de caracteres é com com facilidade obtido com uma telefonar para o GetTextExtentPoint32 Função do Win32.Uma vez determinado o dimensionar, passar o valor volta para o aplicativo e a função de manipulador de sair.

O exemplo a seguir é um método para fornecer o dimensionar da seqüência 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 dimensionar do campo de retorno de chamada corrente tenha sido calculado, você deve fornecer um valor para o campo.Isso é concluído no manipulador para o DTN_FORMAT notificação.

Manipulação de notificação DTN_FORMAT

The DTN_FORMAT notificação é usada pelo aplicativo para solicitar a seqüência de caractere 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 for encontrada por lançando o primeiro parâmetro do manipulador de notificação para o tipo apropriado.

Consulte também

Conceitos

Controles (MFC)

Referência

Usando CDateTimeCtrl