TN029: okna podziału
W tej notatce opisano klasę MFC CSplitterWnd, która udostępnia podziały okien i zarządza zmianą rozmiaru innych okien okienek.
Style podziału
Obiekt CSplitterWnd
obsługuje dwa różne style podziału okien.
W obszarze "statyczne rozdzielacze" okno podziału tworzy okienka podczas jego tworzenia. Kolejność i liczba okienek nigdy się nie zmieniają. Paski podziału służą do zmieniania rozmiaru różnych okienek. Za pomocą tego stylu można wyświetlić inną klasę widoku w każdym okienku. Edytor graficzny Visual C++ i Menedżer plików systemu Windows to przykłady programów korzystających z tego stylu podziału. Ten styl okna podziału nie używa pól rozdzielanych.
W "dynamicznych rozdzielaczach" są tworzone i niszczone dodatkowe okienka, gdy użytkownik dzieli i nie dzieli nowych widoków. Ten splitter rozpoczyna się od jednego widoku i udostępnia pola podziału dla użytkownika w celu zainicjowania dzielenia. Okno podziału dynamicznie tworzy nowy obiekt widoku, gdy widok jest podzielony w jednym kierunku. Ten nowy obiekt widoku reprezentuje nowe okienko. Jeśli widok jest podzielony w dwóch kierunkach przy użyciu interfejsu klawiaturowego, okno podziału tworzy trzy nowe obiekty widoku dla trzech nowych okienek. Gdy podział jest aktywny, system Windows wyświetla pole podziału jako pasek podziału między okienkami. System Windows niszczy dodatkowe obiekty widoku, gdy użytkownik usunie podział, ale oryginalny widok pozostaje do momentu zniszczenia samego okna podziału. Programy Microsoft Excel i Microsoft Word to przykłady aplikacji korzystających ze stylu dynamicznego dzielenia.
Podczas tworzenia dowolnego rodzaju okna podziału należy określić maksymalną liczbę wierszy i kolumn, którymi będzie zarządzać rozdzielacz. Statyczny rozdzielacz utworzy okienka, aby wypełnić wszystkie wiersze i kolumny. Dynamiczny rozdzielacz utworzy tylko pierwsze okienko podczas CSplitterWnd
tworzenia.
Maksymalna liczba okienek, które można określić dla rozdzielaczy statycznych, to 16 wierszy według 16 kolumn. Zalecane konfiguracje to:
1 wiersz x 2 kolumny: zwykle z różnych okienek
2 wiersze x 1 kolumna: zwykle z różne okienka
2 wiersze x 2 kolumny: zwykle z podobnymi okienkami
Maksymalna liczba okienek, które można określić dla rozdzielaczy dynamicznych, wynosi 2 wiersze według 2 kolumn. Zalecane konfiguracje to:
1 wiersz x 2 kolumny: dla danych kolumnowych
2 wiersze x 1 kolumna: dla danych tekstowych lub innych
2 wiersze x 2 kolumny: dla danych zorientowanych na siatkę lub tabelę
Przykłady podziału
Wiele przykładowych programów MFC używa okien rozdzielanych bezpośrednio lub pośrednio. Przykładowy przykład MFC VIEWEX ilustruje kilka zastosowań rozdzielaczy statycznych, w tym sposób umieszczania rozdzielaczy w rozdzielaczze.
Można również użyć klasy ClassWizard, aby utworzyć nową klasę okna ramek podrzędnych (MDI, Multiple Document Interface) (MDI), która zawiera okno rozdzielacza. Aby uzyskać więcej informacji na temat okien rozdzielanych, zobacz Wiele typów dokumentów, widoków i okien ramowych.
Terminologia używana przez implementację
Oto lista terminów specyficznych dla okien rozdzielających:
CSplitterWnd
: okno zawierające kontrolki podziału okienka i paski przewijania, które są współużytkowane przez wszystkie okienka w wierszu lub kolumnie. Należy określić wiersze i kolumny z liczbami zerowymi (pierwsze okienko to wiersz = 0 i kolumna = 0).
Okienko: okno specyficzne dla aplikacji, które CSplitterWnd
zarządza. Okienko jest zwykle obiektem pochodzącym z klasy CView, ale może być dowolnym obiektem CWnd , który ma odpowiedni identyfikator okna podrzędnego.
Aby użyć CWnd
obiektu -pochodnego, przekaż RUNTIME_CLASS obiektu do CreateView
funkcji, tak jak w przypadku używania klasy pochodnej CView
. Klasa musi używać DECLARE_DYNCREATE i IMPLEMENT_DYNCREATE, ponieważ struktura używa dynamicznego tworzenia w czasie wykonywania. Mimo że istnieje wiele kodu CSplitterWnd
specyficznego dla CView
klasy, obiekt CObject::IsKindOf jest zawsze używany przed wykonaniem tych akcji.
Pasek podziału: kontrolka umieszczona między wierszami i kolumnami okienek. Może służyć do dostosowywania rozmiarów wierszy lub kolumn okienek.
Splitter Box: kontrolka w dynamicznym CSplitterWnd
, za pomocą której można tworzyć nowe wiersze lub kolumny okienek. Znajduje się w górnej części pionowych pasków przewijania lub po lewej stronie poziomych pasków przewijania.
Splitter Intersection: skrzyżowanie pionowego paska podziału i poziomego paska podziału. Możesz przeciągnąć go, aby dopasować rozmiar wiersza i kolumny okienek jednocześnie.
Udostępnione paski przewijania
Klasa CSplitterWnd
obsługuje również udostępnione paski przewijania. Te kontrolki paska przewijania są elementami podrzędnymi CSplitterWnd
elementu i są udostępniane różnym okienkom w rozdzielaczu.
Na przykład w oknie 1 wiersza x 2 kolumny można określić WS_VSCROLL podczas tworzenia obiektu CSplitterWnd
. System Windows tworzy specjalną kontrolkę paska przewijania współdzieloną między dwoma okienkami.
[ ][ ][^]
[pane00][pane01][|]
[ ][ ][v]
Gdy użytkownik przenosi pasek przewijania, WM_VSCROLL komunikaty będą wysyłane do obu widoków. Gdy dowolny widok ustawi położenie paska przewijania, zostanie ustawiony udostępniony pasek przewijania.
Należy pamiętać, że udostępnione paski przewijania są najbardziej przydatne w przypadku podobnych obiektów widoku. Jeśli mieszasz widoki różnych typów w rozdzielaniu, może być konieczne napisanie specjalnego kodu w celu koordynowania ich położenia przewijania. Każda CView
klasa pochodna korzystająca z CWnd
interfejsów API paska przewijania będzie delegować do udostępnionego paska przewijania, jeśli istnieje. Implementacja CScrollView
jest jednym z przykładów klasy obsługującej CView
udostępnione paski przewijania. Klasy, które nie pochodzą z CView
klas , które opierają się na paskach przewijania niekontrolowanych lub klasach korzystających ze standardowych implementacji systemu Windows (na przykład CEditView
) nie będą działać z funkcją udostępnionego paska przewijania CSplitterWnd
.
Minimalne rozmiary
Dla każdego wiersza istnieje minimalna wysokość wiersza, a dla każdej kolumny istnieje minimalna szerokość kolumny. To minimum gwarantuje, że okienko nie jest zbyt małe, aby było wyświetlane szczegółowo.
W przypadku okna rozdzielanego statycznego minimalna wysokość wiersza i szerokość kolumny wynosi 0. W przypadku dynamicznego okna rozdzielanego początkowa minimalna wysokość wiersza i szerokość kolumny są ustawiane przez parametr CSplitterWnd::Create
sizeMin funkcji.
Te minimalne rozmiary można zmienić przy użyciu funkcji CSplitterWnd::SetRowInfo i CSplitterWnd::SetColumnInfo .
Rzeczywiste a idealne rozmiary
Układ okienek w oknie podziału zależy od rozmiaru ramki, która je zawiera. Gdy użytkownik zmienia rozmiar zawierającej ramkę, CSplitterWnd
zmienia położenie i zmienia rozmiar okienek tak, aby pasowały tak dobrze, jak to możliwe.
Użytkownik może ręcznie ustawić rozmiary wysokości wiersza i szerokości kolumny lub program może ustawić idealny rozmiar przy użyciu CSplitterWnd
klasy . Rzeczywisty rozmiar może być mniejszy lub większy niż idealny. System Windows dostosuje rzeczywisty rozmiar, jeśli nie ma wystarczającej ilości miejsca, aby wyświetlić idealny rozmiar lub jeśli w prawym lub dolnej części okna podziału jest za dużo pustego miejsca.
Kontrolki niestandardowe
Można zastąpić wiele funkcji w celu zapewnienia dostosowanego zachowania i dostosowanego interfejsu. Możesz zastąpić ten pierwszy zestaw, aby udostępnić alternatywne obrazy dla różnych składników graficznych okna podziału.
virtual void OnDrawSpltter(CDC* pDC, ESplitType nType, const CRect& rect);
virtual void OnInvertTracker(const CRect& rect);
Wywołasz tę funkcję, aby utworzyć udostępnioną kontrolkę paska przewijania. Można go zastąpić, aby utworzyć dodatkowe kontrolki obok paska przewijania.
virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);
Te funkcje implementują logikę dynamicznego okna podziału. Można je zastąpić, aby zapewnić bardziej zaawansowaną logikę podziału.
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);
Funkcja CView
Klasa CView
używa następujących poleceń wysokiego poziomu do delegowania do implementacji CSplitterWnd
. Ponieważ te polecenia są wirtualne, standardowa CView
implementacja nie wymaga połączenia całej CSplitterWnd
implementacji. W przypadku aplikacji, które korzystają CView
, ale nie CSplitterWnd
, implementacja CSplitterWnd
nie zostanie połączona z aplikacją.
virtual BOOL CanActivateNext(BOOL bPrev = FALSE);
Sprawdza, czy ID_NEXT_PANE czy ID_PREV_PANE jest obecnie możliwe.
virtual void ActivateNext(BOOL bPrev = FALSE);
Wykonuje polecenie "Następne okienko" lub "Poprzednie okienko".
virtual BOOL DoKeyboardSplit();
Wykonuje polecenie podziału klawiatury, zwykle "Podział okna".
Zobacz też
Uwagi techniczne według numerów
Uwagi techniczne według kategorii