Questa nota viene descritta la classe MFC CSplitterWnd , che viene utilizzata per fornire finestra spaccature e gestire il ridimensionamento delle altre finestre di vetro.
&Notanbsp; si prega di assicurarsi di leggere 20 nota tecnica riguardo all'uso del gamme ID valide e ID.
Sdoppiatore stili
Un CSplitterWnd supporta due diversi stili di scissione windows.
In "statico Splitter," i riquadri vengono creati quando viene creata la finestra con separatore e l'ordine e il numero di riquadri non cambiano mai. Bar splitter sono utilizzate per ridimensionare i diversi riquadri e i diversi riquadri sono di solito delle classi di opinione diversa. L'editor di grafica di Visual C++ e il File Manager di Windows sono esempi di programmi che utilizzano questo stile splitter. Scatole Splitter non sono utilizzati da questo stile di splitter.
In "Dynamic Splitter," riquadri supplementari vengono creati e distrutti viste nuove spaccature e ONU-spaccature utente. Questo sdoppiatore inizia con un'unica vista e scatole di splitter sono forniti di avviare la scissione. Se la vista è suddiviso in una sola direzione, in modo dinamico viene creato un oggetto visualizzazione aggiuntiva per rappresentare il nuovo riquadro. Se la vista è suddiviso in due direzioni (possibile con l'interfaccia di tastiera), tre nuove viste vengono create per rappresentare i tre riquadri nuovi. Quando la scissione è attiva, la casella splitter è disegnata come una barra di divisione tra i riquadri. Ulteriore vista gli oggetti vengono eliminati quando l'utente rimuove una scissione, ma vista originale (riga 0, column 0) rimane fino a quando la finestra stessa viene distrutto. Microsoft Excel o Microsoft Word sono esempi dello stile dinamico splitter.
Durante la creazione di entrambi i tipi di finestra, è necessario specificare il numero massimo di righe e colonne in grado di gestirà lo splitter. Per un separatore statico, è necessario creare riquadri per riempire tutte le righe e le colonne. Per uno splitter dinamico, primo riquadro viene creato automaticamente quando viene creato il CSplitterWnd.
Il numero massimo di riquadri che è possibile specificare per statico Splitter è di 16 righe da 16 colonne. Le configurazioni consigliate sono:
Il numero massimo di riquadri che è possibile specificare per Splitter dinamico è 2 righe da 2 colonne. Le configurazioni consigliate sono:
Esempi di Splitter
Molti dei programmi di esempio MFC utilizzare CreateStatic direttamente o indirettamente. Fase 4 dell'esercitazione MFC SCARABOCCHIARE aggiunge una finestra con separatore dinamico per dividere il CScribView in più riquadri. Come mostrato in questo passaggio, l'aggiunta di che una nuova finestra con separatore telaio è molto facile con la funzionalità Aggiungi classe di ClassWizard. Questo esempio è una finestra con separatore dinamico per impostazione predefinita.
Il campione generale MFC VIEWEX illustra i diversi utilizzi della statica Splitter, incluse istruzioni per inserire una barra di divisione in uno splitter.
ClassWizard creerà un nuovo multiple document interface (MDI) bambino classe finestra cornice che contiene una finestra con separatore. Si prega di riferirsi a Splitter Windows nel manuale del programmatore di Visual C++.
Terminologia utilizzata dall'implementazione
Terminologia delle parti di un CSplitterWnd e oggetti correlati.
CSplitterWnd:
Questa è una finestra che fornisce i controlli nel riquadro-divisione e barre di scorrimento che sono condivise tra tutti i riquadri su una riga o colonna. Righe e colonne sono specificate con i numeri in base zero [primo riquadro è riga = 0 e la colonna = 0]
Nel riquadro:
U&na finestra specifica dell'applicazione che è gestita da un CSplitterWnd. Un riquadro è di solito un CView-oggetto derivato, ma in realtà può essere qualsiasi oggetto CWnd che ha la finestra figlio appropriato ID.nbsp;
Per farlo, semplicemente passare il RU&NTIME_CLASS di tuo CWnd classe derivata come se si stesse usando una derivata CView class.nbsp; La classe deve utilizzare DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE --il framework utilizza creazione dinamica in fase di esecuzione. Anche se c'è un sacco di codice che è CView specifici in CSplitterWnd, CObject::IsKindOf viene sempre utilizzato prima che tali azioni vengono eseguite. Certo, è molto più facile da usare CSplitterWnd con classi derivata CView che CWnd classi derivate.
Barra di divisione:
Un controllo che è posta tra le righe e le colonne dei riquadri. Può essere usato per regolare le dimensioni delle righe o delle colonne dei riquadri.
Splitter Box:
Un piccolo controllo nella parte superiore delle barre di scorrimento verticale o a sinistra delle barre di scorrimento orizzontale in un dinamico CSplitterWnd. Utilizzato per creare nuove righe o colonne di riquadri.
Sdoppiatore intersezione:
L'intersezione di una barra di divisione verticale e una barra di divisione orizzontale. Possono essere trascinati per regolare le dimensioni di una riga e la colonna dei riquadri simultaneamente.
Condivise le barre di scorrimento
La classe CSplitterWnd supporta anche le barre di scorrimento condivisa. Questi controlli di barra di scorrimento sono figli della CSplitterWnd e sono condivise con i diversi riquadri nello splitter.
Ad esempio, in una finestra di colonna 1 riga x 2, è possibile specificare WS_VSCROLL quando si crea la CSplitterWnd. Verrà creato un controllo barra di scorrimento speciale che viene 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 il punto di vista imposta la posizione della barra di scorrimento, la barra di scorrimento condivisa verrà impostata.
Notare che le barre di scorrimento condivisa sono più utili con spaccature dinamici o statici, scissione oggetti simili. Se mescolare visualizzazioni di diversi tipi in uno splitter, allora si può avere scrivere codice speciale per coordinare la loro posizione di scorrimento. Qualsiasi CView-classe derivata che utilizza le API delegherà la barra di scorrimento condivisa se esiste la barra di scorrimento CWnd . L'implementazione di CScrollView è un esempio di una classe CView che supporta condiviso le barre di scorrimento. Non -CView derivato classi, classi che si basano su barre di scorrimento trasferite o classi che utilizzano Windows standard implementazioni (ad esempio, CEditView) non funzionerà con la funzionalità di barra di scorrimento condivisa di CSplitterWnd.
Taglie minime
Per ogni riga c'è un'altezza minima di fila, e analogamente per ogni colonna è una larghezza minima della colonna. Questo minimo è utilizzato per decidere se il riquadro è di piccole dimensioni per essere mostrato in dettaglio completo.
Per una finestra con separatore statico, la larghezza di riga iniziale minima altezza e colonna è 0. Per una finestra con separatore dinamico, la larghezza di riga iniziale minima altezza e colonna sono impostati dal parametro alla funzione CSplitterWnd sizeMin.
Queste dimensioni minime possono essere cambiate con il SetRowInfo e SetColumnInfo API.
Effettivo vs dimensioni ideale
La disposizione dei riquadri nella finestra splitter dipende dalle dimensioni del fotogramma che contiene (che a sua volta ridimensiona la CSplitterWnd. CSplitterWnd riposiziona e ridimensiona i riquadri in modo che si adattino idealmente come possibile).
La riga altezza colonna larghezza dimensioni e impostato dall'utente, oppure attraverso CSplitterWnd API, rappresentano la dimensione ideale. La dimensione effettiva può essere minore di quella dimensione ideale (se non c'è abbastanza spazio per rendere tale riquadro la dimensione ideale) o maggiore della dimensione ideale (se tale riquadro deve essere reso più grande per riempire lo spazio di sinistra-over a destra oppure inferiore della finestra splitter).
Interfaccia protetta
Quanto segue descrive alcuni della overridables di attuazione sdoppiatore finestra che può essere utilizzato da utenti esperti di CSplitterWnd per personalizzare le funzionalità e l'interfaccia utente di questa classe. Queste API sono ufficialmente privi di documenti e sono soggetti a cambiamenti nelle future versioni di MFC. Consultare il codice sorgente di attuazione per maggiori dettagli su questi implementazione API.
Disegno splitter bar, scatole e Tracker:
enum ESplitType nbsp; {splitBox, splitBar, splitIntersection, splitBorder};
virtual void OnDrawSplitter (CDC * pDC, ESplitType nType, CRect const & rect);
virtual void OnInvertTracker (const CRect & rect)
Queste funzioni virtuali possono essere sottoposto a override per fornire immagini alternative per i vari componenti grafici di una finestra con separatore. Le immagini predefinite sono simili allo splitter in Microsoft Works per Windows: solo le intersezioni dei bar splitter sono mescolate insieme. Le immagini sono anche molto diversa quando il quadro rileva Windows 4.0-- al fine di corrispondere gli elementi visivi in shell in tale sistema operativo (futuro).
Creazione di controlli e visualizzazioni:
virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID)
Questo è chiamato per creare un controllo barra di scorrimento condivisa. Esso può essere sovrascritto per includere comandi supplementari accanto a una barra di scorrimento. Il comportamento predefinito è quello di creare solo normali controlli di barra di scorrimento di Windows.
virtual void DeleteView (int row, int col);
Virtual BOOL SplitRow(int cyBefore);
Virtual BOOL SplitColumn(int cxBefore);
virtual void DeleteRow (int row);
virtual void DeleteColumn (int riga)
Queste funzioni sono chiamate per implementare la logica della finestra con separatore dinamico (cioè, se la finestra con separatore ha lo stile SPLS_DYNAMIC_SPLIT ). Essi possono essere personalizzate, insieme con la funzione virtuale CreateView, implementare più avanzati Splitter dinamico.
Di seguito sono riportati i comandi ad alto livelli che vengono utilizzati dalla classe CView per delegare all'implementazione CSplitterWnd . Essi sono virtuale in modo che l'implementazione di CView standard non richiederà l'intera implementazione CSplitterWnd essere collegato. Per applicazioni che utilizzano CView ma non CSplitterWnd, l'implementazione di CSplitterWnd non sarà legato con l'applicazione.
virtual BOOL CanActivateNext(BOOL bPrev = FALSE);
Controlla per vedere se il comando "prossimo" o "precedente" è attualmente possibile.
virtual void ActivateNext (BOOL bPrev = FALSE);
Esegue il comando "prossimo" o "precedente".
virtual BOOL DoKeyboardSplit();
Esegue la tastiera dividere il comando, il solito "Window Split".
&Note tecniche per numero |nbsp; Note tecniche per la categoria