Informazioni sui controlli intestazione

Un controllo intestazione è una finestra in genere posizionata sopra le colonne di testo o numeri. Contiene un titolo per ogni colonna e può essere diviso in parti. L'utente può trascinare i divisori che separano le parti per impostare la larghezza di ogni colonna. La figura seguente mostra un controllo intestazione con etichette di colonne che forniscono informazioni dettagliate sui file in una directory.

screen shot of a dialog box with a three-column header control

È possibile creare un controllo intestazione usando la funzione CreateWindowEx, specificando la classe della finestra WC_HEADER e gli stili di controllo intestazione appropriati. Questa classe finestra viene registrata quando viene caricata la DLL del controllo comune. Per assicurarsi che questa DLL venga caricata, usare la funzione InitCommonControlsEx. Dopo aver creato un controllo intestazione, è possibile dividerlo in parti, impostare il testo in ogni parte e controllare l'aspetto della finestra usando i messaggi della finestra di intestazione.

Un controllo intestazione può essere creato come finestra figlio di un altro controllo, ad esempio una casella di riepilogo. Tuttavia, il controllo padre non riconosce il controllo intestazione e non consente lo spazio occupato dall'intestazione, con il risultato che gli elementi dell'elenco verranno visualizzati dietro l'intestazione. Se si desidera utilizzare un controllo intestazione in una casella di riepilogo o in un altro controllo, il controllo padre deve essere disegnato dal proprietario in modo che tutti gli elementi vengano visualizzati nella posizione corretta.

I controlli visualizzazione elenco dispongono già di controlli intestazione. Anziché creare un controllo intestazione per un controllo visualizzazione elenco, è possibile utilizzare LVM_GETHEADER o ListView_GetHeader per recuperare il controllo esistente.

Dimensioni e posizione del controllo intestazione

In genere, è necessario impostare le dimensioni e la posizione di un controllo intestazione in modo da adattarsi entro i limiti di un particolare rettangolo, ad esempio l'area client di una finestra. Usando il messaggio HDM_LAYOUT , è possibile recuperare le dimensioni e i valori di posizione appropriati dal controllo intestazione.

Quando si invia HDM_LAYOUT, si specifica l'indirizzo di una struttura HDLAYOUT che contiene le coordinate del rettangolo che il controllo intestazione deve occupare e fornisce un puntatore a una struttura WINDOWPOS. Il controllo riempie la struttura WINDOWPOS con valori di dimensione e posizione appropriati per posizionare il controllo lungo la parte superiore del rettangolo specificato. Il valore di altezza è la somma delle altezze dei bordi orizzontali del controllo e l'altezza media dei caratteri nel tipo di carattere attualmente selezionato nel contesto del dispositivo del controllo.

Se si desidera utilizzare HDM_LAYOUT per impostare le dimensioni iniziali e la posizione di un controllo intestazione, impostare lo stato di visibilità iniziale del controllo in modo che sia nascosto. Dopo aver inviato HDM_LAYOUT per recuperare le dimensioni e i valori di posizione, è possibile usare la funzione SetWindowPos per impostare le nuove dimensioni, posizione e stato di visibilità.

Articoli

Un controllo intestazione include in genere diversi elementi di intestazione che definiscono le colonne del controllo. Aggiungere un elemento a un controllo intestazione inviando il messaggio HDM_INedizione Standard RTITEM al controllo . Il messaggio include l'indirizzo di una struttura HDITEM . Questa struttura definisce le proprietà dell'elemento di intestazione, che possono includere una stringa, un'immagine bitmap, una dimensione iniziale e un valore LPARAM definito dall'applicazione.

Il membro fmt della struttura HDITEM di un elemento può includere il flag HDF_STRING o HDF_BITMAP per indicare se il controllo visualizza la stringa o la bitmap dell'elemento. Se si desidera visualizzare sia una stringa che una bitmap, creare un elemento disegnato dal proprietario impostando il membro fmt per includere il flag HDF_OWNERDRAW. La struttura HDITEM specifica anche flag di formattazione che indicano al controllo se allineare al centro, allineare a sinistra o allineare a destra la stringa o la bitmap nel rettangolo dell'elemento.

HDM_INedizione Standard RTITEM restituisce l'indice dell'elemento appena aggiunto. È possibile utilizzare l'indice in altri messaggi per impostare proprietà o recuperare informazioni sull'elemento. È possibile eliminare un elemento usando il messaggio HDM_DELETEITEM , specificando l'indice dell'elemento da eliminare.

È possibile utilizzare il messaggio HDM_edizione Standard TITEM per impostare le proprietà di un elemento di intestazione esistente e il messaggio HDM_GETITEM per recuperare le proprietà correnti di un elemento. Per recuperare un conteggio degli elementi in un controllo intestazione, utilizzare il messaggio HDM_GETITEMCOUNT.

Controlli intestazione disegnati dal proprietario

È possibile definire singoli elementi di un controllo intestazione per essere elementi disegnati dal proprietario. L'uso di questa tecnica offre un maggiore controllo rispetto all'aspetto di un elemento di intestazione.

È possibile utilizzare il messaggio HDM_INedizione Standard RTITEM per inserire un nuovo elemento disegnato dal proprietario in un controllo intestazione o nel messaggio HDM_edizione Standard TITEM per modificare un elemento esistente in un elemento disegnato dal proprietario. Entrambi i messaggi includono l'indirizzo di una struttura HDITEM, che deve avere il membro fmt impostato sul valore HDF_OWNERDRAW.

Quando un controllo intestazione deve disegnare un elemento disegnato dal proprietario, invia il messaggio di WM_DRAWITEM alla finestra padre. Il parametro wParam del messaggio è l'identificatore della finestra figlio del controllo intestazione e il parametro lParam è un indirizzo di una struttura DRAWITEMSTRUCT . La finestra padre utilizza le informazioni nella struttura per disegnare l'elemento. Per un elemento disegnato dal proprietario in un controllo intestazione, la struttura DRAWITEMSTRUCT contiene le informazioni seguenti.

Membro Descrizione
CtlType ODT_HEADER tipo di controllo disegnato dal proprietario.
CtlID Identificatore della finestra figlio del controllo intestazione.
Itemid Indice dell'elemento da disegnare.
itemAction ODA_DRAWENTIRE flag di azione di disegno.
itemState ODS_edizione Standard flag di azione di disegnoLECTED se il cursore si trova sull'elemento e il pulsante del mouse è inattivo. In caso contrario, questo membro è zero.
hwndItem Handle per il controllo intestazione.
Hdc Handle nel contesto del dispositivo del controllo intestazione.
rcItem Coordinate dell'elemento di intestazione da disegnare. Le coordinate sono relative all'angolo superiore sinistro del controllo intestazione.
Itemdata Valore a 32 bit definito dall'applicazione associato all'elemento.

 

Filtri di controllo intestazione

Specificando lo stile della finestra HDS_FILTERBAR per un controllo intestazione, è possibile abilitare il posizionamento delle caselle di modifica del filtro sotto le intestazioni di colonna. Accanto alla casella di modifica viene visualizzato un pulsante filtro. È possibile implementare il filtro rispondendo ai codici di notifica di HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICK o HDN_FILTERCHANGE .

Per impostazione predefinita, la casella di modifica contiene una richiesta all'utente di immettere testo. È possibile ripristinare lo stato predefinito della casella di modifica usando Header_ClearFilter o Header_ClearAllFilters.

Nell'esempio di codice seguente viene illustrato come recuperare il controllo intestazione da un controllo visualizzazione elenco e aggiungere una barra dei filtri.

// hList is the HWND of the list-view control.
HWND hHeader = ListView_GetHeader(hList);
LONG_PTR styles = GetWindowLongPtr(hHeader, GWL_STYLE);
SetWindowLongPtr(g_hHeader, GWL_STYLE, styles | HDS_FILTERBAR);

Elaborazione dei messaggi di controllo intestazione predefinita

In questa sezione vengono descritti i messaggi della finestra gestiti dalla routine della finestra per la classe finestra WC_HEADER .

Message Elaborazione eseguita
WM_CREATE Inizializza il controllo intestazione.
WM_DESTROY Annulla l'inizializzazione del controllo intestazione.
WM_ERAedizione Standard BKGND Riempie lo sfondo del controllo intestazione utilizzando il colore di sfondo corrente del controllo.
WM_GETDLGCODE Restituisce una combinazione dei valori DLGC_WANTTAB e DLGC_WANTARROWS.
WM_GETFONT Restituisce l'handle al tipo di carattere corrente, utilizzato dal controllo intestazione per disegnare il testo.
WM_LBUTTONDBLCLK Acquisisce l'input del mouse. Se il cursore del mouse si trova su un divisore, il controllo invia il codice di notifica HDN_BEGINTRACK e inizia a trascinare il divisore. Se il cursore si trova su un elemento, l'elemento viene visualizzato nello stato premuto.
WM_LBUTTONDOWN Uguale al messaggio di WM_LBUTTONDBLCLK .
WM_LBUTTONUP Rilascia l'acquisizione del mouse. Se il controllo stava tenendo traccia dello spostamento del mouse, invia il codice di notifica HDN_ENDTRACK e ridisegna il controllo intestazione. In caso contrario, il controllo invia il codice di notifica HDN_ITEMCLICK e ridisegna l'elemento di intestazione su cui è stato fatto clic.
WM_MOUedizione Standard MOVE Se viene trascinato un divisore, il controllo invia il HDN_TRACK codice di notifica e visualizza l'elemento nella nuova posizione. Se il pulsante sinistro del mouse è in basso e il cursore si trova su un elemento, l'elemento viene visualizzato nello stato premuto.
WM_NCCREATE Alloca e inizializza una struttura di dati interna.
WM_NCDESTROY Libera le risorse allocate dal controllo intestazione dopo che il controllo intestazione non è inizializzato.
WM_PAINT Disegna l'area non valida del controllo intestazione. Se il parametro wParam è diverso da NULL, il controllo presuppone che il valore sia un HDC e disegna utilizzando tale contesto di dispositivo.
WM_edizione Standard TCURSOR Imposta la forma del cursore, a seconda che il cursore si trova in un divisore o in un elemento di intestazione.
WM_edizione Standard TFONT Seleziona un nuovo handle del tipo di carattere nel contesto di dispositivo per il controllo intestazione.