..::Rozd∞lenφ okna I::..

ObΦas se stane, ₧e pot°ebujete rozd∞lit okno na n∞kolik Φßstφ jak je ukßzßno na nßsledujφcφm obrßzku:

K tomu slou₧φ t°φda CSplitterWnd. Postup je nßsledujφcφ:

1) Ve vaÜφ t°φd∞ rßmu (potomku CFrameWnd) odstra≥te vytvß°enφ vÜech d∞tsk²ch oken. (Pokud jste pou₧ili n∞kterΘho pr∙vodce.) 
2) PotΘ musφte p°etφ₧it jeho Φlenskou funkci OnCreateClient ve kterΘ vlastn∞ celß prßce probφhß.

Poznßmka: P°edpoklßdßm, ₧e mßte p°ipraveny zdrojovΘ k≤dy jednotliv²ch pohled∙ a v jejich deklaracφch p°idßno makro DECLARE_DYNCREATE a v definicφch IMPLEMENT_DYNCREATE, aby Üel pou₧φvat mechanismus konstrukce pomocφ RUNTIME_CLASS. (Pokud se o tomto mechanismu chcete dozv∞d∞t vφce podφvejte se na Φlßnek "Konstrukce objekt∙ pomocφ CRuntimeClass" na adrese www.eternal.cz)
Pro nßsledujφcφ vysv∞tlovanφ p°edpoklßdejme, ₧e mßm nadefinovßny nßsledujφcφ t°i t°φdy:
CFrmView (potomek CFormView)
CUpWnd (potomek CWnd)
CDownWnd (potomek CWnd)
a ve t°φd∞ rßmu p°idßny dv∞ ΦlenskΘ prom∞nnΘ typu CSplitterWnd nap°. takto:

...

protected:

CSplitterWnd sp1,sp2;

...

...

3) Funkci OnCreateClient upravte takto (pro zjednoduÜenφ vynechßvßm kontrolu nßvratov²ch hodnot):

BOOL CMyFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

{

// Rozd∞lenφ okna na dv∞ Φßsti

sp1.CreateStatic(this,1,2);

/*

Prvnφ parametr je ukazatel na rodiΦovskΘ okno.

Druh² parametr poΦet °ßdk∙ na kterΘ se okno rozd∞lφ. V naÜem p°φpad∞ 1, tj. ₧ßdnΘ d∞lenφ.

T°etφ parametr poΦet sloupc∙ na kterΘ se okno rozd∞lφ. V naÜem p°φpad∞ 2, tj. dv∞ svislΘ Φßsti.

*/

// Vytvo°enφ pohledu v levΘ Φßsti okna.

sp1.CreateView(0, 0, RUNTIME_CLASS(CFrmView), CSize(100,50) ,pContext);

/*

Prvnφ dva parametry udßvajφ pro kterou Φßst okna se pohled vytvß°φ v po°adφ °ßdek, sloupec. Indexy jsou od nuly jako u polφ.

T°etφ parametr jsou runtime class informace t°φdy zobrazenΘho okna. (NejjednoduÜφ zp∙sob jejich zφskßnφ je makro RUNTIME_CLASS)

╚tvrt² parametr je velikost odpovφdajφcφ Φßsti okna. V p°φpad∞, ₧e velikost je ji₧ definovßna v p°edchozφm volßnφ tΘto funkce m∙₧e b²t velikost na stavena na nuly.

Pßt² parametr jsou informace o vytvß°enΘm rßmu. (druh² parametr funkce OnCreateClient)

*/

// Pokud bychom pravou Φßst okna necht∞li dßle d∞lit, tak by se tato funkce volala jeÜt∞ jednou s druh²m parametrem 1 (tj. pravß Φßst okna) a t°etφm parametrem se jmΘnem odpovφdajφcφ t°φdy. My ale budeme okno dßle rozd∞lovat.

// Rozd∞lenφ pravΘ Φßsti okna

sp2.CreateStatic(&sp1,2,1,WS_CHILD | WS_VISIBLE | WS_BORDER,sp1.IdFromRowCol(0, 1));

/*

Prvnφ parametr ukazatel na sp1 (tj. okno rozd∞lujφcφ rßm na levou a pravou Φßst)

Druh² a t°etφ poΦet Φßstφ na kterΘ se okno rozd∞luje (tj. dva °ßdky a jeden sloupec)

╚tvrt² udßvß styly okna. K standardnφm styl∙m je p°idßn WS_BORDER. To byste m∞li ud∞lat v₧dy pokud rozd∞lujete ji₧ rozd∞lenΘ okno.

Pßt² udßvß identifikßtor okna. Ten by m∞l b²t identifikßtorem pravΘ Φßsti p∙vodnφho rozd∞lenφ. Zφskßte jej volßnφm funkce IdFromRowCol, kde parametry jsou °ßdek a sloupec identifikujφcφ Φßst okna kterou chcete dßle d∞lit. V tomto p°φpad∞ pravß Φßst okna.

*/

// Vytvo°enφ pohled∙ v rozd∞lenΘ pravΘ Φßsti okna. Parametry jsou popsßny ji₧ d°φve.

sp2.CreateView(0, 0, RUNTIME_CLASS(CUpWnd), CSize(0,100),pContext);

sp2.CreateView(1, 0, RUNTIME_CLASS(CDownWnd), CSize(0,0), pContext);

return TRUE;

}

Zφskat ukazatel na odpovφdajφcφ okno m∙₧ete pomocφ funkce CWnd* CSplitterWnd::GetPane(°ßdek, sloupec).
Nap°.
Zφskßnφ ukazatele na pohled v levΘ Φßsti okna:

CFrmView* pleft = ((CFrmView*) sp1.GetPane(0,0));

Nebo na prav² dolnφ pohled:

CDownWnd* pdown = ((CDownWnd*)((CSplitterWnd *) sp1.GetPane(0,1)).GetPane(1,0));