Nejd°φve jedno omezenφ. Lze je pou₧φt jen u MDI aplikacφ s podporou architektury dokument/pohled.
Jde v podstat∞ o to, ₧e si v aplikaci nadefinujete n∞kolik r∙zn²ch kombinacφ dokumentu, pohledu, d∞tskΘho rßmcovΘho okna a zdroj∙. PotΘ p°i ka₧dΘm vytvo°enφ novΘho dokumentu se vßs program pomocφ dialogu zeptß, kterou kombinaci chcete pou₧φt. Samoz°ejm∞ to platφ i p°i otevφrßnφ dokument∙, ale tam je to d∞lßno pomocφ typu soubor∙. Ulo₧it dokument m∙₧ete pouze do souboru s p°φponou odpovφdajφcφ kombinaci.
Prakticky se to ud∞lß tak, ₧e si nadefinujete dv∞ kombinace zdroj∙, jak
je vid∞t na nßsledujφcφm obrßzku:
PotΘ p°idßte dalÜφ t°φdy pohledu, dokumentu a d∞tskΘho rßmcovΘho
okna. Nic vßm ale nebrßnφ abyste pou₧ili u₧ existujφcφ, jen p°i jejich
programovßnφ musφte zohlednit rozdφly mezi r∙zn²mi typy dokument∙. Proto
se mi zdß lepÜφ (a hlavn∞ p°ehledn∞jÜφ) pou₧φt ·pln∞ novΘ t°φdy.
Dßle musφte tuto novou kombinaci p°idat do aplikace. To se d∞lß ve funkci
CWinApp::InitInstance. AppWizard vßm sem ji₧ p°idal p∙vodnφ kombinaci, vy
jen p°idßte dalÜφ, jak je vid∞t na nßsledujφcφm obrßzku:
PotΘ ji₧ to celΘ funguje. Kdy₧ vytvß°φte nov² dokument zobrazφ se vßm
takov²to dialog:
a pomocφ n∞j si u₧ivatel zvolφ, kter² typ dokumentu chce vytvo°it. Nßzvy
v dialogu odpovφdajφ °et∞zci ve zdrojφch.
P°i otevφrßnφ dokument∙ si takΘ m∙₧ete zvolit, kter² typ dokumentu
chcete otev°φt, jak vidφte na nßsledujφcφm obrßzku:
Pokud vßm nevyhovuje standartnφ dialog p°i vytvß°enφ novΘho typu souboru, zapßtrejte co se d∞je p°i vytvß°enφ novΘho dokumentu a upravte si chovßnφ aplikace (tj. upravit funkce CWinApp::OnFileNew(), CDocManager::OnFileNew() a jejich vzßjemnou interakci), nebo pou₧ijte nßsledujφcφ postup:
Odchy¥te si zprßvu ID_FILE_NEW (tj. polo₧ka soubor nov²) a ud∞lejte si vlastnφ dialog, nebo si ud∞lejte novou polo₧ku menu pro ka₧d² typ dokumentu. (Ve t°φd∞ aplikace.)
Potom podle vybranΘho typu dokumentu volejte pomocnou funkci (musφte si ji sami napsat) OpenNewDocument, jφ₧ jako parametr p°edßte °et∞zec odpovφdajφcφ pod°et∞zci typu dokumentu z odpovφdajφcφ Üablony dokumentu. Nap°φklad takto:
void CTstApp::OnNewTst( )
{
OpenNewDocument("Tst");
}
void CTstApp::OnNewTs1( )
{
OpenNewDocument("Ts1");
}
BOOL CTstApp::OpenNewDocument(const CString& strTarget)
{
CString strDocName;
CDocTemplate* pSelectedTemplate;
POSITION pos = GetFirstDocTemplatePosition( );
vhile (pos!=NULL)
{
pSelectedTemplate = (CDocTemplate*) GetNextDocTemplate(pos);
ASSERT(pSelectedTemplate!=NULL);
ASSERT(pSelectedTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate)));
pSelectedTemplate->GetDocString(strDocName, CDocTemplate::docName);
if (strDocName == strTarget)
{
pSelectedTemplate->OpenDocumentFile(NULL);
return TRUE;
}
}
return FALSE;
}