Condividi tramite


Informazioni sui controlli dell'intestazione

Un controllo di 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 di intestazione con colonne etichettate che forniscono informazioni dettagliate sui file in una directory.

schermata di una finestra di dialogo con un controllo intestazione a tre colonne

È possibile creare un controllo intestazione usando la funzioneCreateWindowEx, specificando la classe 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 funzioneInitCommonControlsEx. Dopo aver creato un controllo di intestazione, è possibile dividerlo in parti, impostare il testo in ogni parte e controllare l'aspetto della finestra usando i messaggi dell'intestazione della finestra.

Un controllo intestazione può essere creato come finestra figlia di un altro controllo, ad esempio una casella di riepilogo. Tuttavia, il controllo padre non è a conoscenza del controllo dell'intestazione e non permette di considerare lo spazio occupato da essa. Di conseguenza, gli elementi dell'elenco verranno visualizzati dietro l'intestazione. Se si desidera utilizzare un'intestazione in un elenco o in un altro controllo, il controllo padre deve essere gestito dal proprietario in modo che tutti gli elementi vengano visualizzati nella posizione corretta.

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

Dimensioni e posizione del controllo dell'intestazione

In genere, è necessario impostare le dimensioni e la posizione di un controllo dell'intestazione in modo che si adatti all'interno dei limiti di un particolare rettangolo, ad esempio l'area client di una finestra. Utilizzando il messaggio HDM_LAYOUT, è possibile recuperare le dimensioni e i valori relativi alla posizione appropriati dall'intestazione di controllo.

Quando si invia HDM_LAYOUT, si specifica l'indirizzo di una struttura HDLAYOUT che contiene le coordinate del rettangolo che deve essere occupato dal controllo intestazione 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 di 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, la posizione e lo stato di visibilità.

Elementi

Un controllo intestazione include in genere diversi elementi di intestazione che definiscono le colonne del controllo. È possibile aggiungere un elemento a un controllo dell'intestazione inviando il messaggio HDM_INSERTITEM al controllo. Il messaggio include l'indirizzo di una struttura HDITEM. Questa struttura definisce le proprietà dell'elemento di intestazione, che può includere una stringa, un'immagine mappata a bit, una dimensione iniziale e un valore LPARAM definito dall'applicazione .

Il membro fmt della struttura HDITEMdi 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 di 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_INSERTITEM 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 di HDM_SETITEM 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 il conteggio degli elementi in un controllo dell'intestazione, utilizzare il messaggio HDM_GETITEMCOUNT.

Controlli intestazione Owner-Drawn

È possibile definire singoli elementi di un controllo dell'intestazione come elementi disegnati dall'utente. Usando questa tecnica hai più controllo di quanto avresti altrimenti sull'aspetto di un elemento di intestazione.

È possibile utilizzare il messaggio di HDM_INSERTITEM per inserire un nuovo elemento disegnato dal proprietario in un controllo intestazione o nel messaggio HDM_SETITEM 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 a disegno personalizzato, invia il messaggio WM_DRAWITEM alla finestra padre. Il parametro wParam del messaggio è l'identificatore della finestra figlio del controllo di 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 a disegno personalizzato in un controllo intestazione, la struttura DRAWITEMSTRUCT contiene le informazioni seguenti.

Membro Descrizione
CtlType ODT_HEADER tipo di controllo gestito dal proprietario.
CtlID Identificatore del sottomenu del controllo header.
itemID Indice dell'elemento da disegnare.
itemAction ODA_DRAWENTIRE flag di azione di disegno.
statoArticolo ODS_SELECTED flag di azione di disegno 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 dell'intestazione di controllo.
itemData Valore a 32 bit definito dall'applicazione associato all'elemento.

 

Filtri di controllo delle intestazioni

Specificando lo stile della finestra HDS_FILTERBAR per un controllo di intestazione, è possibile abilitare il posizionamento delle caselle di inserimento 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 HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICKo HDN_FILTERCHANGE.

Per impostazione predefinita, la casella di modifica contiene una richiesta all'utente di immettere testo. È possibile ripristinare la casella di modifica in questo stato predefinito 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 di intestazione predefinita

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

Messaggio Elaborazione eseguita
WM_CREATE Inizializza il controllo dell'intestazione.
WM_DESTROY Annulla l'inizializzazione del controllo dell'intestazione.
WM_ERASEBKGND Riempie lo sfondo dell'intestazione del controllo 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 dell'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_MOUSEMOVE Se viene trascinato un divisore, il controllo invia il codice di notifica HDN_TRACK 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 la regione non valida del controllo di intestazione. Se il parametro wParam è diverso da NULL, il controllo assume che il valore sia un HDC e dipinge utilizzando quel contesto di dispositivo.
WM_SETCURSOR Imposta la forma del cursore, a seconda che il cursore si trova in un divisore o in un elemento di intestazione.
WM_SETFONT Seleziona un nuovo handle di carattere nel contesto del dispositivo per il controllo dell'intestazione.