Informazioni sulle caselle combinate

Una casella combinata combina una casella di modifica o un testo statico e un elenco.

Questo argomento include le sezioni seguenti.

Tipi e stili di caselle combinate

Una casella combinata è costituita da un elenco e da un campo di selezione. L'elenco presenta le opzioni che un utente può selezionare e il campo di selezione visualizza la selezione corrente. Se il campo di selezione è un controllo di modifica, l'utente può immettere informazioni non disponibili nell'elenco; in caso contrario, l'utente può selezionare solo gli elementi nell'elenco.

La libreria dei controlli comuni include tre stili principali della casella combinata, come illustrato nella tabella seguente.

Tipo casella combinata Costante di stile Descrizione
Semplice CBS_SIMPLE Visualizza sempre l'elenco e mostra l'elemento selezionato in un controllo di modifica.
Elenco a discesa CBS_DROPDOWN Visualizza l'elenco quando si fa clic sull'icona e mostra l'elemento selezionato in un controllo di modifica.
Elenco a discesa (elenco a discesa) CBS_DROPDOWNLIST Visualizza l'elenco quando si fa clic sull'icona e mostra l'elemento selezionato in un controllo statico.

 

Le schermate seguenti mostrano ognuno i tre tipi di casella combinata come potrebbero essere visualizzati in Windows Vista. Nella prima schermata l'utente ha selezionato un elemento nella casella combinata semplice. L'utente può anche digitare un nuovo valore nella casella di modifica di questo controllo. L'elenco è stato ridimensionato nell'editor di risorse di Microsoft Visual Studio ed è sufficiente per contenere due elementi.

screen shot showing an item selected in a simple combo box

Nella seconda schermata l'utente ha digitato nuovo testo nel controllo di modifica della casella combinata a discesa. L'utente potrebbe anche aver selezionato un elemento esistente. La casella di riepilogo si espande per contenere il maggior numero possibile di elementi.

screen shot showing text typed into a drop-down combo box

Nella terza schermata l'utente ha aperto la casella combinata elenco a discesa. La casella di riepilogo si espande per contenere il maggior numero possibile di elementi. L'utente non può immettere nuovo testo.

screen shot showing an item selected in a drop-down list combo box

Esistono anche diversi stili di caselle combinate che definiscono proprietà specifiche. Gli stili casella combinata definiscono proprietà specifiche di una casella combinata. È possibile combinare gli stili; tuttavia, alcuni stili si applicano solo a determinati tipi di caselle combinate. Per una tabella di stili casella combinata, vedere Stili casella combinata.

Nota

Per usare gli stili di visualizzazione con caselle combinate, 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.

 

Elenco casella combinata

L'elenco è la parte di una casella combinata che visualizza gli elementi che un utente può selezionare. In genere, un'applicazione inizializza il contenuto dell'elenco quando crea una casella combinata. Qualsiasi voce di elenco selezionata dall'utente è la selezione corrente. Non è possibile selezionare più elementi. Nelle caselle combinate semplici e a discesa, l'utente può digitare nel campo di selezione anziché selezionare una voce di elenco. In questi casi, non esiste alcuna selezione corrente ed è responsabilità dell'applicazione aggiungere l'elemento all'elenco e impostarlo sulla selezione corrente, se appropriato.

In questa sezione vengono illustrati gli argomenti seguenti:

Selezione corrente

La selezione corrente è una voce di elenco selezionata dall'utente; il testo selezionato viene visualizzato nel campo di selezione della casella combinata. Tuttavia, nel caso di una casella combinata semplice o di una casella combinata a discesa, la selezione corrente è solo una forma di possibile input utente in una casella combinata. L'utente può anche digitare testo nel campo di selezione.

La selezione corrente è identificata dall'indice in base zero dell'elemento di elenco selezionato. Un'applicazione può impostarla e recuperarla in qualsiasi momento. La routine della finestra o della finestra di dialogo padre riceve una notifica quando l'utente modifica la selezione corrente per una casella combinata. La finestra padre o la finestra di dialogo non viene notificata quando l'applicazione modifica la selezione.

Quando viene creata una casella combinata, non è presente alcuna selezione corrente. Questo vale anche per una casella combinata semplice o a discesa, se l'utente ha modificato il contenuto del campo di selezione. Per impostare la selezione corrente, un'applicazione invia il messaggio CB_edizione Standard TCUR edizione Standard L alla casella combinata. Un'applicazione può anche usare il messaggio CB_edizione Standard LECTSTRING per impostare la selezione corrente su un elemento di elenco la cui stringa inizia con una stringa specificata. Per determinare la selezione corrente, un'applicazione invia il messaggio CB_GETCURedizione Standard L alla casella combinata. Se non è presente alcuna selezione corrente, questo messaggio restituisce CB_ERR.

Quando l'utente modifica la selezione corrente in una casella combinata, la routine della finestra padre o della finestra di dialogo riceve un messaggio WM_COMMAND con il codice di notifica CBN_edizione Standard LCHANGE nella parola alta del parametro wParam. Questo codice di notifica non viene inviato quando la selezione corrente viene impostata usando il messaggio CB_edizione Standard TCUR edizione Standard L.

Una casella di riepilogo a discesa o una casella di riepilogo a discesa invia il codice di notifica CBN_CLOedizione Standard UP alla finestra padre o alla routine della finestra di dialogo quando l'elenco a discesa si chiude. Se l'utente ha modificato la selezione corrente, la casella combinata invia anche il codice di notifica CBN_edizione Standard LCHANGE alla chiusura dell'elenco a discesa. Per eseguire un processo specifico ogni volta che l'utente seleziona una voce di elenco, è possibile gestire il codice di notifica CBN_edizione Standard LCHANGE o CBN_CLOedizione Standard UP. In genere, è necessario attendere il codice di notifica CBN_CLOedizione Standard UP prima di elaborare una modifica nella selezione corrente. Ciò può essere particolarmente importante se è necessaria una notevole quantità di elaborazione.

Un'applicazione può anche elaborare i codici di notifica CBN_edizione Standard LENDOK e CBN_edizione Standard LENDCANCEL. Il sistema invia CBN_edizione Standard LENDOK quando l'utente seleziona una voce di elenco o seleziona un elemento e quindi chiude l'elenco. Ciò indica che l'utente è terminato e che la selezione deve essere elaborata. CBN_edizione Standard LENDCANCEL viene inviato quando l'utente seleziona un elemento, ma seleziona un altro controllo, preme ESC mentre l'elenco a discesa è aperto o chiude la finestra di dialogo. Ciò indica che la selezione dell'utente deve essere ignorata. CBN_edizione Standard LENDOK viene inviato prima di ogni messaggio CBN_edizione Standard LCHANGE.

In una casella combinata semplice, il sistema invia il codice di notifica CBN_DBLCLK quando l'utente fa doppio clic su una voce di elenco. In una casella combinata o in un elenco a discesa, un singolo clic nasconde l'elenco, quindi non è possibile fare doppio clic su un elemento.

Alcune notifiche e messaggi si applicano solo alle caselle combinate contenenti elenchi a discesa. Quando un elenco a discesa è aperto o chiuso, la finestra padre di una casella combinata riceve una notifica sotto forma di messaggio WM_COMMAND. Se l'elenco viene aperto, la parola dell'ordine elevato di wParam è CBN_DROPDOWN. Se l'elenco viene chiuso, viene CBN_CLOedizione Standard UP.

Un'applicazione può aprire l'elenco di una casella combinata a discesa o di una casella di riepilogo a discesa usando il messaggio CB_SHOWDROPDOWN. Può determinare se l'elenco è aperto utilizzando il messaggio CB_GETDROPPEDSTATE e può determinare le coordinate di un elenco a discesa utilizzando il messaggio CB_GETDROPPEDCONTROLRECT. Un'applicazione può anche aumentare la larghezza di un elenco a discesa usando il messaggio CB_edizione Standard TDROPPEDWIDTH.

Contenuto elenco

Quando un'applicazione crea una casella combinata, in genere inizializza la casella combinata aggiungendo uno o più elementi all'elenco. In un secondo momento, un'applicazione può aggiungere o eliminare voci di elenco, reinizializzare l'elenco o recuperare le informazioni sugli elementi da esso.

Un'applicazione aggiunge voci di elenco a una casella combinata inviando il messaggio CB_ADDSTRING. L'elemento specificato viene aggiunto alla fine dell'elenco o, in una casella combinata ordinata, nella posizione ordinata corretta in base alla stringa dell'elemento. In una casella combinata non autorizzata, un'applicazione può usare il messaggio CB_INedizione Standard RTSTRING per inserire un elemento in una posizione specifica. Dopo l'aggiunta, una voce di elenco viene identificata dalla relativa posizione.

Usando il messaggio CB_FINDSTRING o CB_FINDSTRINGEXACT, un'applicazione può determinare la posizione di una voce di elenco. CB_FINDSTRING trova un elemento la cui stringa inizia con la stringa specificata. CB_FINDSTRINGEXACT trova un elemento la cui stringa corrisponde esattamente alla stringa. Nessuno dei due messaggi fa distinzione tra maiuscole e minuscole.

Un'applicazione può rimuovere una voce di elenco usando il messaggio di CB_DELETESTRING . Se un'applicazione deve reinizializzare l'elenco di caselle combinate, può prima cancellarne l'intero contenuto usando il messaggio CB_REedizione Standard TCONTENT. Quando si aggiungono più elementi all'elenco dopo che è già stata visualizzata una casella combinata, un'applicazione può cancellare il flag di ridisegno per impedire che la casella combinata venga aggiornata dopo l'aggiunta di ogni elemento. Per altre informazioni sulla ridisegnazione, vedere la descrizione del messaggio WM_edizione Standard TREDRAW.

Per recuperare la stringa associata a una voce di elenco, un'applicazione può usare il messaggio CB_GETLBTEXT. La stringa dell'elemento viene copiata nel buffer specificato dall'applicazione. Per assicurarsi che il buffer sia sufficientemente grande da ricevere la stringa, l'applicazione può prima usare il messaggio CB_GETLBTEXTLEN per determinare la lunghezza della stringa. Per ottenere il numero di voci di elenco in una casella combinata, un'applicazione può usare il messaggio CB_GETCOUNT.

Modifica campi selezione controllo

Un'applicazione può recuperare o impostare il contenuto del campo di selezione e può determinare o impostare la selezione di modifica. L'applicazione può anche limitare la quantità di testo che un utente può digitare nel campo di selezione. Quando il contenuto del campo di selezione cambia, il sistema invia messaggi di notifica alla finestra padre o alla routine della finestra di dialogo.

Per recuperare il contenuto del campo di selezione, un'applicazione può inviare il messaggio WM_GETTEXT alla casella combinata. Per impostare il contenuto del campo di selezione di una casella combinata semplice o a discesa, un'applicazione può inviare il messaggio WM_edizione Standard TTEXT alla casella combinata.

La selezione di modifica è l'intervallo di testo selezionato, se presente, nel campo di selezione di una casella combinata semplice o a discesa. Un'applicazione può determinare le posizioni dei caratteri iniziali e finali della selezione corrente usando il messaggio CB_GETEDITedizione Standard L. Può anche selezionare i caratteri nella selezione di modifica usando il messaggio CB_edizione Standard TEDIT edizione Standard L.

Inizialmente, la quantità di testo che l'utente può digitare nel campo di selezione è limitata dalle dimensioni del campo di selezione. Tuttavia, se la casella combinata ha lo stile CBS_AUTOHSCROLL , il testo può continuare oltre le dimensioni del campo di selezione. Un'applicazione può usare il messaggio CB_LIMITTEXT per limitare la quantità di testo che un utente può digitare nel campo di selezione, indipendentemente dal fatto che il controllo abbia lo stile CBS_AUTOHSCROLL.

Quando l'utente modifica il contenuto del campo di selezione, la routine della finestra padre o della finestra di dialogo riceve messaggi di notifica. Il codice di notifica CBN_EDITUPDATE viene inviato per primo, a indicare che il testo nel campo di selezione è stato modificato. Dopo la visualizzazione del testo modificato, il sistema invia CBN_EDITCHANGE. Quando il contenuto del campo di selezione cambia come risultato di una voce di elenco selezionata, questi messaggi non vengono inviati.

Caselle combinate disegnate dal proprietario

Un'applicazione può creare una casella combinata disegnata dal proprietario per assumere la responsabilità di disegnare gli elementi dell'elenco. La finestra padre di una casella combinata disegnata dal proprietario (proprietario) riceve WM_DRAWITEM messaggi quando è necessario disegnare una parte della casella combinata. Una casella combinata disegnata dal proprietario può elencare informazioni diverse da o oltre a stringhe di testo. Le caselle combinate disegnate dal proprietario possono essere di qualsiasi tipo. Tuttavia, il controllo di modifica in una casella combinata semplice o a discesa può visualizzare solo testo, mentre il proprietario disegna il campo di selezione in una casella di riepilogo a discesa.

Il proprietario di una casella combinata disegnata dal proprietario deve elaborare il messaggio di WM_DRAWITEM . Questo messaggio viene inviato ogni volta che è necessario ridisegnare una parte della casella combinata. Il proprietario potrebbe dover elaborare altri messaggi, a seconda degli stili specificati per la casella combinata.

Un'applicazione può creare una casella combinata disegnata dal proprietario specificando lo stile CBS_OWNERDRAWFIXED o CBS_OWNERDRAWVARIABLE. Se tutte le voci di elenco nella casella combinata hanno la stessa altezza, ad esempio stringhe o icone, un'applicazione può usare lo stile CBS_OWNERDRAWFIXED . Se gli elementi dell'elenco hanno un'altezza variabile, ad esempio bitmap di dimensioni diverse, un'applicazione può usare lo stile CBS_OWNERDRAWVARIABLE .

Il proprietario di una casella combinata disegnata dal proprietario può elaborare un messaggio WM_MEASUREITEM per specificare le dimensioni delle voci di elenco nella casella combinata. Se l'applicazione crea la casella combinata utilizzando lo stile CBS_OWNERDRAWFIXED, il sistema invia il messaggio WM_MEASUREITEM una sola volta. Le dimensioni specificate dal proprietario vengono utilizzate per tutti gli elementi dell'elenco. Se viene utilizzato lo stile CBS_OWNERDRAWVARIABLE, il sistema invia un messaggio WM_MEASUREITEM per ogni elemento di elenco aggiunto alla casella combinata. Il proprietario può determinare o impostare l'altezza di una voce di elenco in qualsiasi momento usando rispettivamente i messaggi CB_GETITEMHEIGHT e CB_edizione Standard TITEMHEIGHT.

Se le informazioni visualizzate in una casella combinata disegnata dal proprietario includono testo, un'applicazione può tenere traccia del testo per ogni voce di elenco specificando lo stile CBS_HASSTRINGS. Le caselle combinate con lo stile CBS_SORT vengono ordinate in base a questo testo. Se una casella combinata è ordinata e non dello stile di CBS_HASSTRINGS, il proprietario deve elaborare il messaggio di WM_COMPAREITEM.

In una casella combinata disegnata dal proprietario, il proprietario deve tenere traccia degli elementi dell'elenco contenenti 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. Per liberare gli oggetti dati associati agli elementi in una casella combinata, il proprietario può elaborare il messaggio di WM_DELETEITEM .

Caselle combinate sottoclassate

La sottoclasse è una routine che consente a un'applicazione di intercettare ed elaborare i messaggi inviati o inviati a una finestra. Usando la sottoclasse, un'applicazione può sostituire la propria elaborazione per determinati messaggi, lasciando al contempo la maggior parte dell'elaborazione dei messaggi alla routine della finestra definita dalla classe.

Quando il sistema operativo crea una finestra, le informazioni vengono salvate in una struttura di dati interna che include un puntatore alla routine della finestra. Per sottoclassare una finestra, un'applicazione chiama la funzione SetClassLong per sostituire il puntatore a tale routine con un puntatore a una routine sottoclasse definita dall'applicazione. Successivamente, tutti i messaggi alla finestra vengono inviati alla routine della sottoclasse. Questa procedura usa quindi la funzione CallWindowProc per passare messaggi non elaborati alla routine della finestra originale. Per una descrizione dell'elaborazione dei messaggi eseguita dalla routine della finestra della classe COMBOBOX, vedere Comportamento predefinito della casella combinata.

Quando la casella combinata si trova all'esterno di una finestra di dialogo, un'applicazione non può elaborare le chiavi TAB, INVIO e ESC a meno che non usi una routine di sottoclasse. Quando una casella combinata semplice o a discesa riceve lo stato attivo per l'input, imposta immediatamente lo stato attivo sul controllo di modifica figlio. Pertanto, un'applicazione deve sottoclassare il controllo di modifica per intercettare l'input della tastiera per una casella combinata semplice o a discesa. Per un esempio, vedere Sottoclassare una casella combinata.

Se una routine sottoclasse elabora il messaggio di WM_PAINT , deve utilizzare la funzione BeginPaint per prepararsi alla pittura. Prima di chiamare la funzione EndPaint, passa l'handle del contesto di dispositivo (DC) come parametro wParam per la routine window. Se endPaint viene chiamato per primo, la routine della finestra di classe non esegue alcun disegno perché EndPaint convalida l'intera finestra.

Una tecnica correlata alla sottoclasse è la superclasse. Una superclasse è simile a qualsiasi altra classe, ad eccezione del fatto che la routine della finestra non chiama DefWindowProc per gestire i messaggi non elaborati. Passa invece messaggi non elaborati alla routine finestra per la classe finestra padre. Seguire le linee guida in Procedure finestra per evitare problemi che possono verificarsi con la sottoclasse e la superclasse.