Informazioni sulle caselle di riepilogo
Una casella di riepilogo contiene un elenco semplice da cui l'utente può generalmente selezionare uno o più elementi. Le caselle di riepilogo offrono una flessibilità limitata rispetto ai controlli Visualizzazione Elenco.
Gli elementi della casella di riepilogo possono essere rappresentati da stringhe di testo, bitmap o entrambi. Se la casella di riepilogo non è sufficientemente grande da visualizzare tutte le voci della casella di riepilogo contemporaneamente, la casella di riepilogo fornisce una barra di scorrimento. L'utente scorre le voci della casella di riepilogo e applica o rimuove lo stato di selezione in base alle esigenze. La selezione di un elemento della casella di riepilogo modifica l'aspetto visivo, in genere modificando il testo e i colori di sfondo in quelli specificati dalle metriche del sistema operativo pertinenti. Quando l'utente seleziona o deseleziona un elemento, il sistema invia un messaggio di notifica alla finestra padre della casella di riepilogo.
Per un'applicazione ANSI, il sistema converte il testo in una casella di riepilogo in Unicode usando la tabella codici CP_ACP. Ciò può causare problemi. Ad esempio, i caratteri romani accentati in una casella di riepilogo non Unicode nella versione giapponese di Windows verranno visualizzati in modo incomprensibile. Per risolvere questo problema, compilare l'applicazione come Unicode o usare una casella di riepilogo proprietaria.
In questa sezione vengono illustrati gli argomenti seguenti:
- Creazione di una casella di riepilogo
- Tipi di caselle di riepilogo e stili
- funzioni casella di riepilogo
- messaggi di notifica da caselle di riepilogo
- Ricezione di messaggi nelle caselle di riepilogo
- Elaborazione dei messaggi della finestra predefinita
- Owner-Drawn caselle di riepilogo
- Caselle di elenco trascinabili
Creazione di una casella di riepilogo
Il modo più semplice per creare una casella di riepilogo in una finestra di dialogo consiste nel trascinarlo dalla casella degli strumenti in Microsoft Visual Studio alla risorsa della finestra di dialogo. Per creare una casella di riepilogo in modo dinamico o per creare una casella di riepilogo in una finestra diversa da una finestra di dialogo, utilizzare la funzionecreateWindowEx, specificando la classe finestra WC_LISTBOX e gli stili della casella di riepilogo appropriati .
Tipi e stili delle caselle di riepilogo
Esistono due tipi di caselle di riepilogo: selezione singola (impostazione predefinita) e selezione multipla. In una casella di riepilogo a selezione singola, l'utente può selezionare un solo elemento alla volta. In una casella di riepilogo a selezione multipla, l'utente può selezionare più di un elemento alla volta. Per creare una casella di riepilogo a selezione multipla, specificare il LBS_MULTIPLESEL o lo stile di LBS_EXTENDEDSEL.
L'aspetto e il funzionamento di una casella di riepilogo sono controllati da stili di casella di riepilogo e stili di finestra. Questi stili indicano se l'elenco è ordinato, disposto in più colonne, disegnate dall'applicazione e così via. Le dimensioni e gli stili di una casella di riepilogo vengono in genere definiti in un modello di finestra di dialogo incluso nelle risorse di un'applicazione.
Nota
Per usare gli stili di visualizzazione con questi controlli, un'applicazione deve includere un manifesto e deve chiamare InitCommonControls all'inizio del programma. Per informazioni sugli stili di visualizzazione, vedere stili di visualizzazione. Per informazioni sui manifesti, vedere Abilitazione degli stili di visualizzazione.
Funzioni casella di elenco
La funzione DlgDirList sostituisce il contenuto di una casella di riepilogo con i nomi di unità, directory e file che corrispondono a un set specificato di criteri. La funzione DlgDirSelectEx recupera la selezione corrente in una casella di riepilogo inizializzata da DlgDirList. Queste funzioni consentono all'utente di selezionare un'unità, una directory o un file da una casella di riepilogo senza digitare il percorso e il nome del file.
Inoltre, la funzioneGetListBoxInfo restituisce il numero di elementi per colonna in una casella di riepilogo specificata.
Messaggi di notifica da caselle di riepilogo
Quando si verifica un evento in una casella di riepilogo, la casella di riepilogo invia un codice di notifica, sotto forma di messaggio WM_COMMAND, alla procedura della finestra di dialogo della finestra proprietaria. I codici di notifica della casella di riepilogo vengono inviati quando un utente seleziona, fa doppio clic o annulla una voce di casella di riepilogo; quando la casella di riepilogo riceve o perde lo stato attivo della tastiera; e quando il sistema non può allocare memoria sufficiente per una richiesta di casella di riepilogo. Un messaggio WM_COMMAND contiene l'identificatore della casella di riepilogo nella parola in ordine basso del parametro wParam e il codice di notifica nella parola di ordine elevato. Il parametro lParam contiene l'handle della finestra di controllo.
Non è necessaria una procedura di finestra di dialogo per elaborare questi messaggi; la routine della finestra predefinita li elabora.
Un'applicazione deve monitorare ed elaborare i codici di notifica della casella di riepilogo seguenti.
Codice di notifica | Descrizione |
---|---|
LBN_DBLCLK | L'utente fa doppio clic su un elemento nella casella di riepilogo. |
LBN_ERRSPACE | La casella di riepilogo non può allocare memoria sufficiente per soddisfare una richiesta. |
LBN_KILLFOCUS | La casella di riepilogo perde lo stato attivo della tastiera. |
LBN_SELCANCEL | L'utente annulla la selezione di un elemento nella casella di riepilogo. |
LBN_SELCHANGE | La selezione in una casella di riepilogo sta per cambiare. |
LBN_SETFOCUS | La casella di riepilogo riceve lo stato attivo della tastiera. |
Messaggi alle caselle di riepilogo
Una procedura di finestra di dialogo può inviare messaggi a una casella di riepilogo per aggiungere, eliminare, esaminare e modificare le voci delle caselle di riepilogo. Ad esempio, una routine della finestra di dialogo potrebbe inviare un messaggio LB_ADDSTRING a una casella di riepilogo per aggiungere un elemento e un messaggio LB_GETSEL per determinare se l'elemento è selezionato. Altri messaggi impostano e recuperano informazioni sulle dimensioni, l'aspetto e il comportamento della casella di riepilogo. Ad esempio, il messaggio LB_SETHORIZONTALEXTENT imposta la larghezza scorrevole di una casella di riepilogo. Una procedura della finestra di dialogo può inviare qualsiasi messaggio a una casella di elenco utilizzando la funzione SendMessage o SendDlgItemMessage.
Un elemento della casella di riepilogo viene spesso fatto riferimento dal relativo indice , un numero intero che rappresenta la posizione dell'elemento nella casella di riepilogo. L'indice del primo elemento di una casella di riepilogo è 0, l'indice del secondo elemento è 1 e così via.
Nella tabella seguente viene descritto il modo in cui la routine della casella di riepilogo predefinita risponde ai messaggi della casella di riepilogo.
Messaggio | Risposta |
---|---|
LB_ADDFILE | Inserisce un file in una casella di riepilogo della directory compilata dalla funzione DlgDirList e recupera l'indice della casella di riepilogo dell'elemento inserito. |
LB_ADDSTRING | Aggiunge una stringa a una casella di riepilogo e ne restituisce l'indice. |
LB_DELETESTRING | Rimuove una stringa da una casella di riepilogo e restituisce il numero di stringhe che rimangono nell'elenco. |
LB_DIR | Aggiunge un elenco di nomi di file a una casella di riepilogo e restituisce l'indice dell'ultimo nome file aggiunto. |
LB_FINDSTRING | Restituisce l'indice della prima stringa nella casella di riepilogo che inizia con una stringa specificata. |
LB_FINDSTRINGEXACT | Restituisce l'indice della stringa nella casella di riepilogo uguale a una stringa specificata. |
LB_GETANCHORINDEX | Restituisce l'indice dell'elemento selezionato per ultimo. |
LB_GETCARETINDEX | Restituisce l'indice dell'elemento con il rettangolo di messa a fuoco. |
LB_GETCOUNT | Restituisce il numero di elementi nella casella di riepilogo. |
LB_GETCURSEL | Restituisce l'indice dell'elemento attualmente selezionato. |
LB_GETHORIZONTALEXTENT | Restituisce la larghezza scorrevole, espressa in pixel, di una casella di riepilogo. |
LB_GETITEMDATA | Restituisce il valore associato all'elemento specificato. |
LB_GETITEMHEIGHT | Restituisce l'altezza, in pixel, di un elemento in una casella di riepilogo. |
LB_GETITEMRECT | Recupera le coordinate client dell'elemento specificato della casella di elenco. |
LB_GETLOCALE | Recupera le impostazioni locali della casella di riepilogo. La parola di ordine elevato contiene il codice paese/area geografica e la parola con ordine basso contiene l'identificatore di lingua. |
LB_GETSEL | Restituisce lo stato di selezione di un elemento della casella di elenco. |
LB_GETSELCOUNT | Restituisce il numero di elementi selezionati in una casella di riepilogo a selezione multipla. |
LB_GETSELITEMS | Crea una matrice degli indici di tutti gli elementi selezionati in una casella di riepilogo a selezione multipla e restituisce il numero totale di elementi selezionati. |
LB_GETTEXT | Recupera la stringa associata a un elemento specificato e la lunghezza della stringa. |
LB_GETTEXTLEN | Restituisce la lunghezza, in caratteri, della stringa associata a un elemento specificato. |
LB_GETTOPINDEX | Restituisce l'indice del primo elemento visibile in una casella di riepilogo. |
LB_INITSTORAGE | Alloca memoria per il numero specificato di elementi e le relative stringhe associate. |
LB_INSERTSTRING | Inserisce una stringa in corrispondenza di un indice specificato in una casella di riepilogo. |
LB_ITEMFROMPOINT | Recupera l'indice in base zero dell'elemento più vicino al punto specificato in una casella di riepilogo. |
LB_RESETCONTENT | Rimuove tutti gli elementi da una casella di riepilogo. |
LB_SELECTSTRING | Seleziona la prima stringa trovata che corrisponde a un prefisso specificato. |
LB_SELITEMRANGE | Seleziona un intervallo specificato di elementi in una casella di riepilogo. |
LB_SELITEMRANGEEX | Seleziona un intervallo specificato di elementi se l'indice del primo elemento nell'intervallo è minore dell'indice dell'ultimo elemento nell'intervallo. Annulla la selezione nell'intervallo se l'indice del primo elemento è maggiore dell'ultimo. |
LB_SETANCHORINDEX | Imposta l'elemento che il mouse ha selezionato per ultimo su un elemento specificato. |
LB_SETCARETINDEX | Imposta il rettangolo del focus su un elemento specificato della casella di riepilogo. |
LB_SETCOLUMNWIDTH | Imposta la larghezza, in pixel, di tutte le colonne di una casella di riepilogo. |
LB_SETCOUNT | Imposta il numero di elementi in una casella di riepilogo. |
LB_SETCURSEL | Seleziona una voce specificata di casella di elenco. |
LB_SETHORIZONTALEXTENT | Imposta la larghezza scorrevole, espressa in pixel, di una casella di riepilogo. |
LB_SETITEMDATA | Associa un valore a una voce di casella di riepilogo. |
LB_SETITEMHEIGHT | Imposta l'altezza, in pixel, di un elemento o di elementi in una casella di riepilogo. |
LB_SETLOCALE | Imposta le impostazioni locali di una casella di riepilogo e restituisce l'identificatore delle impostazioni locali precedente. |
LB_SETSEL | Seleziona un elemento in una casella di riepilogo a selezione multipla. |
LB_SETTABSTOPS | Imposta i punti di tabulazione a quelli specificati in un array specificato. |
LB_SETTOPINDEX | Scorre la casella di riepilogo in modo che l'elemento specificato si trova nella parte superiore dell'intervallo visibile. |
Elaborazione dei messaggi finestra predefinita
La routine della finestra per la classe della finestra di riepilogo predefinita esegue l'elaborazione predefinita per tutti i messaggi che la casella di riepilogo non elabora. Quando la routine della casella di riepilogo restituisce FALSE per un messaggio, la routine della finestra predefinita controlla il messaggio ed esegue azioni predefinite, come illustrato nella tabella seguente.
Messaggio | Azione predefinita |
---|---|
WM_CHAR | Sposta la selezione sul primo elemento che inizia con il carattere digitato dall'utente. Se la casella di riepilogo ha lo stile LBS_OWNERDRAW, non viene eseguita alcuna azione. Più caratteri digitati entro un breve intervallo vengono considerati come un gruppo e viene selezionato il primo elemento che inizia con tale serie di caratteri. |
WM_CREATE | Crea una casella di elenco vuota. |
WM_DESTROY | Elimina definitivamente la casella di riepilogo e libera tutte le risorse usate. |
Passa il messaggio alla routine della finestra di dialogo o al processo della finestra padre. | |
WM_ENABLE | Se il controllo è visibile, invalida il rettangolo in modo che le stringhe possano essere disegnate in grigio. |
WM_ERASEBKGND | Cancella lo sfondo di una casella di riepilogo. Se la casella di riepilogo ha lo stile LBS_OWNERDRAW, lo sfondo non viene cancellato. |
WM_GETDLGCODE | Restituisce DLGC_WANTARROWS | DLGC_WANTCHARS, che indica che la procedura predefinita della casella di riepilogo gestisce i tasti freccia e i messaggi WM_CHAR. |
WM_GETFONT | Restituisce un handle al tipo di carattere corrente per la casella di lista. |
WM_HSCROLL | Scorre orizzontalmente la casella di riepilogo. |
WM_KEYDOWN | Elabora i tasti virtuali per lo scorrimento. La chiave virtuale è l'indice dell'elemento in cui spostare il cursore. La selezione non viene modificata. |
WM_KILLFOCUS | Disattiva il cursore e lo distrugge. Invia un codice di notifica LBN_KILLFOCUS al proprietario della casella di elenco. |
WM_LBUTTONDBLCLK | Tiene traccia del mouse nell'area cliente della lista. In questo modo l'utente può annullare una selezione se il pulsante del mouse viene rilasciato all'esterno dell'area client della casella di elenco. |
WM_LBUTTONDOWN | Monitora il mouse nell'area client dell'elenco. In questo modo l'utente può annullare la selezione se rilascia il pulsante del mouse al di fuori dell'area cliente della casella di riepilogo. |
WM_LBUTTONUP | Traccia il mouse nell'area cliente della casella di riepilogo. In questo modo l'utente può annullare una selezione se il pulsante del mouse viene rilasciato all'esterno dell'area client della casella di elenco. |
WM_MOUSEMOVE | Monitora il mouse nell'area client della casella di elenco. In questo modo l'utente può annullare una selezione se il pulsante del mouse viene rilasciato all'esterno dell'area client della casella di selezione. |
WM_PAINT | Esegue un'operazione di disegno sottoclassata utilizzando l'handle della casella di elenco per il contesto di dispositivo (DC). |
WM_SETFOCUS | Attiva il cursore e invia un codice di notifica LBN_SETFOCUS al proprietario della casella di riepilogo. |
WM_SETFONT | Imposta un nuovo tipo di carattere per la casella di riepilogo. |
WM_SETREDRAW | Imposta o cancella il flag di ridisegno in base al valore di wParam. |
WM_SIZE | Ridimensiona la casella di riepilogo per un numero intero di elementi. |
WM_VSCROLL | Scorre verticalmente la casella di riepilogo. |
La procedura predefinita della casella di riepilogo passa tutti gli altri messaggi a DefWindowProc per l'elaborazione predefinita.
Owner-Drawn caselle di riepilogo
Un'applicazione può creare una casella di riepilogo disegnata dal proprietario per assumere la responsabilità di disegnare gli elementi dell'elenco. La finestra padre o la finestra di dialogo di una casella di riepilogo disegnata dal proprietario (il relativo proprietario ) riceve WM_DRAWITEM messaggi quando è necessario disegnare una parte della casella di riepilogo. Una casella di riepilogo disegnata dal proprietario può elencare informazioni diverse da o oltre a stringhe di testo.
Il proprietario di una casella di elenco proprietario-disegnata deve gestire il messaggio WM_DRAWITEM. Questo messaggio viene inviato ogni volta che è necessario ridisegnare una parte della casella di riepilogo. Il proprietario potrebbe dover elaborare altri messaggi, a seconda degli stili specificati per la casella di riepilogo.
Un'applicazione può creare una casella di riepilogo disegnata dal proprietario specificando lo stile LBS_OWNERDRAWFIXED o LBS_OWNERDRAWVARIABLE. Se tutte le voci di elenco nella casella di riepilogo hanno la stessa altezza, ad esempio stringhe o icone, un'applicazione può usare lo stile LBS_OWNERDRAWFIXED. Se gli elementi dell'elenco hanno un'altezza variabile (ad esempio, bitmap di dimensioni diverse) un'applicazione può usare lo stile LBS_OWNERDRAWVARIABLE.
Il proprietario di una casella di riepilogo a disegno proprietario può elaborare un messaggio WM_MEASUREITEM per specificare le dimensioni degli elementi della lista. Se l'applicazione crea la casella di riepilogo utilizzando lo stile LBS_OWNERDRAWFIXED, il sistema invia il messaggio WM_MEASUREITEM una sola volta. Le dimensioni specificate dal proprietario vengono utilizzate per tutte le voci di elenco. Se viene utilizzato lo stile LBS_OWNERDRAWVARIABLE, il sistema invia un messaggio WM_MEASUREITEM per ogni voce di elenco aggiunta alla casella di riepilogo. Il proprietario può determinare o impostare l'altezza di una voce di elenco in qualsiasi momento usando rispettivamente i messaggi LB_GETITEMHEIGHT e LB_SETITEMHEIGHT.
Se le informazioni visualizzate in una casella di riepilogo disegnata dal proprietario includono testo, un'applicazione può tenere traccia del testo per ogni voce di elenco specificando lo stile LBS_HASSTRINGS. Le caselle di riepilogo con lo stile LBS_SORT vengono ordinate in base a questo testo. Se una casella di riepilogo è ordinata, ma non è dello stile LBS_HASSTRINGS, il proprietario deve elaborare il messaggio WM_COMPAREITEM.
In una casella di riepilogo disegnata dal proprietario, il proprietario deve tenere traccia delle voci di elenco che contengono informazioni diverse da o oltre al testo. Un modo pratico per eseguire questa operazione consiste nel salvare l'handle nelle informazioni come dati dell'elemento usando il messaggio LB_SETITEMDATA. Per liberare gli oggetti dati associati agli elementi in una casella di riepilogo, il proprietario può elaborare il messaggio WM_DELETEITEM.
Per un esempio di casella di riepilogo disegnata dal proprietario, vedere Come creare una casella di riepilogo Owner-Drawn.
Trascinare caselle di riepilogo
Una casella di riepilogo a trascinamento è un tipo speciale di casella di riepilogo che consente all'utente di trascinare gli elementi da una posizione a un'altra. Un'applicazione può usare una casella di elenco trascinabile per visualizzare le stringhe in una determinata sequenza e consentire all'utente di modificare la sequenza trascinando gli elementi nella posizione.
Creazione di caselle elenco trascinabili
Le caselle di riepilogo di trascinamento hanno gli stessi stili di finestra ed elaborano gli stessi messaggi delle caselle di riepilogo standard. Per creare una casella di riepilogo con trascinamento, creare prima una casella di riepilogo standard e quindi chiamare la funzione MakeDragList. Per convertire una casella di riepilogo in una finestra di dialogo in una casella di riepilogo di trascinamento, è possibile chiamare MakeDragList durante l'elaborazione del messaggio WM_INITDIALOG.
Messaggi della casella di riepilogo trascinabile
Una casella di riepilogo di trascinamento notifica alla finestra padre gli eventi di trascinamento inviando un messaggio della lista di trascinamento. La finestra padre deve elaborare il messaggio della lista di trascinamento.
La casella di trascinamento registra questo messaggio quando viene chiamata la funzione MakeDragList. Per recuperare l'identificatore di messaggio (valore numerico) del messaggio dell'elenco di trascinamento, chiamare la funzioneRegisterWindowMessagee specificare il valore DRAGLISTMSGSTRING.
Il parametro wParam del messaggio di elenco di trascinamento è l'identificatore del controllo per la casella di elenco di trascinamento. Il parametro lParam è l'indirizzo di una struttura DRAGLISTINFO , che contiene il codice di notifica per l'evento di trascinamento e altre informazioni. Il valore restituito del messaggio dipende dalla notifica.
Codici di notifica della casella di elenco trascinabile
Il codice di notifica della lista di trascinamento, identificato dal membro uNotification della struttura DRAGLISTINFO inclusa nel messaggio della lista di trascinamento, può essere DL_BEGINDRAG, DL_DRAGGING, DL_CANCELDRAGo DL_DROPPED.
Il codice di notifica DL_BEGINDRAG viene inviato quando il cursore si trova su una voce di elenco e l'utente fa clic sul pulsante sinistro del mouse. La finestra padre può restituire il TRUE per avviare l'operazione di trascinamento o il FALSE per impedire il trascinamento. In questo modo, la finestra padre può abilitare il trascinamento per alcuni elementi dell'elenco e disabilitarlo per altri. È possibile determinare quale voce di elenco si trova nella posizione specificata usando la funzioneLBItemFromPt.
Se il trascinamento è attivo, il codice di notifica DL_DRAGGING viene inviato ogni volta che il mouse viene spostato o a intervalli regolari se il mouse non viene spostato. La finestra padre deve prima determinare l'elemento dell'elenco sotto il cursore usando LBItemFromPt e quindi disegnare l'icona di inserimento usando la funzione DrawInsert. Specificando TRUE per il parametro bAutoScroll di LBItemFromPt, è possibile far scorrere la casella di riepilogo di una riga se il cursore è sopra o sotto l'area client. Il valore restituito per questa notifica specifica il tipo di cursore del mouse da impostare nella casella elenco per il trascinamento.
Il codice di notifica DL_CANCELDRAG viene inviato se l'utente annulla un'operazione di trascinamento facendo clic sul pulsante destro del mouse o premendo ESC. Il codice di notifica DL_DROPPED viene inviato se l'utente completa un'operazione di trascinamento rilasciando il pulsante sinistro del mouse, anche se il cursore non si trova su una voce di elenco. La lista di trascinamento rilascia l'acquisizione del mouse prima di inviare una delle notifiche. Il valore di ritorno di queste due notifiche viene ignorato. Trascina elenco