TN029: Splitterfenster
In diesem Hinweis wird die MFC CSplitterWnd-Klasse beschrieben, die Fensterteilungen bereitstellt und die Größenänderung anderer Fensterfenster verwaltet.
Splitterformatvorlagen
A CSplitterWnd
unterstützt zwei verschiedene Stile für das Teilen von Fenstern.
In "statischen Teilern" erstellt das Teilerfenster die Bereiche, wenn sie erstellt wird. Die Reihenfolge und Anzahl der Bereiche ändern sich nie. Teilerleisten werden verwendet, um die Größe der verschiedenen Bereiche zu ändern. Sie können diese Formatvorlage verwenden, um eine andere Ansichtsklasse in jedem Bereich anzuzeigen. Der Visual C++-Grafik-Editor und der Windows File Manager sind Beispiele für Programme, die diesen Splitterstil verwenden. Diese Formatvorlage des Splitterfensters verwendet keine Splitterfelder.
In "dynamischen Splittern" werden zusätzliche Bereiche erstellt und zerstört, während der Benutzer neue Ansichten teilt und aufteilt. Dieser Splitter beginnt mit einer einzelnen Ansicht und stellt Splitterfelder bereit, damit der Benutzer die Aufteilung initiieren kann. Das Teilerfenster erstellt dynamisch ein neues Ansichtsobjekt, wenn die Ansicht in eine Richtung geteilt wird. Dieses neue Ansichtsobjekt stellt den neuen Bereich dar. Wenn die Ansicht mithilfe der Tastaturschnittstelle in zwei Richtungen geteilt wird, erstellt das Teilerfenster drei neue Ansichtsobjekte für die drei neuen Bereiche. Während die Teilung aktiv ist, zeigt Windows das Teilerfeld als Teilerleiste zwischen den Bereichen an. Windows zerstört zusätzliche Ansichtsobjekte, wenn der Benutzer eine Teilung entfernt, aber die ursprüngliche Ansicht wird erneut Standard, bis das Splitterfenster selbst zerstört wird. Microsoft Excel und Microsoft Word sind Beispiele für Anwendungen, die den dynamischen Splitterstil verwenden.
Wenn Sie beide Arten von Teilerfenstern erstellen, müssen Sie die maximale Anzahl von Zeilen und Spalten angeben, die der Splitter verwaltet. Ein statischer Teiler erstellt Bereiche, um alle Zeilen und Spalten auszufüllen. Ein dynamischer Teiler erstellt nur den ersten Bereich, wenn er CSplitterWnd
erstellt wird.
Die maximale Anzahl von Bereichen, die Sie für statische Teiler angeben können, beträgt 16 Zeilen um 16 Spalten. Die empfohlenen Konfigurationen sind:
1 Zeile x 2 Spalten : normalerweise mit unterschiedlichen Bereichen
2 Zeilen x 1 Spalte: normalerweise mit unterschiedlichen Bereichen
2 Zeilen x 2 Spalten : normalerweise mit ähnlichen Bereichen
Die maximale Anzahl von Bereichen, die Sie für dynamische Splitter angeben können, beträgt 2 Zeilen um 2 Spalten. Die empfohlenen Konfigurationen sind:
1 Zeile x 2 Spalten : für Spaltendaten
2 Zeilen x 1 Spalte: für Text oder andere Daten
2 Zeilen x 2 Spalten : für raster- oder tabellenorientierte Daten
Splitterbeispiele
Viele der MFC-Beispielprogramme verwenden Splitterfenster direkt oder indirekt. Das MFC General Sample VIEWEX veranschaulicht mehrere Verwendungen statischer Splitter, einschließlich der Platzierung eines Spliters in einem Splitter.
Sie können auch ClassWizard verwenden, um eine neue MDI-Untergeordnete Framefensterklasse (Multiple Document Interface, Untergeordnete Dokumentschnittstelle) zu erstellen, die ein Teilerfenster enthält. Weitere Informationen zu Teilerfenstern finden Sie unter "Mehrere Dokumenttypen", "Ansichten" und "Frame-Fenster".
Terminologie, die von der Implementierung verwendet wird
Hier ist eine Liste von Begriffen, die für Splitterfenster spezifisch sind:
CSplitterWnd
: Ein Fenster, das Fensterausschnittsteilungssteuerelemente und Bildlaufleisten bereitstellt, die für alle Bereiche in einer Zeile oder Spalte freigegeben sind. Sie geben Zeilen und Spalten mit nullbasierten Zahlen an (der erste Bereich ist Zeile = 0 und Spalte = 0).
Bereich: Ein anwendungsspezifisches Fenster, das von einem verwaltet wird CSplitterWnd
. Ein Bereich ist in der Regel ein Objekt, das von der CView-Klasse abgeleitet wird, kann jedoch ein beliebiges CWnd-Objekt sein, das über die entsprechende untergeordnete Fenster-ID verfügt.
Um ein abgeleitetes CWnd
Objekt zu verwenden, übergeben Sie die RUNTIME_CLASS des Objekts wie bei Verwendung einer CView
abgeleiteten Klasse an die CreateView
Funktion. Ihre Klasse muss DECLARE_DYNCREATE und IMPLEMENT_DYNCREATE verwenden, da das Framework zur Laufzeit dynamische Erstellung verwendet. Obwohl es viele Code CSplitterWnd
gibt, der für die CView
Klasse spezifisch ist, wird CObject::IsKindOf immer verwendet, bevor diese Aktionen ausgeführt werden.
Teilerleiste: Ein Steuerelement, das zwischen Zeilen und Spalten von Bereichen platziert wird. Es kann verwendet werden, um die Größe von Zeilen oder Spalten von Bereichen anzupassen.
Teilerfeld: Ein Steuerelement in einer Dynamischen CSplitterWnd
, mit dem Sie neue Zeilen oder Spalten von Bereichen erstellen können. Sie befindet sich oben in den vertikalen Bildlaufleisten oder links neben den horizontalen Bildlaufleisten.
Splitter-Schnittmenge: Die Schnittmenge einer vertikalen Teilerleiste und einer horizontalen Teilerleiste. Sie können es ziehen, um die Größe einer Zeile und Spalte von Bereichen gleichzeitig anzupassen.
Freigegebene Bildlaufleisten
Die CSplitterWnd
Klasse unterstützt auch freigegebene Bildlaufleisten. Diese Bildlaufleistensteuerelemente sind untergeordnete Elemente des CSplitterWnd
Steuerelements und werden für die verschiedenen Bereiche im Teiler freigegeben.
Beispielsweise können Sie in einem Fenster mit einer Zeile x 2 Spalten WS_VSCROLL angeben, wenn Sie das CSplitterWnd
Objekt erstellen. Windows erstellt ein spezielles Bildlaufleisten-Steuerelement, das zwischen den beiden Bereichen gemeinsam genutzt wird.
[ ][ ][^]
[pane00][pane01][|]
[ ][ ][v]
Wenn der Benutzer die Bildlaufleiste verschiebt, werden WM_VSCROLL Nachrichten an beide Ansichten gesendet. Wenn eine der beiden Ansichten die Position der Bildlaufleiste festlegt, wird die freigegebene Bildlaufleiste festgelegt.
Beachten Sie, dass freigegebene Bildlaufleisten für ähnliche Ansichtsobjekte am nützlichsten sind. Wenn Sie Ansichten verschiedener Typen in einem Teiler kombinieren, müssen Sie möglicherweise speziellen Code schreiben, um die Bildlaufpositionen zu koordinieren. Jede CView
abgeleitete Klasse, die die CWnd
Bildlaufleisten-APIs verwendet, delegiert, sofern vorhanden, an die freigegebene Bildlaufleiste. Die CScrollView
Implementierung ist ein Beispiel für eine CView
Klasse, die freigegebene Bildlaufleisten unterstützt. Klassen, die nicht von CView
klassen abgeleitet sind, die auf Nicht-Steuerelement-Bildlaufleisten basieren, oder Klassen, die standardmäßige Windows-Implementierungen (z. B. ) verwenden, CEditView
funktionieren nicht mit dem freigegebenen Bildlaufleistenfeature von CSplitterWnd
.
Mindestgrößen
Für jede Zeile gibt es eine minimale Zeilenhöhe, und für jede Spalte gibt es eine minimale Spaltenbreite. Dieses Mindestmaß garantiert, dass ein Bereich nicht zu klein ist, um im Detail angezeigt zu werden.
Bei einem statischen Teilerfenster beträgt die anfängliche Mindestzeilenhöhe und Spaltenbreite 0. Bei einem dynamischen Teilerfenster wird die anfängliche Mindestzeilenhöhe und Spaltenbreite durch den Parameter sizeMin der CSplitterWnd::Create
Funktion festgelegt.
Sie können diese Mindestgrößen ändern, indem Sie die Funktionen "CSplitterWnd::SetRowInfo " und "CSplitterWnd::SetColumnInfo " verwenden.
Tatsächliche im Vergleich zu idealen Größen
Das Layout der Bereiche im Teilerfenster hängt von der Größe des Rahmens ab, der sie enthält. Wenn ein Benutzer die Größe des enthaltenden Frames ändert, werden die CSplitterWnd
Bereiche neu positioniert und so angepasst, dass sie so gut wie möglich passen.
Der Benutzer kann die Zeilenhöhen- und Spaltenbreiten manuell festlegen, oder das Programm kann die ideale Größe mithilfe der CSplitterWnd
Klasse festlegen. Die tatsächliche Größe kann kleiner oder größer als der Ideale sein. Windows passt die tatsächliche Größe an, wenn nicht genügend Platz zum Anzeigen der idealen Größe vorhanden ist oder wenn auf der rechten oder unteren Seite des Teilerfensters zu viel Leerraum vorhanden ist.
Benutzerdefinierte Steuerelemente
Sie können viele Funktionen außer Kraft setzen, um benutzerdefiniertes Verhalten und eine benutzerdefinierte Schnittstelle bereitzustellen. Sie können diesen ersten Satz außer Kraft setzen, um alternative Bilder für die verschiedenen grafischen Komponenten eines Splitterfensters bereitzustellen.
virtual void OnDrawSpltter(CDC* pDC, ESplitType nType, const CRect& rect);
virtual void OnInvertTracker(const CRect& rect);
Sie rufen diese Funktion auf, um ein freigegebenes Bildlaufleisten-Steuerelement zu erstellen. Sie können es außer Kraft setzen, um zusätzliche Steuerelemente neben der Bildlaufleiste zu erstellen.
virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);
Diese Funktionen implementieren die Logik des dynamischen Splitterfensters. Sie können diese außer Kraft setzen, um erweiterte Splitterlogik bereitzustellen.
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);
CView-Funktionalität
Die CView
Klasse verwendet die folgenden Befehle auf hoher Ebene, um an die CSplitterWnd
Implementierung zu delegieren. Da diese Befehle virtuell sind, muss die Standardimplementierung CView
nicht die gesamte CSplitterWnd
Implementierung verknüpft werden. Bei Anwendungen, die jedoch nicht CSplitterWnd
verwendenCView
, wird die CSplitterWnd
Implementierung nicht mit der Anwendung verknüpft.
virtual BOOL CanActivateNext(BOOL bPrev = FALSE);
Überprüft, ob ID_NEXT_PANE oder ID_PREV_PANE derzeit möglich ist.
virtual void ActivateNext(BOOL bPrev = FALSE);
Führt den Befehl "Nächster Bereich" oder "Vorheriger Bereich" aus.
virtual BOOL DoKeyboardSplit();
Führt den befehl "Teilen der Tastatur" aus, in der Regel "Fenster teilen".
Siehe auch
Technische Hinweise – nach Nummern geordnet
Technische Hinweise – nach Kategorien geordnet