TN029: Dělená okna
Tato poznámka popisuje třídu MFC CSplitterWnd, která poskytuje rozdělení oken a spravuje změnu velikosti ostatních oken podokna.
Styly rozdělovače
A CSplitterWnd
podporuje dva různé styly rozdělení oken.
V "statických rozdělovačích" okno rozdělovače vytvoří podokna při jeho vytvoření. Pořadí a počet podoken se nikdy nezmění. Rozdělovací pruhy slouží ke změně velikosti různých podoken. Tento styl můžete použít k zobrazení jiné třídy zobrazení v každém podokně. Grafický editor Visual C++ a Správce souborů systému Windows jsou příklady programů, které používají tento styl rozdělovače. Tento styl okna rozdělovače nepoužívá rozdělovací pole.
V "dynamických rozdělovačích" se vytvoří a zničí další podokna, když uživatel rozdělí a zruší rozdělení nových zobrazení. Tento rozdělovač začíná jedním zobrazením a poskytuje rozdělovačům pole, aby uživatel zahájil rozdělení. Rozdělovač okno dynamicky vytvoří nový objekt zobrazení, když je zobrazení rozděleno jedním směrem. Tento nový objekt zobrazení představuje nové podokno. Pokud je zobrazení rozděleno dvěma směry pomocí rozhraní klávesnice, rozdělovač vytvoří tři nové objekty zobrazení pro tři nová podokna. Zatímco je rozdělení aktivní, systém Windows zobrazí rozdělovač jako rozdělovač mezi podokny. Systém Windows zničí další objekty zobrazení, když uživatel odebere rozdělení, ale původní zobrazení zůstane, dokud samotné rozdělovací okno nebude zničeno. Microsoft Excel a Microsoft Word jsou příklady aplikací, které používají dynamický styl rozdělovače.
Při vytváření libovolného typu rozdělovače je nutné zadat maximální počet řádků a sloupců, které bude rozdělovač spravovat. Statický rozdělovač vytvoří podokna, která vyplní všechny řádky a sloupce. Dynamický rozdělovač vytvoří při vytváření pouze první podokno CSplitterWnd
.
Maximální počet příček, které můžete zadat pro statické rozdělovače, je 16 řádků po 16 sloupcích. Doporučené konfigurace jsou:
1 řádek x 2 sloupce : obvykle s rozdílnými podokny
2 řádky x 1 sloupec : obvykle s rozdílnými podokny
2 řádky x 2 sloupce : obvykle s podobnými podokny
Maximální počet podoken, které můžete zadat pro dynamické rozdělovače, je 2 řádky po 2 sloupcích. Doporučené konfigurace jsou:
1 řádek x 2 sloupce : pro sloupcová data
2 řádky x 1 sloupec : pro textová nebo jiná data
2 řádky x 2 sloupce : pro data orientované na mřížku nebo tabulku
Příklady rozdělovačů
Mnoho ukázkových programů MFC používá rozdělená okna přímo nebo nepřímo. Ukázka VIEWEX knihovny MFC znázorňuje několik použití statických rozdělovačů, včetně toho, jak umístit rozdělovač do rozdělovače.
Pomocí třídy ClassWizard můžete také vytvořit novou třídu okna podřízeného rámce MDI (Multiple Document Interface), která obsahuje rozdělovač okno. Další informace o rozdělených oknech naleznete v tématu Více typů dokumentů, zobrazení a oken rámečku.
Terminologie používaná implementací
Tady je seznam termínů, které jsou specifické pro rozdělovací okna:
CSplitterWnd
: Okno, které poskytuje ovládací prvky pro rozdělení podokna a posuvníky, které jsou sdíleny mezi všemi podokny na řádku nebo sloupci. Zadáte řádky a sloupce s nulovými čísly (první podokno je řádek = 0 a sloupec = 0).
Podokno: Okno specifické pro CSplitterWnd
aplikaci, které spravuje. Podokno je obvykle objekt, který je odvozen z třídy CView, ale může být libovolný CWnd objekt, který má příslušné podřízené ID okna.
Chcete-li použít -odvozený CWnd
objekt, předejte RUNTIME_CLASS objektu CreateView
funkci stejně, jako byste použili -odvozenou CView
třídu. Vaše třída musí používat DECLARE_DYNCREATE a IMPLEMENT_DYNCREATE, protože architektura používá dynamické vytváření za běhu. Ačkoli existuje mnoho kódu CSplitterWnd
, který je specifický pro CView
třídu, CObject::IsKindOf se vždy používá před provedením těchto akcí.
Rozdělovač: Ovládací prvek umístěný mezi řádky a sloupci podoken. Dá se použít k úpravě velikosti řádků nebo sloupců podoken.
Rozdělovač: Ovládací prvek v dynamickém CSplitterWnd
zobrazení, který můžete použít k vytvoření nových řádků nebo sloupců podoken. Nachází se v horní části svislých posuvníků nebo vlevo od vodorovných posuvníků.
Průnik rozdělovače: Průsečík svislé rozdělovače a vodorovný rozdělovač. Přetažením můžete upravit velikost řádku a sloupce podoken současně.
Sdílené posuvníky
Třída CSplitterWnd
také podporuje sdílené posuvníky. Tyto ovládací prvky posuvníku CSplitterWnd
jsou podřízené a sdílí se s různými podokny v rozdělovači.
Například v okně sloupce 1 řádek x 2 můžete při vytváření CSplitterWnd
zadat WS_VSCROLL . Windows vytvoří speciální ovládací prvek posuvníku, který se sdílí mezi dvěma podokny.
[ ][ ][^]
[pane00][pane01][|]
[ ][ ][v]
Když uživatel přesune posuvník, WM_VSCROLL zprávy se odešlou do obou zobrazení. Když některé zobrazení nastaví pozici posuvníku, nastaví se sdílený posuvník.
Sdílené posuvníky jsou nejužitečnější s podobnými objekty zobrazení. Pokud v rozdělovači kombinujete zobrazení různých typů, budete možná muset napsat speciální kód pro koordinaci jejich pozic posouvání. Všechny CView
-odvozené třídy, které používají rozhraní API posuvníku CWnd
, budou delegovat na sdílený posuvník, pokud existuje. Implementace CScrollView
je jedním z příkladů CView
třídy, která podporuje sdílené posuvníky. Třídy, které nejsou odvozeny , CView
třídy, které spoléhají na neovládací posuvníky nebo třídy používající standardní implementace systému Windows (například CEditView
) nebudou fungovat se sdílenou funkcí posuvníku CSplitterWnd
.
Minimální velikosti
Pro každý řádek je minimální výška řádku a pro každý sloupec je minimální šířka sloupce. Toto minimum zaručuje, že podokno není příliš malé, aby se zobrazilo podrobně.
U statického rozdělovače je počáteční minimální výška řádku a šířka sloupce 0. U dynamického rozdělovače jsou počáteční minimální výška řádku a šířka sloupce nastaveny parametrem CSplitterWnd::Create
sizeMin funkce.
Tyto minimální velikosti můžete změnit pomocí funkcí CSplitterWnd::SetRowInfo a CSplitterWnd::SetColumnInfo .
Skutečné a ideální velikosti
Rozložení podoken v rozděleném okně závisí na velikosti rámečku, který je obsahuje. Když uživatel změní velikost rámečku obsahujícího, změní umístění a změní velikost podoken tak, CSplitterWnd
aby se vešel co nejlíbněji.
Uživatel může ručně nastavit výšku řádku a šířku sloupce nebo program může nastavit ideální velikost pomocí CSplitterWnd
třídy. Skutečná velikost může být menší nebo větší než ideální. Okna upraví skutečnou velikost, pokud není dostatek místa pro zobrazení ideální velikosti nebo pokud je v pravém nebo dolním rohu okna rozdělovače příliš prázdné místo.
Vlastní ovládací prvky
Mnoho funkcí můžete přepsat tak, aby poskytovalo přizpůsobené chování a přizpůsobené rozhraní. Tuto první sadu můžete přepsat tak, aby poskytovala alternativní obrázky pro různé grafické komponenty rozdělovače.
virtual void OnDrawSpltter(CDC* pDC, ESplitType nType, const CRect& rect);
virtual void OnInvertTracker(const CRect& rect);
Voláním této funkce vytvoříte ovládací prvek sdíleného posuvníku. Můžete ho přepsat a vytvořit další ovládací prvky vedle posuvníku.
virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);
Tyto funkce implementují logiku dynamického rozdělovače okna. Můžete je přepsat a poskytnout pokročilejší logiku rozdělovače.
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);
Funkce CView
Třída CView
používá následující příkazy vysoké úrovně k delegování na implementaci CSplitterWnd
. Vzhledem k tomu, že tyto příkazy jsou virtuální, CView
standardní implementace nebude vyžadovat, aby byla celá CSplitterWnd
implementace propojena. Pro aplikace, které používají CView
, ale ne CSplitterWnd
, CSplitterWnd
nebude implementace propojena s aplikací.
virtual BOOL CanActivateNext(BOOL bPrev = FALSE);
Zkontroluje, jestli je aktuálně možné ID_NEXT_PANE nebo ID_PREV_PANE.
virtual void ActivateNext(BOOL bPrev = FALSE);
Spustí příkaz Další podokno nebo Předchozí podokno.
virtual BOOL DoKeyboardSplit();
Spustí příkaz rozdělení klávesnice, obvykle "Rozdělení okna".
Viz také
Technické poznámky podle čísel
Technické poznámky podle kategorií