Considerazioni sulla programmazione delle finestre di dialogo
Questa panoramica illustra alcune considerazioni sulla programmazione relative alle finestre di dialogo.
La panoramica include gli argomenti seguenti.
- Procedure della finestra di dialogo
- Interfaccia della tastiera della finestra di dialogo
- Finestra di dialogo Impostazioni
- Finestre di dialogo personalizzate
Procedure della finestra di dialogo
Una routine della finestra di dialogo è simile a una routine della finestra in cui il sistema invia messaggi alla procedura quando contiene informazioni da assegnare o attività da eseguire. A differenza di una routine di finestra, una routine della finestra di dialogo non chiama mai la funzione DefWindowProc. Restituisce invece TRUE se elabora un messaggio o FAL edizione Standard in caso contrario.
Ogni routine della finestra di dialogo ha il formato seguente:
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
// Place message cases here.
default:
return FALSE;
}
}
I parametri della routine servono allo stesso scopo di una routine di finestra, con il parametro hwndDlg che riceve l'handle di finestra della finestra di dialogo.
La maggior parte delle procedure della finestra di dialogo elabora il messaggio WM_INITDIALOG e i messaggi WM_COMMAND inviati dai controlli, ma elaborano alcuni se altri messaggi. Se una routine di finestra di dialogo non elabora un messaggio, deve restituire FAL edizione Standard per indirizzare il sistema a elaborare i messaggi internamente. L'unica eccezione a questa regola è il messaggio di WM_INITDIALOG . La procedura della finestra di dialogo deve restituire TRUE per indirizzare il sistema a elaborare ulteriormente il messaggio di WM_INITDIALOG . In ogni caso, la procedura non deve chiamare DefWindowProc.
- Messaggio WM_INITDIALOG
- Messaggio WM_COMMAND
- Messaggio WM_PARENTNOTIFY
- Messaggi a colori di controllo
- Elaborazione predefinita dei messaggi nella finestra di dialogo
Messaggio WM_INITDIALOG
Il sistema non invia un messaggio WM_CREATE alla routine della finestra di dialogo. Invia invece un messaggio WM_INITDIALOG quando crea la finestra di dialogo e tutti i relativi controlli, ma prima di visualizzare la finestra di dialogo. La procedura deve eseguire qualsiasi inizializzazione necessaria per garantire che nella finestra di dialogo vengano visualizzate le impostazioni correnti associate all'attività. Ad esempio, quando una finestra di dialogo contiene un controllo per visualizzare l'unità e la directory correnti, la routine deve determinare l'unità e la directory correnti e impostare il controllo su tale valore.
La procedura può inizializzare i controlli usando funzioni come SetDlgItemText e CheckDlgButton. Poiché i controlli sono finestre, la procedura può anche modificarle usando funzioni di gestione delle finestre, ad esempio EnableWindow e SetFocus. La procedura può recuperare l'handle della finestra in un controllo usando la funzione GetDlgItem.
La procedura della finestra di dialogo può modificare il contenuto, lo stato e la posizione di qualsiasi controllo in base alle esigenze. Ad esempio, in una finestra di dialogo contenente una casella di riepilogo di nomi file e un pulsante Apri, la procedura può disabilitare il pulsante Apri fino a quando l'utente non seleziona un file dall'elenco. In questo esempio, il modello della finestra di dialogo specifica lo stile WS_DISABLED per il pulsante Apri e il sistema disabilita automaticamente il pulsante durante la creazione. Quando la routine della finestra di dialogo riceve un messaggio di notifica dalla casella di riepilogo che indica che l'utente ha selezionato un file, la procedura chiama la funzione EnableWindow per abilitare il pulsante Apri.
Per visualizzare un'icona personalizzata nella barra didascalia della finestra di dialogo, il gestore WM_INITDIALOG può inviare il messaggio WM_edizione Standard TICON alla finestra di dialogo.
Se l'applicazione crea la finestra di dialogo usando una delle funzioni DialogBoxParam, DialogBoxIndirectParam, CreateDialogParam o CreateDialogIndirectParam, il parametro lParam per il messaggio WM_INITDIALOG contiene il parametro aggiuntivo passato alla funzione. Le applicazioni usano in genere questo parametro aggiuntivo per passare un puntatore a informazioni aggiuntive di inizializzazione alla routine della finestra di dialogo, ma la routine della finestra di dialogo deve determinare il significato del parametro. Se l'applicazione usa un'altra funzione per creare la finestra di dialogo, il sistema imposta il parametro lParam su NULL.
Prima di tornare dal messaggio di WM_INITDIALOG , la routine deve determinare se deve impostare lo stato attivo dell'input su un controllo specificato. Se la routine della finestra di dialogo restituisce TRUE, il sistema imposta automaticamente lo stato attivo sull'input sul controllo il cui handle di finestra si trova nel parametro wParam . Se il controllo che riceve lo stato attivo predefinito non è appropriato, può impostare lo stato attivo sul controllo appropriato usando la funzione SetFocus. Se la procedura imposta lo stato attivo di input, deve restituire FAL edizione Standard per impedire al sistema di impostare lo stato attivo predefinito. Il controllo che riceve lo stato attivo di input predefinito è sempre il primo controllo specificato nel modello visibile, non disabilitato e ha lo stile WS_TABSTOP . Se non esiste alcun controllo di questo tipo, il sistema imposta lo stato attivo di input predefinito sul primo controllo del modello.
Messaggio WM_COMMAND
Un controllo può inviare un messaggio WM_COMMAND alla routine della finestra di dialogo quando l'utente esegue un'azione nel controllo. Questi messaggi, chiamati messaggi di notifica, informano la procedura di input dell'utente e consentono di eseguire risposte appropriate.
Tutti i controlli predefiniti, ad eccezione dei controlli statici, inviano messaggi di notifica per le azioni utente selezionate. Ad esempio, un pulsante di push invia il messaggio di notifica BN_CLICKED ogni volta che l'utente fa clic sul pulsante. In tutti i casi, la parola in ordine basso del parametro wParam contiene l'identificatore del controllo, la parola di ordine elevato di wParam contiene il codice di notifica e il parametro lParam contiene l'handle della finestra di controllo.
La procedura della finestra di dialogo deve monitorare ed elaborare i messaggi di notifica. In particolare, la procedura deve elaborare i messaggi con identificatori IDOK o IDCANCEL; questi messaggi rappresentano una richiesta da parte dell'utente per chiudere la finestra di dialogo. La procedura deve chiudere la finestra di dialogo utilizzando la funzione EndDialog per le finestre di dialogo modali e la funzione DestroyWindow per le finestre di dialogo senza modalità.
Il sistema invia inoltre WM_COMMAND messaggi alla routine della finestra di dialogo se la finestra di dialogo include un menu, ad esempio il menu della finestra, e l'utente fa clic su una voce di menu. In particolare, il sistema invia un messaggio WM_COMMAND con il parametro wParam impostato su IDCANCEL ogni volta che l'utente fa clic su Chiudi nel menu della finestra della finestra di dialogo. Il messaggio è quasi identico al messaggio di notifica inviato dal pulsante Annulla e deve essere elaborato esattamente nello stesso modo.
Messaggio WM_PARENTNOTIFY
Un controllo invia un messaggio WM_PARENTNOTIFY ogni volta che l'utente preme un pulsante del mouse mentre punta al controllo. Alcune applicazioni interpretano questo messaggio come segnale per eseguire un'azione correlata al controllo, ad esempio la visualizzazione di una riga di testo che descrive lo scopo del controllo.
Il sistema invia anche WM_PARENTNOTIFY messaggi quando crea ed elimina definitivamente una finestra, ma non per i controlli creati da un modello di finestra di dialogo. Il sistema impedisce questi messaggi specificando lo stile WS_EX_NOPARENTNOTIFY durante la creazione dei controlli. Un'applicazione non può eseguire l'override di questo comportamento predefinito a meno che non crei controlli personalizzati per la finestra di dialogo.
Messaggi a colori di controllo
I controlli e il sistema possono inviare messaggi a colori di controllo quando desiderano che la routine della finestra di dialogo dipinga lo sfondo di un controllo o di un'altra finestra utilizzando un pennello e colori specifici. Ciò può essere utile quando le applicazioni eseguono l'override dei colori predefiniti usati nelle finestre di dialogo e nei relativi controlli. Di seguito sono riportati i messaggi a colori di controllo, che hanno sostituito il messaggio WM_CTLCOLOR .
- WM_CTLCOLORBTN
- WM_CTLCOLORDLG
- WM_CTLCOLOREDIT
- WM_CTLCOLORLISTBOX
- WM_CTLCOLORSCROLLBAR
- WM_CTLCOLORSTATIC
Un controllo invia un messaggio a colori di controllo alla routine della finestra di dialogo appena prima di disegnare il proprio sfondo. Il messaggio consente alla routine di specificare il pennello da utilizzare e di impostare i colori di sfondo e di primo piano. La routine specifica un pennello restituendo l'handle del pennello. Per impostare i colori di sfondo e di primo piano, la procedura usa le funzioni SetBkColor e SetTextColor con il contesto di dispositivo di visualizzazione del controllo. Il messaggio di colore del controllo passa un handle al contesto del dispositivo di visualizzazione alla routine nel parametro wParam del messaggio.
Il sistema invia un messaggio WM_CTLCOLORDLG alla routine della finestra di dialogo se la routine non elabora il messaggio WM_ERAedizione Standard BKGND. La classe predefinita della finestra di dialogo non dispone di un pennello di sfondo della classe, pertanto questo messaggio consente alla routine di definire il proprio sfondo senza dover includere il codice per eseguire il lavoro.
In ogni caso, quando una routine della finestra di dialogo non elabora un messaggio di colore del controllo, il sistema usa un pennello con il colore di finestra predefinito per disegnare lo sfondo per tutti i controlli e le finestre, ad eccezione delle barre di scorrimento. Un'applicazione può recuperare il colore predefinito della finestra passando il valore COLOR_WINDOW alla funzione GetSysColor . Mentre lo sfondo viene disegnato, il colore di primo piano per il contesto del dispositivo di visualizzazione è impostato sul colore di testo predefinito (COLOR_WINDOWTEXT). Per le barre di scorrimento, il sistema usa un pennello con il colore predefinito della barra di scorrimento (COLOR_SCROLLBAR). In questo caso, i colori di sfondo e di primo piano per il contesto del dispositivo di visualizzazione sono impostati rispettivamente su bianco e nero.
Elaborazione predefinita dei messaggi nella finestra di dialogo
La routine della finestra per la classe predefinita della finestra di dialogo esegue l'elaborazione predefinita per tutti i messaggi non elaborati dalla routine della finestra di dialogo. Quando la routine della finestra di dialogo restituisce FAL edizione Standard per qualsiasi messaggio, la routine della finestra predefinita controlla i messaggi ed esegue le azioni predefinite seguenti:
Message | Azione predefinita |
---|---|
DM_GETDEFID | È possibile inviare questo messaggio a una finestra di dialogo. La finestra di dialogo restituisce l'identificatore del controllo del pulsante di pressione predefinito, se la finestra di dialogo ne ha una; in caso contrario, restituisce zero. |
DM_REPOSITION | È possibile inviare questo messaggio a una finestra di dialogo di primo livello. La finestra di dialogo si riposiziona in modo che si adatti all'interno dell'area desktop. |
DM_edizione Standard TDEFID | È possibile inviare questo messaggio a una finestra di dialogo. La finestra di dialogo imposta il pulsante di pressione predefinito sul controllo specificato dall'identificatore del controllo nel parametro wParam . |
WM_ACTIVATE | Ripristina lo stato attivo dell'input sul controllo identificato dall'handle salvato in precedenza se la finestra di dialogo è attivata. In caso contrario, la routine salva l'handle nel controllo con lo stato attivo dell'input. |
WM_CHARTOITEM | Restituisce zero. |
WM_CLOedizione Standard | Invia il messaggio di notifica BN_CLICKED alla finestra di dialogo, specificando IDCANCEL come identificatore del controllo. Se nella finestra di dialogo è presente un identificatore di controllo IDCANCEL e il controllo è attualmente disabilitato, la procedura genera un avviso e non pubblica il messaggio. |
WM_COMPAREITEM | Restituisce zero. |
WM_ERAedizione Standard BKGND | Riempie l'area client della finestra di dialogo usando il pennello restituito dal messaggio WM_CTLCOLORDLG o con il colore predefinito della finestra. |
WM_GETFONT | Restituisce un handle al tipo di carattere della finestra di dialogo definito dall'applicazione. |
WM_INITDIALOG | Restituisce zero. |
WM_LBUTTONDOWN | Invia un messaggio CB_SHOWDROPDOWN alla casella combinata con lo stato attivo dell'input, indirizzando il controllo a nascondere la relativa casella di riepilogo a discesa. La procedura chiama DefWindowProc per completare l'azione predefinita. |
WM_NCDESTROY | Rilascia la memoria globale allocata per i controlli di modifica nella finestra di dialogo (si applica alle finestre di dialogo che specificano lo stile DS_LOCALEDIT) e libera qualsiasi tipo di carattere definito dall'applicazione (si applica alle finestre di dialogo che specificano lo stile DS_edizione Standard TFONT o DS_SHELLFONT). La procedura chiama la funzione DefWindowProc per completare l'azione predefinita. |
WM_NCLBUTTONDOWN | Invia un messaggio CB_SHOWDROPDOWN alla casella combinata con lo stato attivo dell'input, indirizzando il controllo a nascondere la relativa casella di riepilogo a discesa. La procedura chiama DefWindowProc per completare l'azione predefinita. |
WM_NEXTDLGCTL | Imposta lo stato attivo sull'input sul controllo successivo o precedente nella finestra di dialogo, sul controllo identificato dall'handle nel parametro wParam o sul primo controllo della finestra di dialogo visibile, non disabilitato e ha lo stile WS_TABSTOP . La routine ignora questo messaggio se la finestra corrente con lo stato attivo di input non è un controllo . |
WM_edizione Standard TFOCUS | Imposta lo stato attivo dell'input sul controllo identificato da un handle della finestra di controllo salvato in precedenza. Se tale handle non esiste, la routine imposta lo stato attivo di input sul primo controllo nel modello della finestra di dialogo visibile, non disabilitato e ha lo stile WS_TABSTOP. Se non esiste alcun controllo di questo tipo, la routine imposta lo stato attivo sull'input sul primo controllo nel modello. |
WM_SHOWWINDOW | Salva un handle nel controllo con lo stato attivo di input se la finestra di dialogo è nascosta, quindi chiama DefWindowProc per completare l'azione predefinita. |
WM_SYSCOMMAND | Salva un handle nel controllo con lo stato attivo per l'input se la finestra di dialogo viene ridotta a icona, quindi chiama DefWindowProc per completare l'azione predefinita. |
WM_VKEYTOITEM | Restituisce zero. |
La procedura della finestra predefinita passa tutti gli altri messaggi a DefWindowProc per l'elaborazione predefinita.
Interfaccia della tastiera della finestra di dialogo
Il sistema fornisce un'interfaccia speciale della tastiera per le finestre di dialogo che esegue un'elaborazione speciale per diversi tasti. L'interfaccia genera messaggi che corrispondono a determinati pulsanti nella finestra di dialogo o modifica lo stato attivo di input da un controllo a un altro. Di seguito sono riportate le chiavi usate in questa interfaccia e le rispettive azioni.
Key | Azione |
---|---|
ALT+mnemonico | Sposta lo stato attivo dell'input sul primo controllo (con lo stile WS_TABSTOP ) dopo il controllo statico contenente la mnemonica specificata. |
DOWN | Sposta lo stato attivo dell'input sul controllo successivo nel gruppo. |
INVIO | Invia un messaggio WM_COMMAND alla routine della finestra di dialogo. Il parametro wParam è impostato su IDOK o sull'identificatore di controllo del pulsante di pressione predefinito. |
ESC | Invia un messaggio WM_COMMAND alla routine della finestra di dialogo. Il parametro wParam è impostato su IDCANCEL. |
LEFT | Sposta lo stato attivo dell'input sul controllo precedente nel gruppo. |
Mnemonico | Sposta lo stato attivo dell'input sul primo controllo (con lo stile WS_TABSTOP ) dopo il controllo statico contenente la mnemonica specificata. |
RIGHT | Sposta lo stato attivo dell'input sul controllo successivo nel gruppo. |
MAIUSC+TAB | Sposta lo stato attivo dell'input sul controllo precedente con lo stile WS_TABSTOP. |
TAB | Sposta lo stato attivo dell'input sul controllo successivo con lo stile WS_TABSTOP. |
UP | Sposta lo stato attivo dell'input sul controllo precedente nel gruppo. |
Il sistema fornisce automaticamente l'interfaccia della tastiera per tutte le finestre di dialogo modali. Non fornisce l'interfaccia per finestre di dialogo modeless, a meno che l'applicazione non chiami la funzione IsDialogMessage per filtrare i messaggi nel ciclo di messaggi principale. Ciò significa che l'applicazione deve passare il messaggio a IsDialogMessage immediatamente dopo il recupero del messaggio dalla coda di messaggi. La funzione elabora i messaggi se si tratta della finestra di dialogo e restituisce un valore diverso da zero per indicare che il messaggio è stato elaborato e non deve essere passato alla funzione TranslateMessage o DispatchMessage.
Poiché l'interfaccia della tastiera della finestra di dialogo utilizza i tasti di direzione per spostarsi tra i controlli in una finestra di dialogo, un'applicazione non può utilizzare questi tasti per scorrere il contenuto di qualsiasi finestra di dialogo modale o qualsiasi finestra di dialogo senza modalità per cui viene chiamato IsDialogMessage. Quando una finestra di dialogo dispone di barre di scorrimento, l'applicazione deve fornire un'interfaccia di tastiera alternativa per le barre di scorrimento. Si noti che l'interfaccia del mouse per lo scorrimento è disponibile quando il sistema include un mouse.
Stile WS_TABSTOP
Lo stile WS_TABSTOP specifica i controlli a cui l'utente può spostarsi premendo TAB o MAIUSC+TAB.
Quando l'utente preme TAB o MAIUSC+TAB, il sistema determina innanzitutto se questi tasti vengono elaborati dal controllo che attualmente ha lo stato attivo per l'input. Invia al controllo un messaggio di WM_GETDLGCODE e, se il controllo restituisce DLGC_WANTTAB, il sistema passa i tasti al controllo. In caso contrario, il sistema usa la funzione GetNextDlgTabItem per individuare il controllo successivo visibile, non disabilitato e con lo stile WS_TABSTOP. La ricerca inizia con il controllo che attualmente ha lo stato attivo per l'input e procede nell'ordine in cui sono stati creati i controlli, ovvero l'ordine in cui sono definiti nel modello della finestra di dialogo. Quando il sistema individua un controllo con le caratteristiche necessarie, il sistema sposta lo stato attivo sull'input.
Se la ricerca del controllo successivo con lo stile WS_TABSTOP rileva una finestra con lo stile WS_EX_CONTROLPARENT, il sistema cerca in modo ricorsivo gli elementi figlio della finestra.
Un'applicazione può anche usare GetNextDlgTabItem per individuare i controlli con lo stile WS_TABSTOP. La funzione recupera l'handle della finestra del controllo successivo o precedente con lo stile WS_TABSTOP senza spostare lo stato attivo di input.
Stile WS_GROUP
Per impostazione predefinita, il sistema sposta lo stato attivo dell'input sul controllo successivo o precedente ogni volta che l'utente preme un tasto di direzione. Finché il controllo corrente con lo stato attivo di input non elabora questi tasti e il controllo successivo o precedente non è un controllo statico, il sistema continua a spostare lo stato attivo dell'input attraverso tutti i controlli della finestra di dialogo mentre l'utente continua a premere i tasti di direzione.
Un'applicazione può usare lo stile WS_GROUP per modificare questo comportamento predefinito. Lo stile contrassegna l'inizio di un gruppo di controlli. Se un controllo nel gruppo ha lo stato attivo quando l'utente inizia a premere i tasti di direzione, lo stato attivo rimane nel gruppo. In generale, il primo controllo in un gruppo deve avere lo stile WS_GROUP e tutti gli altri controlli del gruppo non devono avere questo stile. Tutti i controlli nel gruppo devono essere contigui, ovvero devono essere stati creati consecutivamente senza controlli intermedi.
Quando l'utente preme un tasto di direzione, il sistema determina innanzitutto se il controllo corrente con lo stato attivo di input elabora i tasti di direzione. Il sistema invia un messaggio WM_GETDLGCODE al controllo e, se il controllo restituisce il valore DLGC_WANTARROWS , passa la chiave al controllo. In caso contrario, il sistema usa la funzione GetNextDlgGroupItem per determinare il controllo successivo nel gruppo.
GetNextDlgGroupItem cerca i controlli nell'ordine (o nell'ordine inverso) creati. Se l'utente preme il tasto RIGHT o DOWN, GetNextDlgGroupItem restituisce il controllo successivo se tale controllo non ha lo stile WS_GROUP . In caso contrario, la funzione inverte l'ordine della ricerca e restituisce il primo controllo con lo stile WS_GROUP . Se l'utente preme il tasto LEFT o UP, la funzione restituisce il controllo precedente, a meno che il controllo corrente non abbia già lo stile WS_GROUP . Se il controllo corrente ha questo stile, la funzione inverte l'ordine della ricerca, individua il primo controllo con lo stile WS_GROUP e restituisce il controllo che precede immediatamente il controllo individuato.
Se la ricerca del controllo successivo nel gruppo rileva una finestra con lo stile WS_EX_CONTROLPARENT , il sistema cerca in modo ricorsivo gli elementi figlio della finestra.
Dopo che il sistema ha il controllo successivo o precedente, invia un messaggio WM_GETDLGCODE al controllo per determinare il tipo di controllo. Il sistema sposta quindi lo stato attivo dell'input per controllare se non è un controllo statico. Se il controllo è un pulsante di opzione automatico, il sistema invia un messaggio BM_CLICK. Un'applicazione può anche usare GetNextDlgGroupItem per individuare i controlli in un gruppo.
In genere, il primo controllo del gruppo combina gli stili WS_GROUP e WS_TABSTOP in modo che l'utente possa spostarsi da gruppo a gruppo usando il tasto TAB. Se il gruppo contiene pulsanti di opzione, l'applicazione deve applicare lo stile WS_TABSTOP solo al primo controllo del gruppo. Il sistema sposta automaticamente lo stile quando l'utente si sposta tra i controlli nel gruppo. In questo modo, lo stato attivo di input sarà sempre attivo sul controllo selezionato più di recente quando l'utente passa al gruppo usando il tasto TAB.
Mnemonics
Un mnemonico è una lettera o una cifra selezionata nell'etichetta di un pulsante o nel testo di un controllo statico. Il sistema sposta lo stato attivo dell'input sul controllo associato alla mnemonica ogni volta che l'utente preme il tasto che corrisponde al tasto mnemonico o preme questo tasto e il tasto ALT in combinazione. I Mnemonic consentono all'utente di passare rapidamente a un controllo specificato usando la tastiera.
Un'applicazione crea un carattere mnemonico per un controllo inserendo la e commerciale (&) immediatamente prima della lettera o della cifra selezionata nell'etichetta o nel testo del controllo. Nella maggior parte dei casi, la stringa con terminazione Null fornita con il controllo nel modello della finestra di dialogo contiene l'e commerciale. Tuttavia, un'applicazione può creare un mnemonic in qualsiasi momento sostituendo l'etichetta o il testo esistente di un controllo usando la funzione SetDlgItemText. Per ogni controllo è possibile specificare un solo mnemonico. Anche se è consigliabile, i mnemonici in una finestra di dialogo non devono essere univoci.
Quando l'utente preme una lettera o un tasto cifra, il sistema determina innanzitutto se il controllo corrente con lo stato attivo di input elabora il tasto. Il sistema invia un messaggio WM_GETDLGCODE al controllo e, se il controllo restituisce il valore DLGC_WANTALLKEYS o DLG_WANTMESSAGE , il sistema passa la chiave al controllo. In caso contrario, cerca un controllo il cui mnemonico corrisponde alla lettera o alla cifra specificata. Continua la ricerca fino a quando non individua un controllo o ha esaminato tutti i controlli. Durante la ricerca, ignora tutti i controlli statici con lo stile SS_NOPREFIX.
Se la ricerca di un controllo con un mnemonico corrispondente rileva una finestra con lo stile WS_EX_CONTROLPARENT , il sistema cerca in modo ricorsivo gli elementi figlio della finestra.
Se il sistema individua un controllo statico e il controllo non è disabilitato, il sistema sposta lo stato attivo dell'input sul primo controllo dopo il controllo statico visibile, non disabilitato e con lo stile WS_TABSTOP. Se il sistema individua un altro controllo con un mnemonic corrispondente, sposta lo stato attivo dell'input su tale controllo. Se il controllo è un pulsante di pressione predefinito, il sistema invia un messaggio di notifica BN_CLICKED alla routine della finestra di dialogo. Se il controllo è un altro stile di pulsante e nella finestra di dialogo non è presente un altro controllo con lo stesso carattere mnemonico, il sistema invia il messaggio BM_CLICK al controllo.
Finestra di dialogo Impostazioni
Le impostazioni della finestra di dialogo sono le selezioni e i valori correnti per i controlli nella finestra di dialogo. La procedura della finestra di dialogo è responsabile dell'inizializzazione dei controlli in queste impostazioni durante la creazione della finestra di dialogo. È anche responsabile del recupero delle impostazioni correnti dai controlli prima di eliminare definitivamente la finestra di dialogo. I metodi utilizzati per inizializzare e recuperare le impostazioni dipendono dal tipo di controllo.
Per ulteriori informazioni, vedi gli argomenti seguenti:
- Pulsanti di opzione e caselle di controllo
- Finestra di dialogo Modifica controlli
- Caselle di riepilogo, caselle combinate ed elenchi di directory
- Messaggi di controllo della finestra di dialogo
Pulsanti di opzione e caselle di controllo
Le finestre di dialogo usano pulsanti di opzione e caselle di controllo per consentire all'utente di scegliere da un elenco di opzioni. I pulsanti di opzione consentono all'utente di scegliere tra opzioni che si escludono a vicenda; le caselle di controllo consentono all'utente di selezionare una combinazione di opzioni.
La procedura della finestra di dialogo può impostare lo stato iniziale di una casella di controllo utilizzando la funzione CheckDlgButton , che imposta o deseleziona la casella di controllo. Per i pulsanti di opzione in un gruppo di pulsanti di opzione che si escludono a vicenda, la procedura della finestra di dialogo può utilizzare la funzione CheckRadioButton per impostare il pulsante di opzione appropriato e cancellare automaticamente qualsiasi altro pulsante di opzione.
Prima di terminare una finestra di dialogo, la routine della finestra di dialogo può controllare lo stato di ogni pulsante di opzione e casella di controllo utilizzando la funzione IsDlgButtonChecked , che restituisce lo stato corrente del pulsante. Una finestra di dialogo salva in genere queste informazioni per inizializzare i pulsanti alla successiva creazione della finestra di dialogo.
Finestra di dialogo Modifica controlli
Molte finestre di dialogo hanno controlli di modifica che consentono all'utente di fornire testo come input. La maggior parte delle procedure della finestra di dialogo inizializza un controllo di modifica all'avvio della finestra di dialogo. Ad esempio, la routine della finestra di dialogo può inserire un nome file proposto nel controllo che l'utente può quindi selezionare, modificare o sostituire. La routine della finestra di dialogo può impostare il testo in un controllo di modifica utilizzando la funzione SetDlgItemText , che copia il testo da un buffer specificato al controllo di modifica. Quando il controllo di modifica riceve lo stato attivo per l'input, seleziona automaticamente il testo completo per la modifica.
Poiché i controlli di modifica non restituiscono automaticamente il testo nella finestra di dialogo, la routine della finestra di dialogo deve recuperare il testo prima che termini. Può recuperare il testo usando la funzione GetDlgItemText , che copia il testo del controllo di modifica in un buffer. La routine della finestra di dialogo salva in genere questo testo per inizializzare il controllo di modifica in un secondo momento o passarlo alla finestra padre per l'elaborazione.
Alcune finestre di dialogo usano controlli di modifica che consentono all'utente di immettere numeri. La routine della finestra di dialogo può recuperare un numero da un controllo di modifica utilizzando la funzione GetDlgItemInt , che recupera il testo dal controllo di modifica e converte il testo in un valore decimale. L'utente digita il numero in cifre decimali. Può essere firmato o senza segno. La routine della finestra di dialogo può visualizzare un numero intero tramite la funzione SetDlgItemInt. SetDlgItemInt converte un intero con segno o senza segno in una stringa di cifre decimali.
Caselle di riepilogo, caselle combinate ed elenchi di directory
Alcune finestre di dialogo visualizzano elenchi di nomi da cui l'utente può selezionare uno o più nomi. Per visualizzare un elenco di nomi file, ad esempio, una finestra di dialogo usa in genere una casella di riepilogo e le funzioni DlgDirList e DlgDirSelectEx. La funzione DlgDirList riempie automaticamente una casella di riepilogo con i nomi file nella directory corrente. La funzione DlgDirSelect recupera il nome file selezionato dalla casella di riepilogo. Insieme, queste due funzioni consentono a una finestra di dialogo di visualizzare un elenco di directory in modo che l'utente possa selezionare un file senza dover digitare il nome e il percorso.
Una finestra di dialogo può anche utilizzare una casella combinata per visualizzare un elenco di nomi file. La funzione DlgDirListComboBox riempie automaticamente una parte della casella combinata con i nomi file nella directory corrente. La funzione DlgDirSelectComboBoxEx recupera un nome file selezionato dalla parte della casella di riepilogo.
Messaggi di controllo della finestra di dialogo
Molti controlli riconoscono messaggi predefiniti che, quando ricevuti dai controlli, li fanno eseguire alcune azioni. Ad esempio, il messaggio BM_edizione Standard TCHECK imposta il controllo in una casella di controllo e il messaggio EM_GETedizione Standard L recupera la parte del testo del controllo attualmente selezionato. I messaggi di controllo offrono a una routine di dialogo un accesso maggiore e più flessibile ai controlli rispetto alle funzioni standard, quindi vengono spesso usati quando la finestra di dialogo richiede interazioni complesse con l'utente.
Una routine della finestra di dialogo può inviare un messaggio a un controllo specificando l'identificatore di controllo e utilizzando la funzione SendDlgItemMessage, identica alla funzione SendMessage, ad eccezione del fatto che usa un identificatore di controllo anziché un handle di finestra per identificare il controllo che deve ricevere il messaggio. Un messaggio specificato può richiedere che la procedura di dialogo invii parametri con il messaggio e che il messaggio abbia valori restituiti corrispondenti. L'operazione e i requisiti di ogni messaggio di controllo dipendono dallo scopo del messaggio e dal controllo che lo elabora.
Per altre informazioni sui messaggi di controllo, vedere Controlli Windows.
Finestre di dialogo personalizzate
Un'applicazione può creare finestre di dialogo personalizzate usando una classe finestra definita dall'applicazione per le finestre di dialogo invece di usare la classe predefinita della finestra di dialogo. Le applicazioni usano in genere questo metodo quando una finestra di dialogo è la finestra principale, ma è utile anche per creare finestre di dialogo modali e non modali per le applicazioni con finestre sovrapposte standard.
La classe finestra definita dall'applicazione consente all'applicazione di definire una routine finestra per la finestra di dialogo ed elaborare i messaggi prima di inviarli alla routine della finestra di dialogo. Consente inoltre all'applicazione di definire un'icona di classe, un pennello di sfondo della classe e un menu di classe per la finestra di dialogo. L'applicazione deve registrare la classe della finestra prima di tentare di creare una finestra di dialogo e deve fornire il modello della finestra di dialogo con il valore atom o il nome della classe della finestra.
Molte applicazioni creano una nuova classe di finestre di dialogo recuperando innanzitutto le informazioni sulla classe della classe della finestra di dialogo predefinita e passandola alla funzione GetClassInfo, che riempie una struttura WNDCLASS con le informazioni. L'applicazione modifica i singoli membri della struttura, ad esempio il nome della classe, il pennello e l'icona, quindi registra la nuova classe usando la funzione RegisterClass . Se un'applicazione riempie autonomamente la struttura WNDCLASS , deve impostare il membro cbWndExtra su DLGWINDOWEXTRA, ovvero il numero di byte aggiuntivi richiesti dal sistema per ogni finestra di dialogo. Se un'applicazione usa anche byte aggiuntivi per ogni finestra di dialogo, deve superare i byte aggiuntivi richiesti dal sistema.
La procedura della finestra per la finestra di dialogo personalizzata ha gli stessi parametri e requisiti di qualsiasi altra routine finestra. A differenza di altre procedure di finestra, tuttavia, la routine della finestra per questa finestra di dialogo deve chiamare la funzione DefDlgProc anziché la funzione DefWindowProc per tutti i messaggi che non elabora. DefDlgProc esegue la stessa elaborazione predefinita dei messaggi della procedura di finestra per la finestra di dialogo predefinita, che include la chiamata alla routine della finestra di dialogo.
Un'applicazione può anche creare finestre di dialogo personalizzate sottoclassando la routine della finestra di dialogo predefinita. La funzione SetWindowLong consente a un'applicazione di specificare la routine della finestra per una finestra specificata. L'applicazione può anche tentare di sottoclasse usando la funzione SetClassLong , ma questa operazione influisce su tutte le finestre di dialogo nel sistema, non solo quelle appartenenti all'applicazione.
Le applicazioni che creano finestre di dialogo personalizzate in alcuni casi forniscono un'interfaccia di tastiera alternativa per le finestre di dialogo. Per le finestre di dialogo senza modalità, ciò potrebbe significare che l'applicazione non chiama la funzione IsDialogMessage e elabora invece tutti gli input della tastiera nella routine della finestra personalizzata. In questi casi, l'applicazione può usare il messaggio WM_NEXTDLGCTL per ridurre al minimo il codice necessario per spostare lo stato attivo dell'input da un controllo a un altro. Questo messaggio, quando passato a DefDlgProc, sposta lo stato attivo di input su un controllo specificato e aggiorna l'aspetto dei controlli, ad esempio lo spostamento del bordo predefinito del pulsante di scelta rapida o l'impostazione di un pulsante di opzione automatico.