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 ulteriori informazioni, vedere gli argomenti seguenti.

Frame, client e finestre figlio

Un'applicazione MDI ha tre tipi di finestre: una finestra cornice, una finestra client MDI e una serie di finestre figlio. La finestra cornice è simile alla finestra principale dell'applicazione: ha un bordo di ridimensionamento, una barra del titolo, un menu finestra, un pulsante a icona a icona e un pulsante ingrandisci. L'applicazione deve registrare una classe finestra per la finestra cornice e fornire una routine finestra per supportarla.

Un'applicazione MDI non visualizza l'output nell'area client della finestra cornice. Visualizza invece la finestra del client MDI. Una finestra client MDI è un tipo speciale di finestra figlio appartenente alla classe finestra preregistrata MDICLIENT. La finestra client è un elemento figlio della finestra 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 alla finestra del client MDI.

Quando l'utente apre o crea un documento, la finestra client crea una finestra figlio per il documento. La finestra client è la finestra padre di tutte le finestre figlio MDI nell'applicazione. Ogni finestra figlio ha un bordo di ridimensionamento, una barra del titolo, un menu finestra, un pulsante di riduzione a icona e un pulsante ingrandisci. Poiché una finestra figlio viene ritagliata, è limitata alla finestra del client e non può essere visualizzata al di fuori di essa.

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 finestra, vedere Classi finestra. Per altre informazioni sulle procedure delle finestre, vedere Window Procedures.

Di seguito è riportata una tipica applicazione MDI. È denominato Multipad.

finestra cornice dell'applicazione mdi multipad e finestra client

Creazione della finestra figlio

Per creare una finestra figlio, un'applicazione MDI chiama la funzione CreateMDIWindow o invia il messaggio WM_MDICREATE alla finestra del client MDI. Un modo più efficiente per creare una finestra figlio MDI consiste nel chiamare la funzione CreateWindowEx , 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 figlio può essere visualizzato nella finestra client in qualsiasi momento, ma solo uno può essere attivo. La finestra figlio attiva è posizionata davanti a tutte le altre finestre figlio e il bordo è evidenziato.

L'utente può attivare una finestra figlio inattiva facendo clic su di essa. Un'applicazione MDI attiva una finestra figlio inviando un messaggio WM_MDIACTIVATE alla finestra del client MDI. Quando la finestra client elabora questo messaggio, invia un messaggio WM_MDIACTIVATE alla routine della finestra figlio da attivare e alla routine della finestra figlio da disattivare.

Per impedire l'attivazione di una finestra figlio, gestire il messaggio WM_NCACTIVATE alla finestra figlio restituendo FALSE.

Il sistema tiene traccia della posizione di ogni finestra figlio nello stack di finestre sovrapposte. Questo stacking è noto come Z-Order. L'utente può attivare la finestra figlio successiva nell'ordine Z facendo clic su Avanti dal menu della finestra nella finestra attiva. Un'applicazione attiva la finestra figlio successiva (o precedente) nell'ordine Z inviando un messaggio di WM_MDINEXT alla finestra client.

Per recuperare l'handle nella finestra figlio attiva, l'applicazione MDI invia un messaggio WM_MDIGETACTIVE alla finestra del client.

Menu documenti multipli

La finestra cornice di un'applicazione MDI deve includere una barra dei menu con un menu della 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
Tile 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 catena. Le finestre figlio si sovrappongono l'una all'altra, ma la barra del titolo di ognuno è visibile.
Disponi icone Dispone le icone delle finestre figlio ridotte a icona lungo la parte inferiore della finestra client.
Chiudi tutto Chiude tutte le finestre figlio.

 

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 corrisponde al testo nella barra dei menu della nuova finestra figlio. Facendo clic sulla voce di menu, l'utente può attivare la finestra figlio corrispondente. Quando una finestra figlio viene eliminata definitivamente, 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 la voce Altro windows 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 figlio facendo clic sul titolo nella casella di riepilogo.

Se l'applicazione MDI supporta diversi tipi di finestre figlio, personalizzare 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 figlio, l'applicazione deve inviare un messaggio di WM_MDISETMENU alla finestra client, passandolo all'handle al menu corrispondente.

Quando 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 passa 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 nella 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 di 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 figlio

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 è ingrandita, 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 le dimensioni e la posizione originali della finestra del client inviando alla finestra del client un messaggio WM_MDIRESTORE .

Un'applicazione MDI può disporre le finestre figlio in un formato a catena o riquadro. Quando le finestre figlio vengono propagate, le finestre vengono visualizzate in uno stack. La finestra nella parte inferiore dello 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 ogni finestra figlio siano visibili. Per disporre le finestre figlio nel formato a catena, un'applicazione MDI invia il messaggio di WM_MDICASCADE . In genere, l'applicazione invia questo messaggio quando l'utente fa clic su Cascade nel menu della finestra.

Quando le finestre figlio vengono riquadri, il sistema visualizza ogni finestra figlio nella relativa interezza, sovrapponendo nessuno delle finestre. Tutte le finestre sono ridimensionate, in base alle esigenze, per adattarsi all'interno della finestra client. Per disporre finestre figlio nel formato riquadro, un'applicazione MDI invia un messaggio WM_MDITILE alla finestra client. In genere, l'applicazione invia questo messaggio quando l'utente fa clic su 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 finestra figlio. Il sistema visualizza automaticamente l'icona della finestra figlio nella parte inferiore della finestra client quando la finestra figlio viene ridotta al minimo. Un'applicazione MDI indirizza il sistema per organizzare le icone della finestra figlio inviando un messaggio di WM_MDIICONARRANGE alla finestra client. In genere, l'applicazione invia questo messaggio quando l'utente fa clic su Disponi icone nel menu della finestra.

Finestra titolo icona

Poiché le finestre figlio MDI possono essere ridotte al minimo, un'applicazione MDI deve evitare di modificare le finestre del titolo dell'icona come se fossero normali finestre figlio MDI. Le finestre del titolo dell'icona vengono visualizzate quando l'applicazione enumera le finestre figlio della finestra del client MDI. Le finestre del titolo dell'icona differiscono da altre finestre figlio, tuttavia, in quanto sono di proprietà di una finestra figlio MDI.

Per determinare se una finestra figlio è una finestra del titolo 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 figlio

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. A questo scopo è possibile procedere in due modi:

  • Archiviare i dati della finestra figlio nella struttura della finestra.
  • Usare le proprietà della finestra.

Struttura finestra

Quando un'applicazione MDI registra una classe finestra, può riservare spazio aggiuntivo nella struttura della finestra per i dati dell'applicazione specifici di questa determinata classe di finestre. Per archiviare e recuperare i dati in questo spazio aggiuntivo, l'applicazione usa le funzioni GetWindowLong e SetWindowLong.

Per mantenere una grande quantità di dati per una finestra figlio, un'applicazione può allocare memoria per una struttura di dati e quindi archiviare l'handle nella memoria contenente la struttura nello spazio aggiuntivo associato alla finestra figlio.

Proprietà finestra

Un'applicazione MDI può anche archiviare i dati per documento usando le proprietà della finestra. I dati per documento sono specifici del tipo di documento contenuto in una determinata finestra figlio. Le proprietà sono diverse dallo spazio aggiuntivo nella struttura della finestra in cui non è necessario allocare spazio aggiuntivo durante la registrazione della classe di 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à finestra.