Informazioni sull'interfaccia a documenti multipli
Ogni documento in un'applicazione MDI (Multiple Document Interface) viene visualizzato in una finestra figlio separata all'interno dell'area client della finestra principale dell'applicazione. Le applicazioni MDI tipiche includono applicazioni di elaborazione delle parole che consentono all'utente di lavorare con più documenti di testo e applicazioni di foglio di calcolo che consentono all'utente di lavorare con più grafici e fogli di calcolo. Per altre informazioni, vedere gli argomenti seguenti.
- frame, client e finestre figlio
- Creazione delle finestre figlie
- Attivazione della Finestra Figlia
- Menu multipli per documenti
- Acceleratori Multipli di Documenti
- dimensione e disposizione della finestra figlia
- Icona Titolo Windows
- Dati della Finestra Figlio
Frame, Client e Windows figlio
Un'applicazione MDI ha tre tipi di finestre: una finestra di struttura, una finestra client MDI e una serie di finestre secondarie. La finestra cornice è simile alla finestra principale dell'applicazione: ha un bordo di ridimensionamento, una barra del titolo, un menu finestra, un pulsante di minimizzazione e un pulsante di ingrandimento. L'applicazione deve registrare una classe di finestra per la finestra cornice e fornire una procedura di finestra per supportarla.
Un'applicazione MDI non visualizza l'output nell'area client della finestra cornice. Visualizza invece la finestra del client MDI. Un finestra del client MDI è un tipo speciale di finestra figlio appartenente alla classe finestra preregistrata MDICLIENT. La finestra client è un elemento figlio della finestra di cornice; funge da sfondo per le finestre figlio. Fornisce inoltre supporto per la creazione e la modifica di finestre figlio. Ad esempio, un'applicazione MDI può creare, attivare o ingrandire le finestre figlio inviando messaggi al cliente MDI.
Quando l'utente apre o crea un documento, la finestra client crea una finestra figlio per il documento. La finestra client è la finestra principale di tutte le finestre figlio MDI dell'applicazione. Ogni finestra figlia ha un bordo di ridimensionamento, una barra del titolo, un menu finestra, un pulsante di riduzione a icona e un pulsante massimizza. Poiché una finestra figlia è limitata, è confinata alla finestra principale e non può essere visualizzata al di fuori di quella principale.
Un'applicazione MDI può supportare più di un tipo di documento. Ad esempio, un'applicazione di foglio di calcolo tipica consente all'utente di lavorare con grafici e fogli di calcolo. Per ogni tipo di documento supportato, un'applicazione MDI deve registrare una classe finestra figlio e fornire una routine finestra per supportare le finestre appartenenti a tale classe. Per altre informazioni sulle classi di finestre, vedere classi finestra . Per altre informazioni sulle procedure di finestra, vedere Window Procedures.
Di seguito è riportata una tipica applicazione MDI. È denominato Multipad.
Creazione della finestra figlia
Per creare una finestra figlio, un'applicazione MDI chiama la funzione CreateMDIWindow o invia il messaggio di WM_MDICREATE alla finestra del client MDI. Un modo più efficiente per creare una finestra figlio MDI consiste nel chiamare la funzioneCreateWindowEx, specificando lo stile esteso WS_EX_MDICHILD.
Per eliminare definitivamente una finestra figlio, un'applicazione MDI invia un messaggio WM_MDIDESTROY alla finestra del client MDI.
Attivazione finestra figlio
Qualsiasi numero di finestre figlie può essere visualizzato nella finestra client in qualsiasi momento, ma solo una può essere attiva. La finestra figlio attiva viene posizionata davanti a tutte le altre finestre figlio e il bordo è evidenziato.
L'utente può attivare una finestra figlia inattiva facendo clic su di essa. Un'applicazione MDI attiva una finestra figlia inviando un messaggio di WM_MDIACTIVATE alla finestra del client MDI. Quando la finestra client elabora questo messaggio, invia un messaggio WM_MDIACTIVATE alla routine finestra della finestra figlio da attivare e alla routine finestra della finestra figlio in fase di disattivazione.
Per impedire l'attivazione di una finestra figlia, gestire il messaggio di WM_NCACTIVATE della finestra figlia restituendo FALSE.
Il sistema tiene traccia della posizione di ogni finestra figlia nello stack di finestre sovrapposte. Questa sovrapposizione è nota come Z-Order. L'utente può attivare la finestra secondaria successiva nell'ordine di livello Z facendo clic su Avanti dal menu della finestra attiva. Un'applicazione attiva la finestra figlio successiva (o precedente) nell'ordine Z inviando un messaggio WM_MDINEXT alla finestra client.
Per recuperare l'handle della finestra figlia attiva, l'applicazione MDI invia un messaggio WM_MDIGETACTIVE alla finestra client.
Menu a più documenti
La finestra cornice di un'applicazione MDI deve includere una barra dei menu con un menu finestra. Il menu della finestra deve includere voci che dispongono le finestre figlio all'interno della finestra client o che chiudono tutte le finestre figlio. Il menu della finestra di una tipica applicazione MDI può includere gli elementi nella tabella seguente.
Voce di menu | Scopo |
---|---|
Riquadro | Dispone le finestre figlio in un formato di riquadro in modo che ognuna venga visualizzata nell'intera finestra del client. |
cascata | Dispone le finestre figlio in un formato a cascata. Le finestre secondarie si sovrappongono tra loro, ma la barra del titolo di ognuna è visibile. |
Disporre Icone | Dispone le icone delle finestre figlio ridotte a icona lungo la parte inferiore della finestra del client. |
Chiudi tutto | Chiude tutte le finestre figlie. |
Ogni volta che viene creata una finestra figlio, il sistema aggiunge automaticamente una nuova voce di menu al menu della finestra. Il testo della voce di menu è uguale al testo nella barra dei menu della nuova finestra figlia. Facendo clic sulla voce di menu, l'utente può attivare la finestra secondaria corrispondente. Quando una finestra secondaria viene eliminata, il sistema rimuove automaticamente la voce di menu corrispondente dal menu della finestra.
Il sistema può aggiungere fino a dieci voci di menu al menu della finestra. Quando viene creata la decima finestra figlio, il sistema aggiunge l'opzione Altre Finestre al menu della finestra. Facendo clic su questo elemento viene visualizzata la finestra di dialogo Seleziona finestra. La finestra di dialogo contiene una casella di riepilogo con i titoli di tutte le finestre figlio MDI attualmente disponibili. L'utente può attivare una finestra figlia facendo clic sul titolo nell'elenco.
Se l'applicazione MDI supporta diversi tipi di finestre figlio, adattare la barra dei menu in modo da riflettere le operazioni associate alla finestra attiva. A tale scopo, specificare risorse di menu separate per ogni tipo di finestra figlio supportata dall'applicazione. Quando viene attivato un nuovo tipo di finestra figlia, l'applicazione deve inviare un messaggio di WM_MDISETMENU alla finestra client, passando l'handle relativo al menu corrispondente.
Se non esiste alcuna finestra figlio, la barra dei menu deve contenere solo gli elementi utilizzati per creare o aprire un documento.
Quando l'utente passa attraverso i menu di un'applicazione MDI usando i tasti di cursore, i tasti si comportano in modo diverso rispetto a quando l'utente si sposta attraverso i menu di un'applicazione tipica. In un'applicazione MDI, il controllo passa dal menu della finestra dell'applicazione al menu della finestra figlio attiva e quindi alla prima voce sulla barra dei menu.
Acceleratori di documenti multipli
Per ricevere ed elaborare i tasti di scelta rapida per le finestre figlio, un'applicazione MDI deve includere la funzione TranslateMDISysAccel nel ciclo dei messaggi. Il ciclo deve chiamare TranslateMDISysAccel prima di chiamare la funzione TranslateAccelerator o DispatchMessage.
I tasti di scelta rapida nel menu della finestra per una finestra figlio MDI sono diversi da quelli per una finestra figlio non MDI. In una finestra figlio MDI, la combinazione di tasti ALT+ - (meno) apre il menu della finestra, la combinazione di tasti CTRL+F4 chiude la finestra figlio attiva e la combinazione di tasti CTRL+F6 attiva la finestra figlio successiva.
Dimensioni e disposizione della finestra figlia
Un'applicazione MDI controlla le dimensioni e la posizione delle finestre figlio inviando messaggi alla finestra del client MDI. Per ingrandire la finestra figlio attiva, l'applicazione invia il messaggio WM_MDIMAXIMIZE alla finestra client. Quando una finestra figlio è massimizzata, l'area client riempie completamente la finestra del client MDI. Inoltre, il sistema nasconde automaticamente la barra del titolo della finestra figlio e aggiunge l'icona del menu della finestra figlio e il pulsante Ripristina alla barra dei menu dell'applicazione MDI. L'applicazione può ripristinare la finestra client alle dimensioni originali (premaximized) e alla posizione inviando alla finestra client un messaggio di WM_MDIRESTORE.
Un'applicazione MDI può disporre le finestre figlio in un formato a cascata o a riquadri. Quando le finestre figlio vengono disposte a cascata, le finestre vengono visualizzate in una pila. La finestra in fondo allo stack occupa l'angolo superiore sinistro dello schermo e le finestre rimanenti vengono spostate verticalmente e orizzontalmente in modo che il bordo sinistro e la barra del titolo di ciascuna finestra figlia siano visibili. Per disporre le finestre figlie nel formato a cascata, un'applicazione MDI invia il messaggio di WM_MDICASCADE. In genere, l'applicazione invia questo messaggio quando l'utente fa clic Cascade nel menu della finestra.
Quando le finestre figlio vengono piastrellate, il sistema visualizza ogni finestra figlio nella sua interezza, senza sovrapporre nessuna delle finestre. Tutte le finestre sono ridimensionate, se necessario, per adattarsi all'interno della finestra client. Per disporre le finestre figlie nel formato a riquadri, un'applicazione MDI invia un messaggio WM_MDITILE alla finestra client. In genere, l'applicazione invia questo messaggio quando l'utente fa clic riquadro nel menu della finestra.
Un'applicazione MDI deve fornire un'icona diversa per ogni tipo di finestra figlio supportata. L'applicazione specifica un'icona durante la registrazione della classe di finestra figlio. Il sistema visualizza automaticamente l'icona di una finestra figlia nella parte inferiore della finestra del client quando la finestra figlia è ridotta a icona. Un'applicazione MDI indirizza il sistema a disporre le icone delle finestre figlie inviando un messaggio WM_MDIICONARRANGE alla finestra client. In genere, l'applicazione invia questo messaggio quando l'utente fa clic Disponi icone nel menu della finestra.
Titolo icona delle finestre
Poiché le finestre figlio MDI possono essere ridotte a icona, un'applicazione MDI deve evitare di modificare i titoli delle icone come se fossero normali finestre figlio MDI. Le finestre con titolo icona vengono visualizzate quando l'applicazione enumera le finestre figlio della finestra del client MDI. Le finestre icona del titolo differiscono da altre finestre figlio, ma sono gestite da una MDI finestra figlio.
Per determinare se una finestra figlia è la finestra del titolo di un'icona, usare la funzione GetWindow con l'indice GW_OWNER. Le finestre non titolo restituiscono NULL. Si noti che questo test non è sufficiente per le finestre di primo livello, perché i menu e le finestre di dialogo sono finestre di proprietà.
Dati finestra figlia
Poiché il numero di finestre figlio varia a seconda del numero di documenti aperti dall'utente, un'applicazione MDI deve essere in grado di associare i dati (ad esempio, il nome del file corrente) a ogni finestra figlio. Esistono due modi per eseguire questa operazione:
- Archivia i dati della finestra figlia nella struttura della finestra.
- Usare le proprietà della finestra.
Struttura della finestra
Quando un'applicazione MDI registra una classe window, può riservare spazio aggiuntivo nella struttura della finestra per i dati dell'applicazione specifici di questa particolare classe di finestre. Per archiviare e recuperare i dati in questo spazio aggiuntivo, l'applicazione usa le funzioni di GetWindowLong e SetWindowLong.
Per mantenere una quantità elevata di dati per una finestra figlia, un'applicazione può allocare memoria per una struttura di dati e quindi archiviare l'handle della memoria contenente la struttura nello spazio extra associato alla finestra figlia.
Proprietà finestra
Un'applicazione MDI può anche archiviare i dati per documento usando le proprietà della finestra. dati per-documento sono dati specifici del tipo di documento contenuto in una determinata finestra figlia. Le proprietà sono diverse dallo spazio aggiuntivo nella struttura della finestra in quanto non è necessario allocare spazio aggiuntivo durante la registrazione della classe della finestra. Una finestra può avere un numero qualsiasi di proprietà. Inoltre, dove gli offset vengono usati per accedere allo spazio aggiuntivo nelle strutture delle finestre, le proprietà vengono definite dai nomi di stringa. Per altre informazioni sulle proprietà della finestra, vedere Proprietà della finestra.