Personalizzazione delle finestre di dialogo comuni

È possibile usare le finestre di dialogo comuni nel formato standard oppure personalizzarle. Dal punto di vista dell'utente, il vantaggio principale della finestra di dialogo comune è l'aspetto e la funzionalità coerenti dall'applicazione all'applicazione. Pertanto, è importante personalizzare una finestra di dialogo comune solo quando è assolutamente necessario per un'applicazione. In caso contrario, l'aspetto coerente e l'interfaccia di codifica semplice vengono perse. Le personalizzazioni appropriate lasciano intatte il maggior numero possibile di controlli originali. Aumentare le dimensioni della finestra di dialogo o aggiungere nuovi controlli nello spazio già disponibile nella finestra di dialogo è una personalizzazione appropriata. Nascondere i controlli originali o modificare in caso contrario la funzionalità prevista dei controlli originali è una personalizzazione meno appropriata.

Questa sezione illustra i metodi seguenti per personalizzare una finestra di dialogo comune:

Modelli personalizzati

Le finestre di dialogo comuni includono modelli predefiniti che definiscono il numero, il tipo e la posizione dei controlli standard nella finestra di dialogo. È possibile definire un modello personalizzato per concedere agli utenti l'accesso a controlli aggiuntivi univoci per l'applicazione.

Per tutte le finestre di dialogo comuni, ad eccezione delle finestre di dialogo Apri e Salva con nome, si modifica il modello predefinito per creare un modello personalizzato che sostituisce il modello predefinito. Il modello personalizzato definisce il tipo e la posizione dei controlli standard e tutti i controlli aggiuntivi.

Quando si crea un modello di finestra di dialogo personalizzato modificando il modello di finestra di dialogo predefinito, assicurarsi che gli identificatori per i controlli aggiunti siano univoci e non siano in conflitto con gli identificatori dei controlli standard. La tabella seguente elenca il nome del file modello predefinito e include il file per ogni tipo di finestra di dialogo comune.

Tipo di finestra di dialogo File modello Includi file
Color Color.dlg ColorDlg.h
Find Findtext.dlg Dlgs.h
Carattere Font.dlg Dlgs.h
Apri (selezione multipla) Fileopen.dlg Dlgs.h
Apri (selezione singola) Fileopen.dlg Dlgs.h
Imposta pagina Prnsetup.dlg Dlgs.h
Stampa Prnsetup.dlg Dlgs.h
Installazione di stampa (obsoleta) Prnsetup.dlg Dlgs.h
Replace Findtext.dlg Dlgs.h

Per abilitare un modello personalizzato, è necessario impostare un flag nel membro Flag della struttura corrispondente per la finestra di dialogo. Se il modello è una risorsa in un'applicazione o in una libreria di collegamento dinamico, impostare un flag ENABLETEMPLATE nel membro Flags e usare i membri hInstance e lpTemplateName della struttura per identificare il modulo e il nome della risorsa. Se il modello è già in memoria, impostare un flag ENABLETEMPLATEHANDLE nel membro Flags e usare il membro hInstance per identificare l'oggetto memoria che contiene il modello.

Nella maggior parte dei casi, è anche necessario abilitare una procedura di hook per la finestra di dialogo per supportare e elaborare l'input per i controlli aggiuntivi nel modello personalizzato.

Per le finestre di dialogo Apri e Salva con nome di esplora risorse, i modelli predefiniti non sono disponibili per la modifica. Il modello personalizzato definisce invece una finestra di dialogo figlio che include solo gli elementi da aggiungere alla finestra di dialogo standard. Il modello personalizzato può anche definire un controllo statico che specifica il percorso del cluster dei controlli standard nella finestra di dialogo figlio. Per altre informazioni, vedere Modelli personalizzati in stile Esplora risorse.

Procedure di collegamento per le finestre di dialogo comuni

Per ognuna delle finestre di dialogo comuni, è possibile abilitare una routine di hook per elaborare i messaggi dalla procedura predefinita della finestra di dialogo. Esistono due tipi generali di procedure di hook di dialogo comuni:

  • Procedura di hook standard usata con le finestre di dialogo più comuni
  • Procedura di hook in stile Esplora risorse supportata dalle finestre di dialogo Apri e Salva con nome

Quando si specifica una procedura di hook standard per una delle finestre di dialogo comuni, la procedura predefinita della finestra di dialogo gestisce i messaggi come indicato di seguito.

Message Gestione
WM_INITDIALOG La procedura della finestra di dialogo predefinita elabora il messaggio prima di passarlo alla procedura di hook. Il parametro lParam del messaggio è un puntatore alla struttura di inizializzazione specificata al momento della creazione della finestra di dialogo.
Tutti gli altri messaggi La procedura di hook riceve prima il messaggio. Il valore restituito della procedura di hook determina quindi se la procedura di dialogo predefinita elabora il messaggio o la ignora.

Per le finestre di dialogo Apri e Salva con nome, la procedura di hook non riceve messaggi destinati ai controlli standard nella finestra di dialogo. Riceve invece messaggi di notifica dalla finestra di dialogo e dai messaggi per eventuali controlli aggiuntivi definiti in un modello personalizzato. Per altre informazioni, vedere Procedure di hook in stile Explorer.

Per abilitare una routine di hook, impostare un valore ENABLEHOOK nel membro Flag della struttura corrispondente per la finestra di dialogo. Se viene impostato un flag ENABLEHOOK , un membro lpfnHook della struttura deve specificare l'indirizzo della routine di hook.

Nella tabella seguente viene illustrato il tipo di procedura di hook da fornire per ognuna delle finestre di dialogo comuni.

Tipo di finestra di dialogo Procedura di hook
Color CCHookProc
Trovare o sostituire FRHookProc
Carattere CFHookProc
Apri o Salva con nome (stile Esplora) OFNHookProc
Apri o Salva con nome (stile precedente) OFNHookProcOldStyle
Stampa PrintHookProc
Imposta pagina PageSetupHook

Per la finestra di dialogo Imposta pagina , è anche possibile specificare una routine hook PagePaintHook . Si tratta di una procedura hook speciale che è possibile utilizzare per personalizzare l'aspetto della pagina di esempio visualizzata dalla finestra di dialogo Imposta pagina .

Nota

La finestra di dialogo Imposta stampa è stata sostituita dalla finestra di dialogo Imposta pagina . Le applicazioni devono usare la finestra di dialogo Imposta pagina . Tuttavia, per la compatibilità, la funzione PrintDlg continua a supportare la visualizzazione della finestra di dialogo Imposta stampa . È possibile specificare una procedura hook SetupHookProc per la finestra di dialogo Imposta stampante .

Messaggi comuni della finestra di dialogo

Le finestre di dialogo comuni usano messaggi per notificare la routine finestra o la routine hook quando si verificano determinati eventi. Sono inoltre disponibili messaggi che è possibile inviare a una finestra di dialogo comune per recuperare informazioni o per controllare il comportamento o l'aspetto della finestra di dialogo. In questa sezione vengono descritti i messaggi di dialogo comuni registrati dalla funzione RegisterWindowMessage , i messaggi utilizzati dalla finestra di dialogo Tipo di carattere e la finestra di dialogo Imposta pagina e i messaggi utilizzati dalle finestre di dialogo Apri e Salva con nome in stile Esplora risorse.

La libreria di finestre di dialogo comuni definisce un set di stringhe di messaggi. È possibile passare una costante associata a una di queste stringhe di messaggio a RegisterWindowMessage per ottenere un identificatore di messaggio. È quindi possibile usare l'identificatore per rilevare ed elaborare i messaggi inviati da una finestra di dialogo comune o per inviare messaggi a una finestra di dialogo comune. La tabella seguente illustra le costanti del messaggio e ne descrive l'uso.

Contants Uso
COLOROKSTRING Una finestra di dialogo Colore invia questo messaggio alla procedura hook quando l'utente seleziona un colore e fa clic sul pulsante OK . La procedura hook può accettare il colore oppure rifiutarla e forzare la finestra di dialogo a rimanere aperta.
FILEOKSTRING Una finestra di dialogo Apri o Salva con nome invia questo messaggio alla procedura di hook quando l'utente seleziona un nome file e fa clic sul pulsante OK . La procedura hook può accettare il nome del file o rifiutarla e forzare la finestra di dialogo a rimanere aperta. Per le finestre di dialogo Apri e Salva con nome in stile Esplora risorse, questo messaggio è stato sostituito dal messaggio di notifica CDN_FILEOK .
FINDMSGSTRING Una finestra di dialogo Trova o Sostituisci invia questo messaggio alla routine della finestra padre quando l'utente fa clic su Trova successivo, Sostituisci o Sostituiscitutto oppure chiude la finestra di dialogo. Il parametro lParam del messaggio è un puntatore a una struttura FINDREPLACE contenente l'input dell'utente.
HELPMSGSTRING Tutte le finestre di dialogo comuni inviano questo messaggio alla routine della finestra padre quando l'utente fa clic sul pulsante ? . Per le finestre di dialogo Apri e Salva con nome in stile Esplora risorse, questo messaggio è stato sostituito dal messaggio di notifica CDN_HELP .
LBSELCHSTRING Una finestra di dialogo Apri o Salva con nome invia questo messaggio alla routine hook quando l'utente modifica la selezione nella casella di riepilogo Nome file . Per le finestre di dialogo Apri e Salva con nome in stile Esplora risorse, questo messaggio è stato sostituito dal messaggio di notifica CDN_SELCHANGE .
SETRGBSTRING Una routine hook può inviare questo messaggio a una finestra di dialogo Colore per impostare la selezione del colore corrente.
SHAREVISTRING Una finestra di dialogo Apri o Salva con nome invia questo messaggio alla procedura di hook se si verifica una violazione di condivisione per il file selezionato quando l'utente fa clic sul pulsante OK . Per le finestre di dialogo Apri e Salva con nome in stile Esplora risorse, questo messaggio è stato sostituito dal messaggio di notifica CDN_SHAREVIOLATION .

Alcune finestre di dialogo comuni inviano e ricevono altri messaggi di finestra. La procedura hook per una finestra di dialogo Tipo di carattere può inviare uno dei messaggi WM_CHOOSEFONT_* alla finestra di dialogo Tipo di carattere . Per altre informazioni, vedere Finestra di dialogo Tipo di carattere. La finestra di dialogo Imposta pagina invia i messaggi WM_PSD_* se è stata abilitata una routine hook PagePaintHook . Per altre informazioni, vedere Finestra di dialogo Imposta pagina.

Le finestre di dialogo Apri e Salva con nome in stile Esplora risorse supportano un set di messaggi predefiniti. Questi includono messaggi di notifica inviati sotto forma di messaggio WM_NOTIFY alla routine hook e messaggi che la routine hook può inviare alla finestra di dialogo. Per un elenco completo di questi messaggi, vedere Procedure hook di tipo Explorer.

Supporto tecnico della Guida

Le finestre di dialogo comuni forniscono la Guida sensibile al contesto per i controlli standard della finestra di dialogo. Per fornire ulteriore assistenza per una finestra di dialogo comune, è possibile visualizzare un pulsante della Guida ed elaborare i messaggi generati quando l'utente fa clic sul pulsante. Il pulsante ? è un supplemento alla Guida sensibile al contesto predefinita. Il pulsante Guida è utile per descrivere lo scopo generico della finestra di dialogo quando si applica all'applicazione.

Guida di Context-Sensitive

Tutte le finestre di dialogo comuni forniscono una Guida sensibile al contesto per i controlli standard della finestra di dialogo. L'utente può visualizzare la Guida per i singoli controlli tramite uno dei metodi seguenti:

  • Selezione del controllo e pressione del tasto F1.
  • Facendo clic sul pulsante ? nella barra del titolo e successivamente facendo clic su un controllo .
  • Fare clic sul pulsante destro del mouse su un controllo .

Se si personalizza una finestra di dialogo aggiungendo nuovi controlli, è necessario estendere anche il supporto della Guida per questi controlli elaborando le richieste di assistenza nella procedura hook. La procedura hook riceve i messaggi seguenti quando l'utente richiede assistenza.

Azione utente Message
Fare clic sul pulsante destro del mouse su un controllo . WM_CONTEXTMENU
Premuto il tasto F1. WM_HELP
Fare clic sul pulsante ? sulla barra del titolo e quindi su un controllo . WM_HELP

È consigliabile elaborare questi messaggi per i controlli aggiunti, ma consentire alla routine della finestra di dialogo predefinita di elaborare i messaggi per i controlli standard. Per altre informazioni sull'elaborazione di questi messaggi, vedere la Guida.

Pulsante ?

È possibile visualizzare un pulsante Della Guida in una delle finestre di dialogo comuni impostando un valore SHOWHELP nel membro Flag della struttura di inizializzazione per la finestra di dialogo. Se si visualizza il pulsante ? è necessario elaborare la richiesta di assistenza dell'utente. L'elaborazione può essere eseguita in una delle procedure della finestra dell'applicazione o in una procedura hook per la finestra di dialogo. In genere, si elabora la richiesta di assistenza chiamando la funzione WinHelp .

Per elaborare i messaggi della Guida in una delle procedure della finestra, è necessario ottenere un identificatore di messaggio per la stringa definita dal valore HELPMSGSTRING e identificare la finestra per la ricezione dei messaggi. Per ottenere l'identificatore del messaggio, specificare HELPMSGSTRING come parametro in una chiamata alla funzione RegisterWindowMessage . Quando si crea la finestra di dialogo, utilizzare il membro hwndOwner della struttura di inizializzazione della finestra di dialogo per identificare la finestra che deve ricevere i messaggi. La procedura della finestra di dialogo invia il messaggio alla routine della finestra ogni volta che l'utente fa clic sul pulsante ? .

Per elaborare i messaggi della Guida in una procedura hook, è necessario elaborare il messaggio WM_COMMAND . La procedura di hook fornisce assistenza se il parametro wParam di questo messaggio indica che l'utente ha fatto clic sul pulsante ? . L'identificatore del pulsante ? è la costante pshHelp definita nel file Dlgs.h.

Le procedure hook per le finestre di dialogo Apri e Salva con nome in stile Esplora risorse non ricevono WM_COMMAND messaggi per il pulsante ? Al contrario, la finestra di dialogo invia un messaggio di notifica CDN_HELP alla procedura di hook quando si fa clic sul pulsante ? .