Finestre di dialogo Apri e Salva con nome

Nota

La funzione GetOpenFileName è illustrata nell'esempio di utilizzo di File.

[A partire da Windows Vista, le finestre di dialogo Comuni Apri e Salva con nome sono state sostituite dalla finestra di dialogo Elemento comune. È consigliabile usare l'API Finestra di dialogo elemento comune anziché queste finestre di dialogo dalla libreria delle finestre di dialogo comuni.

La finestra di dialogo Apri consente all'utente di specificare l'unità, la directory e il nome di un file o di un set di file da aprire. Per creare e visualizzare una finestra di dialogo Apri , inizializzare una struttura OPENFILENAME e passare la struttura alla funzione GetOpenFileName .

La finestra di dialogo Salva con nome consente all'utente di specificare l'unità, la directory e il nome di un file da salvare. Per creare e visualizzare una finestra di dialogo Salva con nome, inizializzare una struttura OPENFILENAME e passare la struttura alla funzione GetSaveFileName .

Le finestre di dialogo Apri e Salva con nome in stile Esplora risorse offrono funzionalità dell'interfaccia utente simili a Esplora risorse. Tuttavia, il sistema continua a supportare le finestre di dialogo Apri e Salva con nome precedenti per le applicazioni che devono essere coerenti con l'interfaccia utente precedente.

Oltre alla differenza di aspetto, le finestre di dialogo in stile Explorer e vecchio stile differiscono per l'uso di modelli personalizzati e procedure hook per personalizzare le finestre di dialogo. Tuttavia, le finestre di dialogo in stile Esplora risorse e vecchio stile hanno lo stesso comportamento per la maggior parte delle operazioni di base, ad esempio specificando un filtro di nome file, convalidando l'input dell'utente e ottenendo il nome file specificato dall'utente. Per altre informazioni sulle finestre di dialogo in stile Esplora risorse e stile precedente, vedere Personalizzazione della finestra di dialogo Apri e salva con nome.

La figura seguente mostra una tipica finestra di dialogo Apri in stile Esplora risorse.

finestra di dialogo apri file

Nella figura seguente viene illustrata una tipica finestra di dialogo Salva con nome in stile Esplora risorse.

Finestra di dialogo Salva file

Se l'utente specifica un nome file e fa clic sul pulsante OK , GetOpenFileName o GetSaveFileName restituisce TRUE. Il buffer a cui punta il membro lpstrFile della struttura OPENFILENAME contiene il percorso completo e il nome file specificati dall'utente.

Se l'utente annulla la finestra di dialogo Apri o Salva con nome o si verifica un errore, la funzione restituisce FALSE. Per determinare la causa dell'errore, chiamare la funzione CommDlgExtendedError per recuperare il valore di errore esteso. Se il buffer lpstrFile è troppo piccolo per ricevere il nome completo, CommDlgExtendedError restituisce FNERR_BUFFERTOOSMALL e i primi 2 byte del buffer a cui punta il membro lpstrFile vengono impostati su un valore intero che specifica le dimensioni necessarie per ricevere il nome completo.

In questa sezione vengono illustrati gli argomenti seguenti.

Nomi di file e directory

Le informazioni contenute in questa sezione si applicano alle finestre di dialogo Apri e Salva con nome in stile precedente e in stile precedente.

Prima di chiamare le funzioni GetOpenFileName o GetSaveFileName , il membro lpstrFile della struttura OPENFILENAME deve puntare al buffer per ricevere il nome del file. Il membro nMaxFile deve specificare le dimensioni, in caratteri, del buffer lpstrFile . Per una funzione ANSI si tratta del numero di byte, ma per una funzione Unicode questo è il numero di caratteri.

Se l'utente specifica un nome file e fa clic sul pulsante OK , la finestra di dialogo copia l'unità, la directory e il nome file selezionati nel buffer lpstrFile . La funzione imposta anche i membri nFileOffset e nFileExtension rispettivamente agli offset, in caratteri, dall'inizio del buffer al nome del file e all'estensione del nome file.

Per recuperare solo il nome e l'estensione del file, impostare il membro lpstrFileTitle in modo che punti a un buffer e impostare il membro nMaxFileTitle sulle dimensioni, in caratteri, del buffer. In alternativa, è possibile passare il buffer lpstrFile in una chiamata alla funzione GetFileTitle per ottenere il nome visualizzato del file selezionato. Si noti, tuttavia, che il nome file restituito da GetFileTitle include un'estensione solo se si tratta della preferenza dell'utente per la visualizzazione dei nomi di file.

La finestra di dialogo utilizza la directory corrente per il processo chiamante come directory iniziale da cui visualizzare file e directory. Usare le funzioni GetCurrentDirectory e SetCurrentDirectory per ottenere e modificare la directory corrente di un processo. Per specificare una directory iniziale diversa senza modificare la directory corrente, usare il membro lpstrInitialDir per specificare il nome di una directory. La finestra di dialogo modifica automaticamente la directory corrente quando l'utente seleziona un'unità o una directory diversa. Per impedire alla finestra di dialogo di modificare la directory corrente, impostare il flag di OFN_NOCHANGEDIR . Questo flag non impedisce all'utente di modificare le directory per trovare un file.

Per specificare un'estensione del nome file predefinita, usare il membro lpstrDefExt . Se l'utente specifica un nome file che non dispone di un'estensione, la finestra di dialogo aggiunge l'estensione predefinita. Se si specifica un'estensione predefinita e l'utente specifica un nome di file con un'estensione diversa, la finestra di dialogo imposta il flag OFN_EXTENSIONDIFFERENT .

Per consentire all'utente di selezionare più file da una directory, impostare il flag di OFN_ALLOWMULTISELECT . Per la compatibilità con le applicazioni precedenti, la finestra di dialogo di selezione multipla predefinita usa l'interfaccia utente precedente. Per visualizzare una finestra di dialogo di selezione multipla in stile Esplora risorse, è necessario impostare anche il flag di OFN_EXPLORER .

Se l'utente seleziona più file, il buffer a cui punta il membro lpstrFile restituisce il percorso della directory corrente seguita dai nomi di file dei file selezionati. Il membro nFileOffset è l'offset al nome del primo file e il membro nFileExtension non viene utilizzato. Nella tabella seguente viene descritta la differenza tra le finestre di dialogo in stile Explorer e in stile obsoleto nella restituzione di più nomi di file.

Stile finestra di dialogo Descrizione
Finestre di dialogo in stile Esplora risorse Le stringhe di directory e nome file sono separate da NULL , con un carattere NULL aggiuntivo dopo l'ultimo nome file. Questo formato consente alle finestre di dialogo in stile Esplora risorse di restituire nomi di file lunghi che includono spazi.
Finestre di dialogo vecchio stile Le stringhe di directory e nome file sono separate da spazi. Per i nomi di file con spazi, la funzione usa nomi di file brevi.

 

È possibile usare la funzione FindFirstFile per eseguire la conversione tra nomi di file lunghi e brevi.

Se si specifica OFN_ALLOWMULTISELECT e l'utente seleziona un solo file, la stringa lpstrFile non dispone di un separatore tra il percorso e il nome del file.

Filtri

Le informazioni contenute in questa sezione si applicano alle finestre di dialogo Apri e Salva con nome sia in stile precedente.

È possibile fornire filtri per i nomi di file per consentire all'utente di limitare i nomi di file visualizzati nella finestra di dialogo. Un filtro di nome file è costituito da una coppia di stringhe con terminazione Null, una descrizione e un criterio, una concatenata all'altra. Nella finestra di dialogo viene visualizzata la descrizione per consentire all'utente di selezionare il filtro da usare; e usa il modello per selezionare i file da visualizzare.

Per specificare i filtri, impostare il membro lpstrFilter della struttura OPENFILENAME in modo che punti a un buffer contenente una matrice di coppie di stringhe di filtro. L'ultima stringa nella matrice deve essere seguita da un carattere Null aggiuntivo.

Una stringa di modello può essere una combinazione di caratteri di nome file validi e l'asterisco (*). L'asterisco è un carattere jolly che rappresenta qualsiasi combinazione di caratteri di nome file validi. Nella finestra di dialogo vengono visualizzati solo i file che corrispondono al modello. Per specificare più modelli per la stessa descrizione, è necessario usare un punto e virgola (;) per separare i modelli. Si noti che i caratteri di spazio nella stringa del criterio possono produrre risultati imprevisti.

Il frammento di codice seguente specifica due filtri. Il filtro con la descrizione "Source" ha due modelli. Se l'utente seleziona questo filtro, nella finestra di dialogo vengono visualizzati solo i file con . C e . Estensioni CXX. Si noti che nel linguaggio di programmazione C una stringa racchiusa tra virgolette doppie è con terminazione Null.

OPENFILENAME ofn;       // common dialog box structure

ofn.lpstrFilter = "Source\0*.C;*.CXX\0All\0*.*\0"
ofn.nFilterIndex = 1;

Il membro nFilterIndex della struttura OPENFILENAME specifica un indice che indica quale filtro viene utilizzato inizialmente dalla finestra di dialogo. Il primo filtro nel buffer ha indice 1, il secondo 2 e così via. Se l'utente modifica il filtro durante l'utilizzo della finestra di dialogo, il membro nFilterIndex viene impostato sull'indice del filtro selezionato al ritorno.

È possibile creare un filtro personalizzato impostando il membro lpstrCustomFilter sull'indirizzo di un buffer che contiene un singolo filtro e impostando il membro nMaxCustFilter sulle dimensioni del buffer, in caratteri o byte. La finestra di dialogo inserisce sempre il filtro personalizzato all'inizio dell'elenco dei filtri e, in caso di restituzione, aggiorna sempre la parte del criterio del filtro con il criterio dal filtro selezionato dall'utente.

Per le finestre di dialogo in stile Esplora risorse, l'estensione predefinita può cambiare se l'utente seleziona un filtro diverso. Se l'utente seleziona un filtro il cui primo modello è nel formato *. xxx (ovvero l'estensione non include un carattere jolly), la finestra di dialogo usa xxx come estensione predefinita. Ciò si verifica solo se è stata specificata un'estensione predefinita nel membro lpstrDefExt della struttura OPENFILENAME . Ad esempio, se l'utente seleziona "Source\0*. C;*. Filtro CXX\0, l'estensione predefinita cambia in "C". Tuttavia, se il filtro è stato definito come "Source\0*. C*\0", l'estensione predefinita non cambia perché l'estensione include un carattere jolly.

Il messaggio di notifica CDN_INCLUDEITEM consente di filtrare i nomi visualizzati nella finestra di dialogo. Per usare questo messaggio, specificare una routine hook OFNHookProc e specificare il flag OFN_ENABLEINCLUDENOTIFY nella struttura OPENFILENAME quando si crea la finestra di dialogo. Ogni volta che l'utente apre una cartella, la finestra di dialogo invia una notifica CDN_INCLUDEITEM alla procedura hook per ogni elemento nella cartella appena aperta. Il valore restituito della routine hook indica se la finestra di dialogo deve visualizzare l'elemento nell'elenco di elementi della cartella.

Convalida di file e directory

Ad eccezione di quanto indicato, le informazioni contenute in questa sezione si applicano alle finestre di dialogo Apri e Salva con nome in stile precedente.

La finestra di dialogo convalida automaticamente i nomi di file digitati dall'utente per assicurarsi che i nomi contengano solo caratteri validi. Per eseguire l'override della convalida dei caratteri del nome file, impostare il flag OFN_NOVALIDATE .

Per forzare la finestra di dialogo per verificare che l'utente ha specificato il nome di un file esistente, impostare il flag di OFN_FILEMUSTEXIST . Per forzare la verifica dell'esistenza del percorso specificato, impostare il flag OFN_PATHMUSTEXIST . Se si imposta il flag di OFN_CREATEPROMPT , la finestra di dialogo richiede all'utente l'autorizzazione per creare un file inesistente. Se questo flag è impostato e l'utente sceglie di creare un nuovo file, la finestra di dialogo viene chiusa e la funzione restituisce il nome specificato. In caso contrario, la finestra di dialogo rimane aperta.

Quando si usa la finestra di dialogo Salva con nome, è possibile indirizzare la finestra di dialogo per richiedere all'utente l'autorizzazione per sovrascrivere un file esistente impostando il flag OFN_OVERWRITEPROMPT .

Per impostazione predefinita, la finestra di dialogo crea un file di test di lunghezza zero per determinare se è possibile creare un nuovo file nella directory selezionata. Per impedire la creazione di questo file di test, impostare il flag OFN_NOTESTFILECREATE .

Se si abilita una procedura hook, la finestra di dialogo invia una notifica alla routine hook quando si verifica una violazione di condivisione di rete per il nome file specificato dall'utente. Se si imposta il flag di OFN_EXPLORER , la finestra di dialogo invia il messaggio CDN_SHAREVIOLATION alla routine hook. Se non si imposta OFN_EXPLORER, la finestra di dialogo invia il messaggio registrato SHAREVISTRING alla procedura di hook. Per impedire alla finestra di dialogo di inviare notifiche per le violazioni di condivisione, impostare il flag di OFN_SHAREAWARE .

Se l'utente seleziona la casella di controllo di sola lettura, la finestra di dialogo imposta il flag di OFN_READONLY restituito. Per nascondere la casella di controllo Apri come sola lettura, impostare il flag di OFN_HIDEREADONLY . Per impedire alla finestra di dialogo di restituire nomi di file esistenti con l'attributo di sola lettura, impostare il flag di OFN_NOREADONLYRETURN .

Per evitare che la finestra di dialogo dereferenzii i file di collegamento, impostare il valore OFN_NODEREFERENCELINKS . In questo caso, la finestra di dialogo restituisce il nome del file di collegamento anziché il nome del file a cui fa riferimento il file di collegamento.

Personalizzazione della finestra di dialogo Apri e salva con nome

È possibile personalizzare una finestra di dialogo Apri o Salva con nome specificando una routine hook, un modello personalizzato o entrambi. Tuttavia, le versioni di Explorer e old-style delle finestre di dialogo differiscono per l'uso di modelli personalizzati e procedure hook.

Per informazioni sulla personalizzazione di una finestra di dialogo in stile Esplora risorse, vedere Procedure hook in stile Explorer, Modelli personalizzati in stile Esplora e Identificatori di controllo in stile Esplora risorse. Per informazioni sulla personalizzazione di una finestra di dialogo di tipo obsoleto, vedere Personalizzazione delle finestre di dialogo Old-Style.

Nella tabella seguente vengono riepilogate le differenze tra i due stili.

Personalizzazione Descrizione
Procedura hook in stile Explorer La procedura hook riceve i messaggi di notifica inviati dalla finestra di dialogo e dai messaggi comuni per tutti i controlli aggiuntivi definiti specificando un modello di finestra di dialogo figlio. La procedura hook non riceve messaggi per i controlli standard della finestra di dialogo predefinita.
Modello personalizzato in stile Esplora risorse Il sistema usa il modello personalizzato per creare una finestra di dialogo figlio. Il modello può definire controlli aggiuntivi e può specificare la posizione del cluster di controlli standard. Il modello personalizzato non sostituisce il modello predefinito.
Procedura hook di vecchio stile La routine hook riceve tutti i messaggi inviati alla finestra di dialogo, inclusi i messaggi per i controlli standard ed eventuali controlli personalizzati. La procedura hook riceve anche messaggi registrati inviati dalla finestra di dialogo comune.
Modello personalizzato in stile precedente Il modello personalizzato sostituisce il modello predefinito. Creare il modello personalizzato modificando il modello predefinito specificato nel file Fileopen.dlg.

 

Il titolo predefinito per entrambe le finestre di dialogo di tipo Explorer e old-style è "Apri" o "Salva con nome". Per modificare il titolo, specificare il nuovo titolo nel membro lpstrTitle della struttura OPENFILENAME .

L'hive del Registro di sistema di HKEY_CURRENT_USER di un utente può contenere valori che personalizzano il contenuto delle finestre di dialogo Apri e Salva con nome in stile Esplora risorse. Queste voci del Registro di sistema influiscono solo sulle finestre di dialogo visualizzate per l'utente associato all'hive del Registro di sistema.

Per nascondere le funzionalità delle finestre di dialogo Apri e Salva con nome in stile Esplora risorse, un amministratore può impostare i valori nella tabella seguente sotto questa sottochiave:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Comdlg32
Nome del valore Valore Significato
NoPlacesBar 1 Nasconde la barra dei luoghi.
NoFileMRU 1 Nasconde l'elenco degli elementi usati più di recente.
NoBackButton 1 Nasconde il pulsante Indietro .

 

Il contenuto della barra Dei luoghi è determinato dal contenuto della sottochiave seguente:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Comdlg32
                     Placesbar

Attualmente, in questa chiave possono essere presenti solo cinque voci e l'indice valore/nome è in base zero. I nomi delle voci devono essere Place0, Place1, Place2,Place3 e Place4. I valori delle voci possono essere REG_DWORD, REG_SZ o REG_EXPAND_SZ valori che identificano le posizioni da includere nella barra delle posizioni.

Tipo di valore Significato
REG_DWORD Valore CSIDL che identifica una cartella. Per un elenco dei valori CSIDL, vedere Valori CSIDL.
REG_SZ o REG_EXPAND_SZ Stringa con terminazione Null che specifica un percorso valido.

 

procedure hook Explorer-Style

È possibile personalizzare una finestra di dialogo Apri o Salva con nome in stile Esplora risorse specificando una routine hook, un modello personalizzato o entrambi. Se si specifica una procedura hook per una finestra di dialogo di tipo Explorer, il sistema crea una finestra di dialogo figlio della finestra di dialogo predefinita. La procedura hook funge da procedura di dialogo per la finestra di dialogo figlio. Questa finestra di dialogo figlio è basata sul modello personalizzato o su un modello predefinito se non viene specificato nessuno. Per altre informazioni, vedere Modelli personalizzati in stile Esplora risorse.

Per abilitare una routine hook per una finestra di dialogo Apri o Salva con nome in stile Esplora risorse, utilizzare la struttura OPENFILENAME quando si crea la finestra di dialogo. Impostare i flag OFN_ENABLEHOOK e OFN_EXPLORER nel membro Flags e specificare l'indirizzo di una routine hook OFNHookProc nel membro lpfnHook . Se si specifica una routine hook e si omette il flag di OFN_EXPLORER , è necessario usare una routine hook OFNHookProcOldStyle e si otterrà l'interfaccia utente di stile precedente. Per altre informazioni, vedere Personalizzazione delle finestre di dialogo Old-Style.

Una routine hook di tipo Explorer riceve un'ampia gamma di messaggi mentre la finestra di dialogo è aperta. tra cui:

  • Messaggio di WM_INITDIALOG e altri messaggi di finestra di dialogo standard, ad esempio il messaggio di colore del controllo WM_CTLCOLORDLG .
  • Set di messaggi di notifica di WM_NOTIFY che indicano le azioni eseguite dall'utente o da altri eventi della finestra di dialogo.
  • Messaggi per eventuali controlli aggiuntivi definiti specificando un modello di finestra di dialogo figlio.

È inoltre disponibile un set di messaggi che è possibile inviare a una finestra di dialogo in stile Explorer per ottenere informazioni o per controllare il comportamento e l'aspetto della finestra di dialogo.

Se si specifica una routine hook per una finestra di dialogo in stile Esplora risorse, la procedura predefinita della finestra di dialogo crea una finestra di dialogo figlio quando la routine di dialogo predefinita elabora il messaggio WM_INITDIALOG . La procedura hook funge da procedura di dialogo per la finestra di dialogo figlio. Al momento, la routine hook riceve il proprio messaggio WM_INITDIALOG con il parametro lParam impostato sull'indirizzo della struttura OPENFILENAME utilizzata per inizializzare la finestra di dialogo. Al termine dell'elaborazione del messaggio WM_INITDIALOG del dialogo figlio, la routine di dialogo predefinita sposta i controlli standard, se necessario, per liberare spazio per eventuali controlli aggiuntivi della finestra di dialogo figlio. La procedura di dialogo predefinita invia quindi il messaggio di notifica CDN_INITDONE alla procedura di hook.

La procedura hook riceve WM_NOTIFY messaggi di notifica che indicano le azioni eseguite dall'utente nella finestra di dialogo. È possibile utilizzare alcuni di questi messaggi per controllare il comportamento della finestra di dialogo. Ad esempio, la procedura hook riceve il messaggio CDN_FILEOK quando l'utente sceglie un nome file e fa clic sul pulsante OK . In risposta a questo messaggio, la routine hook può usare la funzione SetWindowLong per rifiutare il nome selezionato e forzare la finestra di dialogo a rimanere aperta.

Il parametro lParam per ogni WM_NOTIFY messaggio è un puntatore a una struttura OFNOTIFY o OFNOTIFYEX che definisce l'azione. Il membro di codice nell'intestazione di questa struttura contiene uno dei messaggi di notifica seguenti.

Messaggio Significato
CDN_FILEOK L'utente ha fatto clic sul pulsante OK ; la finestra di dialogo sta per chiudersi.
CDN_FOLDERCHANGE L'utente ha aperto una nuova cartella o una nuova directory.
CDN_HELP L'utente ha fatto clic sul pulsante ?
CDN_INCLUDEITEM Determina se deve essere visualizzato un elemento. Quando l'utente apre una nuova cartella o una nuova directory, il sistema invia questa notifica per ogni elemento nella cartella o nella directory. Il sistema invia questa notifica solo se è stato impostato il flag OFN_ENABLEINCLUDENOTIFY .
CDN_INITDONE Il sistema ha completato l'inizializzazione della finestra di dialogo e la finestra di dialogo ha completato l'elaborazione del messaggio WM_INITDIALOG . Inoltre, il sistema ha completato la disposizione dei controlli nella finestra di dialogo comune per fare spazio per i controlli della finestra di dialogo figlio (se presente).
CDN_SELCHANGE L'utente ha selezionato un nuovo file o una nuova cartella dall'elenco di file.
CDN_SHAREVIOLATION La finestra di dialogo comune ha rilevato una violazione di condivisione nel file che sta per essere restituito.
CDN_TYPECHANGE L'utente ha selezionato un nuovo tipo di file dall'elenco dei tipi di file.

 

Questi messaggi WM_NOTIFY sostituiscono i messaggi registrati FILEOKSTRING, LBSELCHSTRING, SHAREVISTRING e HELPMSGSTRING usati dalle versioni precedenti delle finestre di dialogo Apri e Salva con nome. Tuttavia, la routine hook riceve anche il messaggio sostituito dopo il messaggio WM_NOTIFY se l'elaborazione WM_NOTIFY non usa SetWindowLong per impostare un valore diverso da zero DWL_MSGRESULT .

Per recuperare informazioni sullo stato della finestra di dialogo o per controllare il comportamento e l'aspetto della finestra di dialogo, la routine hook può inviare i messaggi seguenti alla finestra di dialogo.

Messaggio Significato
CDM_GETFILEPATH Recupera il percorso e il nome file del file selezionato.
CDM_GETFOLDERIDLIST Recupera l'elenco di identificatori di elemento corrispondente alla cartella corrente aperta dalla finestra di dialogo. Per altre informazioni sugli elenchi di identificatori di elemento, vedere Introduzione allo spazio dei nomi della shell.
CDM_GETFOLDERPATH Recupera il percorso della cartella o della directory corrente per la finestra di dialogo.
CDM_GETSPEC Recupera il nome file (non incluso il percorso) del file attualmente selezionato nella finestra di dialogo.
CDM_HIDECONTROL Nasconde il controllo specificato.
CDM_SETCONTROLTEXT Imposta il testo nel controllo specificato.
CDM_SETDEFEXT Imposta l'estensione del nome file predefinita per la finestra di dialogo.

 

Explorer-Style modelli personalizzati

Per definire controlli aggiuntivi per una finestra di dialogo Apri o Salva con nome in stile Esplora risorse, utilizzare la struttura OPENFILENAME per specificare un modello per una finestra di dialogo figlio contenente i controlli aggiuntivi. Se il modello di dialogo figlio è una risorsa in un'applicazione o in una libreria a collegamento dinamico, impostare il flag OFN_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 il flag OFN_ENABLETEMPLATEHANDLE e usare il membro hInstance per identificare l'oggetto memoria che contiene il modello. Quando si specifica un modello di finestra di dialogo figlio per una finestra di dialogo in stile Explorer, è necessario impostare anche il flag di OFN_EXPLORER ; in caso contrario, il sistema presuppone che venga fornito un modello sostitutivo per una finestra di dialogo di vecchio stile. In genere, se si forniscono controlli aggiuntivi, è necessario fornire anche una routine hook di tipo Explorer per elaborare i messaggi per i nuovi controlli.

È possibile creare il modello di finestra di dialogo figlio come qualsiasi altro modello, ad eccezione del fatto che è necessario specificare gli stili di WS_CHILD e WS_CLIPSIBLINGS e specificare gli stili DS_3DLOOK e DS_CONTROL . Il sistema richiede lo stile WS_CHILD perché il modello definisce una finestra di dialogo figlio della finestra di dialogo predefinita Apri o Salva con nome. Lo stile WS_CLIPSIBLINGS garantisce che la finestra di dialogo figlio non eseghi alcun controllo nella finestra di dialogo predefinita. Lo stile DS_3DLOOK assicura che l'aspetto dei controlli nella finestra di dialogo figlio sia coerente con i controlli nella finestra di dialogo predefinita. Lo stile DS_CONTROL assicura che l'utente possa usare TAB e altri tasti di spostamento per spostarsi tra tutti i controlli, predefiniti o personalizzati, nella finestra di dialogo personalizzata.

Per fare spazio ai nuovi controlli, il sistema espande la finestra di dialogo predefinita in base alla larghezza e all'altezza della finestra di dialogo personalizzata. Per impostazione predefinita, tutti i controlli della finestra di dialogo personalizzata vengono posizionati sotto i controlli nella finestra di dialogo predefinita. È tuttavia possibile eseguire l'override di questo posizionamento predefinito includendo un controllo testo statico nel modello della finestra di dialogo personalizzata e assegnando il valore dell'identificatore di controllo stc32. Questo valore è definito nel file di intestazione Dlgs.h. In questo caso, il sistema usa il controllo come punto di riferimento per determinare dove posizionare i nuovi controlli. Tutti i nuovi controlli sopra e a sinistra del controllo stc32 vengono posizionati la stessa quantità sopra e a sinistra dei controlli nella finestra di dialogo predefinita. I nuovi controlli seguenti e a destra del controllo stc32 sono posizionati sotto e a destra dei controlli predefiniti. In generale, ogni nuovo controllo viene posizionato in modo che abbia la stessa posizione rispetto ai controlli predefiniti rispetto al controllo stc32 . Per fare spazio a questi nuovi controlli, il sistema aggiunge spazio a sinistra, destra, inferiore e superiore della finestra di dialogo predefinita in base alle esigenze.

Il sistema richiede la routine hook per elaborare tutti i messaggi destinati alla finestra di dialogo personalizzata e quindi invia gli stessi messaggi di finestra alla routine hook come a qualsiasi altra procedura di finestra di dialogo. Ad esempio, la procedura hook riceve WM_COMMAND messaggi quando l'utente fa clic sui controlli pulsante nella finestra di dialogo personalizzata. La routine hook è responsabile dell'inizializzazione di questi controlli e del recupero di valori dai controlli quando la finestra di dialogo viene chiusa. Si noti che quando la routine hook riceve il messaggio WM_INITDIALOG , il sistema non ha ancora spostato i controlli nelle rispettive posizioni finali.

La procedura predefinita della finestra di dialogo gestisce i messaggi per tutti i controlli nella finestra di dialogo predefinita, ma la routine hook riceve i messaggi di notifica per le azioni utente su questi controlli, come descritto in Procedure hook in stile Explorer.

Identificatori di controllo Explorer-Style

Windows Software Development Kit (SDK) fornisce il modello di finestra di dialogo predefinito per le finestre di dialogo in stile precedente, ma non include il modello predefinito per le finestre di dialogo in stile Explorer. Ciò è dovuto al fatto che le finestre di dialogo in stile Explorer consentono di aggiungere controlli personalizzati, ma non supportano la modifica del modello per i controlli standard. In alcuni casi, tuttavia, potrebbe essere necessario conoscere gli identificatori di controllo usati nei modelli predefiniti. Ad esempio, i messaggi CDM_HIDECONTROL e CDM_SETCONTROLTEXT richiedono un identificatore di controllo.

Nella tabella seguente vengono illustrati gli identificatori dei controlli standard nelle finestre di dialogo Apri e Salva con nome in stile Esplora risorse. Gli identificatori sono costanti definite in Dlgs.h e Winuser.h.

Identificatore del controllo Descrizione del controllo
chx1 Casella di controllo di sola lettura
cmb1 Casella combinata a discesa che visualizza l'elenco dei filtri di tipo file
stc2 Etichetta per la casella combinata cmb1
cmb2 Casella combinata a discesa che visualizza l'unità o la cartella corrente e che consente all'utente di selezionare un'unità o una cartella da aprire
stc4 Etichetta per la casella combinata cmb2
cmb13 Casella combinata a discesa che visualizza il nome del file corrente, consente all'utente di digitare il nome di un file da aprire e selezionare un file aperto o salvato di recente. Si tratta di applicazioni compatibili con Explorer precedenti senza hook o modello di finestra di dialogo. Confrontare con edt1.
edt1 Modifica controllo che visualizza il nome del file corrente o consente all'utente di digitare il nome del file da aprire. Confrontare con cmb13.
stc3 Etichetta per la casella combinata cmb13 e il controllo di modifica edt1
lst1 Casella di riepilogo che visualizza il contenuto dell'unità o della cartella corrente
stc1 Etichetta per la casella di riepilogo lst1
IDOK Pulsante di comando OK (pulsante di selezione)
IDCANCEL Pulsante di comando Annulla (pulsante di selezione)
pshHelp Pulsante di comando della Guida (pulsante di selezione)

 

Personalizzazione delle finestre di dialogo Old-Style

È possibile personalizzare una finestra di dialogo Apri o Salva con nome precedente specificando una routine hook OFNHookProcOldStyle che riceve messaggi o notifiche destinati alla procedura predefinita della finestra di dialogo. È anche possibile specificare un modello personalizzato da usare al posto del modello predefinito. Le procedure hook e i modelli usati con le finestre di dialogo in stile precedente sono simili a quelli usati con le altre finestre di dialogo comuni. Per altre informazioni, vedere Procedure hook per finestre di dialogo comuni e modelli personalizzati.

Per abilitare una routine hook per una finestra di dialogo Apri o Salva con nome precedente, utilizzare la struttura OPENFILENAME quando si crea la finestra di dialogo. Impostare il flag OFN_ENABLEHOOK nel membro Flags e specificare l'indirizzo di una routine hook OFNHookProcOldStyle nel membro lpfnHook . La procedura della finestra di dialogo invia un messaggio WM_INITDIALOG alla routine di hook con il parametro Param impostato sull'indirizzo della struttura OPENFILENAME utilizzata per inizializzare la finestra di dialogo.

È possibile utilizzare la struttura OPENFILENAME per specificare un modello personalizzato per la finestra di dialogo Apri o Salva con nome da utilizzare al posto del modello predefinito. Se il modello personalizzato è una risorsa in un'applicazione o in una libreria a collegamento dinamico, impostare il flag OFN_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 personalizzato è già in memoria, impostare il flag OFN_ENABLETEMPLATEHANDLE e usare il membro hInstance per identificare l'oggetto memoria che contiene il modello. Creare il modello personalizzato modificando il modello predefinito specificato nel file Fileopen.dlg. Gli identificatori di controllo usati nei modelli di finestra di dialogo Trova e sostituisci predefiniti sono definiti nel file Dlgs.h.

Per impostazione predefinita, le funzioni GetOpenFileName e GetSaveFileName visualizzano le finestre di dialogo in stile Explorer. Se si desidera visualizzare una finestra di dialogo in stile precedente, è necessario fornire una routine hook OFNHookProcOldStyle e assicurarsi che il flag di OFN_EXPLORER non sia impostato nel membro Flags della struttura OPENFILENAME .

Se si imposta il flag di OFN_EXPLORER , il sistema considera una routine hook o un modello personalizzato come personalizzazione in stile Explorer. Per informazioni sulla personalizzazione di una finestra di dialogo in stile Esplora risorse, vedere Modelli personalizzati in stile Esplora risorse.

Vedi anche