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 intestazione
  • Controlli visualizzazione elenco
  • Controlli Rebar
  • Controlli della barra degli strumenti
  • Controlli descrizione comando
  • Controlli trackbar
  • Controlli visualizzazione albero

Informazioni sui messaggi di notifica di disegno personalizzati

Tutti i controlli comuni che supportano l'invio di disegni personalizzati NM_CUSTOMDRAW codici di notifica 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 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 della barra degli strumenti
NMTTCUSTOMDRAW Controlli descrizione comando
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 di disegno o cancellazione di un controllo stesso è chiamato ciclo di vernice. Controlli che supportano l'invio di disegni personalizzati NM_CUSTOMDRAW codici di notifica periodicamente attraverso 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 struttura NMCUSTOMDRAW è 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_PRedizione Enterprise RA edizione Standard Prima dell'inizio del ciclo di cancellazione.
CDDS_POSTERAedizione Standard 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_ITEMPRedizione Enterprise RA edizione Standard Prima che un elemento venga cancellato.
CDDS_ITEMPOSTERAedizione Standard Dopo che un elemento è stato cancellato.
CDDS_SUBITEM Versioni di controllo comuni 4.71. Flag combinato con CDDS_ITEMPREPAINT o CDDS_ITEMPOSTPAINT se viene disegnato un elemento secondario. 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 cosa deve fare. 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 preliminare

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_DOERAedizione Standard Il controllo disegnare 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 dell'elemento. Invierà NM_CUSTOMDRAW codici di notifica prima e dopo aver disegnato gli elementi. Ciò si verifica quando dwDrawStage è uguale a CDDS_PREPAINT.
CDRF_NOTIFYPOSTERAedizione Standard 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 al completamento del ciclo di disegno per l'intero controllo. Ciò si verifica quando dwDrawStage è uguale a CDDS_PREPAINT.
CDRF_NOTIFYSUBITEMDRAW Versione 4.71. L'applicazione riceverà una notifica di NM_CUSTOMDRAW con dwDrawStage impostato su CDDS_ITEMPREPAINT | CDDS_SUBITEM prima che venga disegnato ogni elemento secondario 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 disegnare l'elemento. Ciò si verifica quando dwDrawStage è uguale a CDDS_ITEMPREPAINT.
CDRF_SKIPPOSTPAINT Il controllo non disegnare il rettangolo dello stato attivo intorno a un elemento.

 

Richiesta di notifiche specifiche dell'elemento

Se l'applicazione restituisce CDRF_NOTIFYITEMDRAW alla notifica iniziale di disegno personalizzata prepaint, il controllo invierà notifiche per ogni elemento che disegna durante il 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 fino a quando non inizia a disegnare l'elemento successivo.

Disegno dell'elemento manualmente

Se l'applicazione disegna l'intero elemento, restituire CDRF_SKIPDEFAULT. Ciò consente al controllo di ignorare gli elementi che non è necessario disegnare, riducendo così il sovraccarico del sistema. Tenere presente che la restituzione di questo valore indica che il controllo non disegnare 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 il valore 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 .For more information on using this functionality, see the sample code 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 nella visualizzazione albero, è necessario inserire i valori di colore desiderati nei membri clrText e clrTextBk della struttura NMLVCUSTOMDRAW o NMTVCUSTOMDRAW.

Nota

Prima della 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, è prima necessario disabilitare gli stili di visualizzazione chiamando SetWindowTheme e non specificando alcuno stile di visualizzazione:

 

SetWindowTheme (hwnd, "", "");

Disegno personalizzato con controlli Visualizzazione elenco e Visualizzazione albero

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 la 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 CCM_edizione Standard TVERSION 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 Visualizzazione elenco

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 impostata su CDDS_PREPAINT. Restituisce CDRF_NOTIFYITEMDRAW.
  2. Si riceverà quindi una notifica di NM_CUSTOMDRAW con dwDrawStage impostato su CDDS_ITEMPREPAINT. Se specifichi nuovi tipi di carattere o colori e restituisci CDRF_NEWFONT, tutti gli elementi secondari dell'elemento verranno modificati. 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 NMCUSTOMDRAW associata impostata su CDDS_PREPAINT. Restituisce CDRF_NOTIFYITEMDRAW.
  2. Si riceverà 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 NM_CUSTOMDRAW visualizzazione elenco, vedere Uso di un disegno personalizzato.

Concettuale

Utilizzo di un disegno personalizzato

Riferimento disegno personalizzato

Altre risorse

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