Condividi tramite


Informazioni sul disegno personalizzato

Questa sezione contiene informazioni generali sulla funzionalità di disegno personalizzata e offre una panoramica concettuale del modo in cui un'applicazione può supportare il disegno personalizzato. Attualmente, i controlli seguenti supportano la funzionalità di disegno personalizzata:

  • Controlli dell'intestazione
  • Controlli visualizzazione elenco
  • Controlli delle barre di rinforzo
  • Controlli barra degli strumenti
  • Controlli dei suggerimenti
  • Controlli barra di scorrimento
  • Controlli visualizzazione albero

Informazioni sui messaggi di notifica di disegno personalizzati

Tutti i controlli comuni che supportano il disegno personalizzato inviano i codici di notifica NM_CUSTOMDRAW in punti specifici durante le operazioni di disegno. Questi codici di notifica descrivono le operazioni di disegno che si applicano all'intero controllo, nonché le operazioni di disegno specifiche per gli elementi all'interno del controllo. Come molti codici di notifica, le notifiche NM_CUSTOMDRAW vengono inviate come messaggi di WM_NOTIFY.

Il parametro lParam di una notifica di disegno personalizzata sarà l'indirizzo di una struttura NMCUSTOMDRAW o una struttura specifica del controllo che contiene una struttura NMCUSTOMDRAW come primo membro. Nella tabella seguente viene illustrata la relazione tra i controlli e le strutture usate.

Struttura Usato da
NMCUSTOMDRAW Controlli rebar, trackbar e intestazione
NMLVCUSTOMDRAW Controlli visualizzazione elenco
NMTBCUSTOMDRAW Controlli barra degli strumenti
NMTTCUSTOMDRAW Controlli dei tooltip
NMTVCUSTOMDRAW Controlli visualizzazione albero

 

Cicli di disegno, fasi di disegno e messaggi di notifica

Come tutte le applicazioni Windows, i controlli comuni dipingono periodicamente e cancellano se stessi in base ai messaggi ricevuti dal sistema o da altre applicazioni. Il processo in cui un controllo si disegna o si cancella da solo viene chiamato ciclo di pittura . Controlli che supportano il disegno personalizzato inviano periodicamente i codici di notifica NM_CUSTOMDRAW durante ogni ciclo di disegno. Questo codice di notifica è accompagnato da una struttura NMCUSTOMDRAW o da un'altra struttura che contiene una struttura NMCUSTOMDRAW come primo membro.

Una parte delle informazioni contenute nella strutturaNMCUSTOMDRAW è la fase corrente del ciclo di vernice. Questa operazione viene definita fase di disegno ed è rappresentata dal valore nel membro dwDrawStage della struttura. Un controllo informa il padre di circa quattro fasi di disegno di base. Queste fasi di disegno di base, o globali, sono rappresentate nella struttura dai valori di flag seguenti (definiti in Commctrl.h).

Valori della fase di disegno globale Descrizione
CDDS_PREPAINT Prima dell'inizio del ciclo di vernice.
CDDS_POSTPAINT Al termine del ciclo di vernice.
CDDS_PREERASE Prima dell'inizio del ciclo di cancellazione.
CDDS_POSTERASE Al termine del ciclo di cancellazione.

 

Ognuno dei valori precedenti può essere combinato con il flag CDDS_ITEM per specificare le fasi di disegno specifiche degli elementi. Per praticità, Commctrl.h contiene i valori specifici dell'elemento seguenti.

Valori di fase di disegno specifici dell'elemento Descrizione
CDDS_ITEMPREPAINT Prima di disegnare un elemento.
CDDS_ITEMPOSTPAINT Dopo che un elemento è stato disegnato.
CDDS_ITEMPREERASE Prima che un elemento venga cancellato.
CDDS_ITEMPOSTERASE Dopo che un elemento è stato cancellato.
CDDS_SUBITEM Versioni Comuni dei Controlli 4.71. Flag combinato con CDDS_ITEMPREPAINT o CDDS_ITEMPOSTPAINT se viene disegnato un sottoelemento. Verrà impostato solo se CDRF_NOTIFYITEMDRAW viene restituito da CDDS_PREPAINT.

 

L'applicazione deve elaborare il codice di notifica NM_CUSTOMDRAW e quindi restituire un valore specifico che informa il controllo che deve eseguire. Per altre informazioni su questi valori restituiti, vedere le sezioni seguenti.

Sfruttare i vantaggi dei servizi di disegno personalizzati

La chiave per sfruttare la funzionalità di disegno personalizzata è rispondere ai codici di notifica NM_CUSTOMDRAW inviati da un controllo. I valori restituiti inviati dall'applicazione in risposta a queste notifiche determinano il comportamento del controllo per tale ciclo di disegno.

Questa sezione contiene informazioni su come l'applicazione può usare i valori restituiti di notifica NM_CUSTOMDRAW per determinare il comportamento del controllo.

I dettagli sono suddivisi negli argomenti seguenti:

Risposta alla notifica di preverniciatura

All'inizio di ogni ciclo di disegno, il controllo invia il codice di notifica NM_CUSTOMDRAW, specificando il valore CDDS_PREPAINT nel membro dwDrawStage della struttura NM_CUSTOMDRAW associata. Il valore restituito dall'applicazione a questa prima notifica determina come e quando il controllo invia notifiche di disegno personalizzate successive per il resto del ciclo di disegno. L'applicazione può restituire una combinazione dei flag seguenti in risposta alla prima notifica.

Valore restituito Effetto
CDRF_DODEFAULT Il controllo disegnerà se stesso. Non invierà ulteriori notifiche NM_CUSTOMDRAW per questo ciclo di vernice. Questo flag non può essere usato con altri flag.
CDRF_DOERASE Il controllo disegnerà solo lo sfondo.
CDRF_NEWFONT L'applicazione ha specificato un nuovo tipo di carattere per l'elemento; il controllo userà il nuovo tipo di carattere. Per altre informazioni sulla modifica dei tipi di carattere, vedere Modifica di tipi di carattere e colori. Ciò si verifica quando dwDrawStage è uguale a CDDS_ITEMPREPAINT.
CDRF_NOTIFYITEMDRAW Il controllo informerà l'elemento padre di qualsiasi operazione di disegno specifica per l'elemento. Invierà NM_CUSTOMDRAW codici di notifica prima e dopo che disegna gli elementi. Ciò si verifica quando dwDrawStage è uguale a CDDS_PREPAINT.
CDRF_NOTIFYPOSTERASE Il controllo invia una notifica all'elemento padre dopo la cancellazione di un elemento. Ciò si verifica quando dwDrawStage è uguale a CDDS_PREPAINT.
CDRF_NOTIFYPOSTPAINT Il controllo invierà una notifica di NM_CUSTOMDRAW quando sarà completato il ciclo di disegno per tutto il controllo. Ciò si verifica quando dwDrawStage è uguale a CDDS_PREPAINT.
CDRF_NOTIFYSUBITEMDRAW Versione 4.71. L'applicazione riceverà una notifica NM_CUSTOMDRAW con dwDrawStage impostato su CDDS_ITEMPREPAINT | CDDS_SUBITEM prima che venga disegnato ogni sottoelemento della visualizzazione elenco. È quindi possibile specificare il tipo di carattere e il colore per ogni elemento secondario separatamente o restituire CDRF_DODEFAULT per l'elaborazione predefinita. Ciò si verifica quando dwDrawStage è uguale a CDDS_ITEMPREPAINT.
CDRF_SKIPDEFAULT L'applicazione ha disegnato manualmente l'elemento. Il controllo non disegnerà l'elemento. Ciò si verifica quando dwDrawStage è uguale a CDDS_ITEMPREPAINT.
CDRF_SKIPPOSTPAINT Il controllo non disegnerà il rettangolo di messa a fuoco intorno a un elemento.

 

Richiesta di notifiche specifiche dell'elemento

Se l'applicazione restituisce CDRF_NOTIFYITEMDRAW alla notifica iniziale di disegno personalizzato prepaint, il controllo invierà notifiche per ogni elemento che disegna durante quel ciclo di disegno. Queste notifiche specifiche dell'elemento avranno il valore CDDS_ITEMPREPAINT nel membro dwDrawStage della struttura NMCUSTOMDRAW associata. È possibile richiedere al controllo di inviare un'altra notifica al termine del disegno dell'elemento restituendo CDRF_NOTIFYPOSTPAINT a queste notifiche specifiche dell'elemento. In caso contrario, restituire CDRF_DODEFAULT e il controllo non informerà la finestra padre finché non inizierà a disegnare l'elemento successivo.

Disegno dell'elemento manualmente

Se l'applicazione disegna l'intero elemento, restituisci CDRF_SKIPDEFAULT. Ciò consente al controllo di ignorare gli elementi che non è necessario disegnare, riducendo così il sovraccarico del sistema. Tenere presente che alla restituzione di questo valore il controllo non disegnerà alcuna parte dell'elemento.

Modifica di tipi di carattere e colori

L'applicazione può usare un disegno personalizzato per modificare il tipo di carattere di un elemento. È sufficiente selezionare l'HFONT desiderato nel contesto di dispositivo specificato dal membro hdc della struttura NMCUSTOMDRAW associata alla notifica di disegno personalizzata. Poiché il tipo di carattere selezionato potrebbe avere metriche diverse rispetto al tipo di carattere predefinito, assicurarsi di includere il bit CDRF_NEWFONT nel valore restituito per il messaggio di notifica. Per altre informazioni sull'uso di questa funzionalità, vedere il codice di esempio in Using Custom Draw. Il tipo di carattere specificato dall'applicazione viene utilizzato per visualizzare l'elemento quando non è selezionato. Il disegno personalizzato non consente di modificare gli attributi del tipo di carattere per gli elementi selezionati.

Per modificare i colori del testo per tutti i controlli che supportano il disegno personalizzato, ad eccezione della visualizzazione elenco e della visualizzazione albero, è sufficiente impostare i colori di testo e sfondo desiderati nel contesto di dispositivo fornito nella struttura di notifica di disegno personalizzata con le funzioni SetTextColor e SetBkColor. Per modificare i colori del testo nella visualizzazione elenco o albero, devi inserire i valori di colore desiderati nei membri clrText e clrTextBk della struttura NMLVCUSTOMDRAW o NMTVCUSTOMDRAW.

Nota

Prima di versione 6.0 dei controlli comuni, le barre degli strumenti ignorano il flag CDRF_NEWFONT. La versione 6.0 supporta il flag CDRF_NEWFONT ed è possibile usarlo per selezionare un tipo di carattere diverso per la barra degli strumenti. Tuttavia, non è possibile modificare il colore di una barra degli strumenti quando uno stile di visualizzazione è attivo. Per modificare il colore di una barra degli strumenti nella versione 6.0, devi prima disabilitare gli stili di visualizzazione chiamando SetWindowTheme e specificando nessun stile di visualizzazione:

 

SetWindowTheme (hwnd, "", "");

Disegno personalizzato con controlli List-View e Tree-View

I controlli più comuni possono essere gestiti essenzialmente allo stesso modo. Tuttavia, i controlli visualizzazione elenco e visualizzazione albero hanno alcune funzionalità che richiedono un approccio leggermente diverso al disegno personalizzato.

Per versione 5.0, questi due controlli possono visualizzare testo ritagliato se si modifica il tipo di carattere restituendo CDRF_NEWFONT. Questo comportamento è necessario per garantire la compatibilità con le versioni precedenti dei controlli comuni. Se si desidera modificare il tipo di carattere di un controllo visualizzazione elenco o visualizzazione albero, si otterranno risultati migliori se si invia un messaggio di CCM_SETVERSION con il valore wParam impostato su 5 prima di aggiungere elementi al controllo. Per un esempio di controllo visualizzazione albero che usa disegno personalizzato, vedere l'articolo della Knowledge Base SAMPLE: CustDTv Illustra un disegno personalizzato in un controllo TreeView (Q248496).

Disegno personalizzato con controlli List-View

Poiché i controlli visualizzazione elenco hanno elementi secondari e più modalità di visualizzazione, è necessario gestire la notifica NM_CUSTOMDRAW in modo leggermente diverso rispetto agli altri controlli comuni.

Per la modalità report, utilizzare la procedura seguente.

  1. La prima notifica NM_CUSTOMDRAW avrà il membro dwDrawStage della struttura NMCUSTOMDRAW associata impostato su CDDS_PREPAINT. Restituire CDRF_NOTIFYITEMDRAW.
  2. Riceverai quindi una notifica di NM_CUSTOMDRAW con dwDrawStage impostato su CDDS_ITEMPREPAINT. Se si specificano nuovi tipi di carattere o colori e si restituisce CDRF_NEWFONT, verranno modificati tutti gli elementi secondari dell'elemento. Se invece si desidera gestire ogni elemento secondario separatamente, restituire CDRF_NOTIFYSUBITEMDRAW.
  3. Se è stato restituito CDRF_NOTIFYSUBITEMDRAW nel passaggio precedente, si riceverà una notifica di NM_CUSTOMDRAW per ogni elemento secondario con dwDrawStage impostato su CDDS_SUBITEM | CDDS_ITEMPREPAINT. Per modificare il tipo di carattere o il colore per tale elemento secondario, specificare un nuovo tipo di carattere o colore e restituire CDRF_NEWFONT.

Per l'icona grande, l'icona piccola e le modalità elenco, seguire questa procedura.

  1. La prima notifica NM_CUSTOMDRAW avrà il membro dwDrawStage della struttura associata NMCUSTOMDRAW impostato su CDDS_PREPAINT. Restituire CDRF_NOTIFYITEMDRAW.
  2. Riceverai quindi una notifica di NM_CUSTOMDRAW con dwDrawStage impostato su CDDS_ITEMPREPAINT. È possibile modificare i tipi di carattere o i colori di un elemento specificando nuovi tipi di carattere e colori e restituendo CDRF_NEWFONT. Poiché queste modalità non dispongono di elementi secondari, non riceverai notifiche aggiuntive NM_CUSTOMDRAW.

Per un esempio di gestore di notifica di visualizzazione elenco NM_CUSTOMDRAW, vedere Using Custom Draw.

concettuale

Uso del Disegno Personalizzato

di riferimento di disegno personalizzato

altre risorse

ESEMPIO : CustDTv illustra un disegno personalizzato in un TreeView (Q248496)