Utilizzo dei campi callback in un controllo selezione data e ora
Oltre ai caratteri di formato standard che definiscono i campi di selezione data e ora, è possibile personalizzare il proprio 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 stringa "today is: "/"/"yy mm" dd (giorno "X ")" "determina il controllo di selezione data e ora da visualizzare il valore corrente dell'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, 'yyyXXX" contiene due campi callback univoci, "XX" e "SE NO".
Nota
I campi callback vengono considerati come campi validi, pertanto l'applicazione deve essere preparata gestire i 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 la 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 sostituito per il campo, tramite il tipo del controllo. Che il calcolo della stringa facilmente viene raggiunto tramite una chiamata alla funzione Win32 di GetTextExtentPoint32. Quando 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 fornire 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 venga utilizzata dall'applicazione necessaria una 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 eseguendo il cast del primo parametro del gestore della notifica al tipo appropriato.