Condividi tramite


Utilizzando i campi callback in un controllo di selezione data e ora

Oltre ai caratteri di formato standard che definiscono i campi di selezione data e ora, è possibile personalizzare l'output specificando determinate parti di una stringa di formato personalizzata come campi callback.Per dichiarare un campo callback, includere uno o più caratteri “X„ (codice ASCII 88) in un punto qualsiasi del corpo della stringa di formato.Ad esempio, la seguente stringa “today is: „/„/“yy mm dd„ (giorno “X ")„ indica al controllo di selezione data e ora da visualizzare il valore corrente come l'anno seguito dal mese, dalla data e infine dal giorno dell'anno.

[!NOTA]

Il numero di x in un campo callback non corrisponde al numero di caratteri da visualizzare.

È possibile distinguere tra i campi callback in una stringa personalizzata ripetendo il carattere “X„.Pertanto, la stringa di formato “XXddddMMMdd, il yyyXXX„ contiene due campi callback univoci, “XX„ e “XXX„.

[!NOTA]

I campi callback vengono considerati come campi validi, pertanto l'applicazione deve essere preparare la gestione dei messaggi di notifica di DTN_WMKEYDOWN .

Implementare i campi callback nel controllo di selezione data e ora è costituito da tre parti:

  • Inizializzare la stringa di formato personalizzata

  • Gestire la notifica di DTN_FORMATQUERY

  • Gestire la notifica di DTN_FORMAT

Inizializzare la stringa di formato personalizzata

Inizializzare la stringa personalizzata con una chiamata a CDateTimeCtrl::SetFormat.Per ulteriori informazioni, vedere Utilizzo di stringhe di formato personalizzate in un controllo di selezione data e ora.Una posizione comune per impostare la stringa di formato personalizzata è la funzione di OnInitDialog della classe della finestra di dialogo o funzione contenitore di OnInitialUpdate della classe di visualizzazione contenitore.

Gestire la notifica di DTN_FORMATQUERY

Quando il controllo analizza la stringa di formato e rileva un campo callback, l'applicazione invia i messaggi di notifica di DTN_FORMATQUERY e di DTN_FORMAT .La stringa del campo callback è inclusa con le notifiche pertanto è possibile determinare il campo callback viene eseguita una query.

La notifica di DTN_FORMATQUERY viene inviata per recuperare la dimensione massima consentita in pixel della stringa che verrà visualizzata nel campo callback corrente.

Per poter calcolare il valore, è necessario calcolare l'altezza e la larghezza della stringa, ad essere sostituiti per il campo, tramite il tipo del controllo.Effettivo calcolo della stringa facilmente viene raggiunto con una chiamata alla funzione Win32 di GetTextExtentPoint32 .Una volta la dimensione viene determinata, passa il valore dell'applicazione e chiude la funzione di gestione.

L'esempio seguente è un metodo di fornire la dimensione della stringa di callback:

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;
}

La dimensione del campo callback corrente è stata calcolata una volta, è necessario specificare un valore per il campo.Questa operazione viene eseguita nel gestore per la notifica di DTN_FORMAT .

Gestire la notifica di DTN_FORMAT

La notifica di DTN_FORMAT viene utilizzata dall'applicazione richiedere la stringa di caratteri che verrà sostituito.Nell'esempio seguente viene illustrato un metodo possibile:

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;
}

[!NOTA]

Il puntatore alla struttura di NMDATETIMEFORMAT viene trovato il cast del primo parametro del gestore della notifica al tipo appropriato.

Vedere anche

Riferimenti

Utilizzando CDateTimeCtrl

Concetti

Controlli (MFC)