TN029: finestre con separatore
Questa nota descrive la classe CSplitterWnd MFC, che fornisce suddivisioni delle finestre e gestisce il ridimensionamento di altre finestre del riquadro.
Stili splitter
Un CSplitterWnd
oggetto supporta due stili diversi di finestre di suddivisione.
In "splitter statici" la finestra di divisione crea i riquadri al momento della creazione. L'ordine e il numero di riquadri non cambiano mai. Le barre di divisione vengono usate per ridimensionare i diversi riquadri. È possibile usare questo stile per visualizzare una classe di visualizzazione diversa in ogni riquadro. L'editor di grafica di Visual C++ e Gestione file di Windows sono esempi di programmi che usano questo stile di suddivisione. Questo stile di finestra di divisione non usa caselle di divisione.
In "splitter dinamici" vengono creati e eliminati definitivamente i riquadri aggiuntivi quando l'utente divide e separa le nuove visualizzazioni. Questo splitter inizia con una singola visualizzazione e fornisce caselle di divisione per l'utente per avviare la suddivisione. La finestra di divisione crea dinamicamente un nuovo oggetto visualizzazione quando la visualizzazione viene divisa in una direzione. Questo nuovo oggetto visualizzazione rappresenta il nuovo riquadro. Se la visualizzazione viene divisa in due direzioni usando l'interfaccia della tastiera, la finestra di divisione crea tre nuovi oggetti visualizzazione per i tre nuovi riquadri. Mentre la divisione è attiva, Windows visualizza la casella di divisione come barra di divisione tra i riquadri. Windows elimina definitivamente gli oggetti di visualizzazione aggiuntivi quando l'utente rimuove una divisione, ma la visualizzazione originale rimane fino a quando la finestra di divisione stessa non viene eliminata definitivamente. Microsoft Excel e Microsoft Word sono esempi di applicazioni che usano lo stile splitter dinamico.
Quando si crea un tipo di finestra di divisione, è necessario specificare il numero massimo di righe e colonne che il divisore gestirà. Un separatore statico creerà riquadri per riempire tutte le righe e le colonne. Una divisione dinamica creerà solo il primo riquadro quando CSplitterWnd
viene creato .
Il numero massimo di riquadri che è possibile specificare per i splitter statici è di 16 righe per 16 colonne. Le configurazioni consigliate sono:
1 riga x 2 colonne: in genere con riquadri diversi
2 righe x 1 colonna : in genere con riquadri diversi
2 righe x 2 colonne: in genere con riquadri simili
Il numero massimo di riquadri che è possibile specificare per i splitter dinamici è di 2 righe per 2 colonne. Le configurazioni consigliate sono:
1 riga x 2 colonne: per i dati a colonne
2 righe x 1 colonna: per dati testuali o di altro tipo
2 righe x 2 colonne: per i dati orientati alla griglia o alla tabella
Esempi di splitter
Molti dei programmi di esempio MFC usano finestre di divisione direttamente o indirettamente. L'esempio MFC General VIEWEX illustra diversi usi di splitter statici, tra cui come posizionare un separatore in un separatore.
È anche possibile usare ClassWizard per creare una nuova classe finestra cornice figlio MDI (Document Interface) contenente una finestra di divisione. Per altre informazioni sulle finestre di suddivisione, vedere Più tipi di documento, visualizzazioni e finestre cornice.
Terminologia usata dall'implementazione
Di seguito è riportato un elenco di termini specifici per le finestre di divisione:
CSplitterWnd
: finestra che fornisce controlli di divisione del riquadro e barre di scorrimento condivise tra tutti i riquadri di una riga o di una colonna. Si specificano righe e colonne con numeri in base zero (il primo riquadro è riga = 0 e colonna = 0).
Riquadro: finestra specifica dell'applicazione gestita da un oggetto CSplitterWnd
. Un riquadro è in genere un oggetto derivato dalla classe CView, ma può essere qualsiasi oggetto CWnd con l'ID finestra figlio appropriato.
Per usare un CWnd
oggetto derivato da , passare la RUNTIME_CLASS dell'oggetto alla CreateView
funzione come si farebbe se si usasse una CView
classe derivata da . La classe deve usare DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE perché il framework usa la creazione dinamica in fase di esecuzione. Anche se è presente un sacco di codice specifico CSplitterWnd
per la CView
classe , CObject::IsKindOf viene sempre usato prima di eseguire tali azioni.
Barra di divisione: controllo posizionato tra righe e colonne di riquadri. Può essere usato per regolare le dimensioni delle righe o delle colonne di riquadri.
Splitter Box: controllo in un controllo dinamico CSplitterWnd
che è possibile usare per creare nuove righe o colonne di riquadri. Si trova nella parte superiore delle barre di scorrimento verticali o a sinistra delle barre di scorrimento orizzontale.
Intersezione splitter: intersezione di una barra di divisione verticale e una barra di divisione orizzontale. È possibile trascinarlo per regolare le dimensioni di una riga e di una colonna di riquadri contemporaneamente.
Barre di scorrimento condivise
La CSplitterWnd
classe supporta anche le barre di scorrimento condivise. Questi controlli barra di scorrimento sono elementi figlio di CSplitterWnd
e vengono condivisi con i diversi riquadri nel separatore.
Ad esempio, in una finestra di 1 riga x 2 colonna, è possibile specificare WS_VSCROLL durante la creazione di CSplitterWnd
. Windows crea un controllo speciale barra di scorrimento condiviso tra i due riquadri.
[ ][ ][^]
[pane00][pane01][|]
[ ][ ][v]
Quando l'utente sposta la barra di scorrimento, WM_VSCROLL messaggi verranno inviati a entrambe le visualizzazioni. Quando una delle due visualizzazioni imposta la posizione della barra di scorrimento, verrà impostata la barra di scorrimento condivisa.
Si noti che le barre di scorrimento condivise sono più utili con oggetti di visualizzazione simili. Se si combinano visualizzazioni di tipi diversi in un separatore, potrebbe essere necessario scrivere codice speciale per coordinare le posizioni di scorrimento. Qualsiasi CView
classe derivata da che usa le API della CWnd
barra di scorrimento delega alla barra di scorrimento condivisa, se presente. L'implementazione CScrollView
è un esempio di una CView
classe che supporta le barre di scorrimento condivise. Le classi non derivate da CView
, classi che si basano su barre di scorrimento non di controllo o classi che usano implementazioni standard di Windows (ad esempio, CEditView
) non funzioneranno con la funzionalità della barra di scorrimento condivisa di CSplitterWnd
.
Dimensioni minime
Per ogni riga è presente un'altezza minima della riga e per ogni colonna è presente una larghezza minima della colonna. Questo minimo garantisce che un riquadro non sia troppo piccolo da visualizzare in dettaglio completo.
Per una finestra di divisione statica, l'altezza minima iniziale della riga e la larghezza della colonna sono pari a 0. Per una finestra di divisione dinamica, l'altezza minima iniziale della riga e la larghezza della colonna vengono impostate dal parametro sizeMin della CSplitterWnd::Create
funzione.
È possibile modificare queste dimensioni minime usando le funzioni CSplitterWnd::SetRowInfo e CSplitterWnd::SetColumnInfo .
Dimensioni effettive e ideali
Il layout dei riquadri nella finestra di divisione dipende dalle dimensioni del frame che li contiene. Quando un utente ridimensiona la cornice contenitore, CSplitterWnd
riposiziona e ridimensiona i riquadri in modo che si adattino al più possibile.
L'utente può impostare manualmente le dimensioni dell'altezza della riga e della larghezza delle colonne oppure il programma può impostare le dimensioni ideali usando la CSplitterWnd
classe . Le dimensioni effettive possono essere inferiori o maggiori dell'ideale. Windows regola le dimensioni effettive se non c'è spazio sufficiente per visualizzare le dimensioni ideali o se c'è troppo spazio vuoto a destra o nella parte inferiore della finestra di divisione.
Controlli personalizzati
È possibile eseguire l'override di molte funzioni per fornire un comportamento personalizzato e un'interfaccia personalizzata. È possibile eseguire l'override di questo primo set per fornire immagini alternative per i vari componenti grafici di una finestra di divisione.
virtual void OnDrawSpltter(CDC* pDC, ESplitType nType, const CRect& rect);
virtual void OnInvertTracker(const CRect& rect);
Questa funzione viene chiamata per creare un controllo barra di scorrimento condiviso. È possibile eseguirne l'override per creare controlli aggiuntivi accanto alla barra di scorrimento.
virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);
Queste funzioni implementano la logica della finestra di divisione dinamica. È possibile eseguire l'override di questi elementi per fornire una logica di suddivisione più avanzata.
virtual void DeleteView(int row, int col);
virtual BOOL SplitRow(int cyBefore);
virtual BOOL SplitColumn(int cxBefore);
virtual void DeleteRow(int rowDelete);
virtual void DeleteColumn(int colDelete);
Funzionalità CView
La CView
classe usa i comandi generali seguenti per delegare all'implementazione CSplitterWnd
. Poiché questi comandi sono virtuali, l'implementazione standard CView
non richiederà che l'intera CSplitterWnd
implementazione sia collegata. Per le applicazioni che usano CView
ma non CSplitterWnd
, l'implementazione CSplitterWnd
non verrà collegata all'applicazione.
virtual BOOL CanActivateNext(BOOL bPrev = FALSE);
Controlla se ID_NEXT_PANE o ID_PREV_PANE è attualmente possibile.
virtual void ActivateNext(BOOL bPrev = FALSE);
Esegue il comando "Riquadro successivo" o "Riquadro precedente".
virtual BOOL DoKeyboardSplit();
Esegue il comando di divisione della tastiera, in genere "Divisione finestra".