Condividi tramite


Utilizzo dei campi callback in un controllo selezione data e ora

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

Nota

Il numero di X in un campo di callback non corrisponde al numero di caratteri che verranno visualizzati.

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

Nota

I campi di callback vengono considerati campi validi, pertanto l'applicazione deve essere preparata per gestire DTN_WMKEYDOWN messaggi di notifica.

L'implementazione dei campi di callback nel controllo selezione data e ora è costituita da tre parti:

  • Inizializzazione della stringa di formato personalizzata

  • Gestione della notifica di DTN_FORMATQUERY

  • Gestione della notifica di DTN_FORMAT

Inizializzazione della stringa di formato personalizzata

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

Gestione della notifica DTN_FORMATQUERY

Quando il controllo analizza la stringa di formato e rileva un campo di callback, l'applicazione invia DTN_FORMAT e DTN_FORMATQUERY messaggi di notifica. La stringa del campo di callback è inclusa nelle notifiche in modo da determinare quale campo di callback viene sottoposto a query.

La notifica DTN_FORMATQUERY viene inviata per recuperare le dimensioni massime consentite in pixel della stringa che verrà visualizzata nel campo di callback corrente.

Per calcolare correttamente questo valore, è necessario calcolare l'altezza e la larghezza della stringa, in modo da sostituire il campo utilizzando il tipo di carattere visualizzato del controllo. Il calcolo effettivo della stringa viene facilmente ottenuto con una chiamata alla funzione GetTextExtentPoint32 Win32. Dopo aver determinato le dimensioni, passare di nuovo il valore all'applicazione e uscire dalla funzione del gestore.

L'esempio seguente è un metodo per fornire le dimensioni 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;
}

Dopo aver calcolato le dimensioni del campo di callback corrente, è necessario specificare un valore per il campo. Questa operazione viene eseguita nel gestore per la notifica di DTN_FORMAT.

Gestione della notifica di DTN_FORMAT

La notifica DTN_FORMAT viene usata dall'applicazione per richiedere la stringa di caratteri che verrà sostituita. L'esempio seguente illustra 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 NMDATETIMEFORMAT viene trovato eseguendo il cast del primo parametro del gestore di notifica al tipo appropriato.

Vedi anche

Uso di CDateTimeCtrl
Controlli