Postoje dva osnovna tipa aplikacija SDI i MDI. Kod SDI aplikacija (Single-document interface) može se samo jedan dokument otvoriti u jednom trenutku. Primer SDI aplikacije je Microsoft WordPad. Kod MDI aplikacija (Multiple document interface) nekoliko dokumenata se može otvoriti istovremeno. Primer MDI aplikacije je Microsoft Word. MDI aplikacija se sastoji od jednog roditeljskog prozora i jednog ili više prozora potomaka.
U meniju Project odabere se opcija Add New Item. U Add New Item prozoru odabere se šablon MDI Parent. Specificira se ime forme i klikne se na Add dugme.
Kada se kreira nova MDI roditeljska forma svojstvo IsMdiContainer se postavlja na vrednost True. Takođe se automatski dodaju kontrole ToolStrip i StatusStrip. Takođe se vrši automatsko generisanje koda za pojedine stavke menija.
// Event handler za opciju menija File->New private int childFormNumber = 0; private void ShowNewForm(object sender, EventArgs e) { Form childForm = new Form(); childForm.MdiParent = this; childForm.Text = "Window " + childFormNumber++; childForm.Show(); } |
Na primeru je prikazan event handler za opciju menija File->New koji je automatski generisan kreiranjem nove forma sa templejtom MDI Parent. Unutar klase se dodaje atribut childFormNumber koji broji koliko je child formi otvoreno. Unutar samog event handlera se instancira child forma korišćenjem klase Form. Postavlja se svojstvo MdiParent ove forme na objekat this tj. na MDI Parent formu koja je kreirana. Takođe se postavlja Text svojstvo child forme koje sadrži podatak o rednom broju potomka. Sama Child forma se prikazuje korišćenjem metode Show.
Sada želimo da već postojeću windows formu, npr. formu Form1 koja se automatski kreira pri kreiranju nove windows aplikacije proglasimo za MDI parent formu. Otvori se forma u dizajn modu i postavi se njeno svojstvo IsMdiContainer na vrednost True. Na ovaj način se ne dodaju nikakve kontrole na formu niti se generiše kod.
private void ShowNewForm(object sender, EventArgs e) { ChildForma childForm = new ChildForma(); childForm.MdiParent = this; childForm.Text = "Window " + childFormNumber++; childForm.Show(); } |
Dizajnira se forma koja sadrži potrebnu funkcionalnost. U roditeljskoj formi se kreira instanca child forme (najčešće u Load metodi ili korišćenjem stavke menija). Ukoliko je MDI Parent forma kreirana pomoću šablona, sve što je potrebno uraditi je da se u event handleru File->New promeni ime klase sa Form na ime klase child forme, npr. iz Form u ChildForma ako je ChildForma forma potomak.
Pomoću svojstva ActiveMdiChild se unutar koda roditeljske forme može odrediti trenutno aktivna forma potomak. Trenutno aktivna kontrola (kontrola koja ima fokus) na aktivnom potomku dobija se korišćenjem svojstva ActiveControl. Pošto svojstvo ActiveControl vraća objekat klase Object mora se izvršiti kastovanje u odgovarajući tip kontrole.
private void CopyToolStripMenuItem_Click(object sender, EventArgs e) { Form aktivniPotomak = this.ActiveMdiChild; if (aktivniPotomak != null) { try { RichTextBox tekuciRichTextBox = (RichTextBox)aktivniPotomak.ActiveControl; if (tekuciRichTextBox != null) { // stavi selektovani tekst u Clipboard. Clipboard.SetText(tekuciRichTextBox.SelectedText, TextDataFormat.Text); } } catch { MessageBox.Show("Potrebno je da selektujete tekst u RichTextBoxu."); } } } |
Kreirali smo child formu i na njoj smo dodali RichTextBox kontrolu. Želimo da omogućimo kopiranje teksta iz jedne Child forme u neku drugu Child formu. U event hendleru za stavku menija Edit->Copy, najpre određujemo aktivnu formu potomak i pristupamo aktivnoj kontroli na toj formi, u ovom slučaju radi se o RichTextBox kontroli. Korisnik je dužan da selektuje tekst unutar ove RichTextBox kontrole pre nego što pozove opciju Edit->Copy. Kopiranje teksta vrši se korišćenjem klase Clipboard i njene metode SetText.
private void PasteToolStripMenuItem_Click(object sender, EventArgs e) { Form aktivniPotomak = this.ActiveMdiChild; RichTextBox tekuciRichTextBox = (RichTextBox)aktivniPotomak.ActiveControl; if (tekuciRichTextBox != null) { tekuciRichTextBox.AppendText(Clipboard.GetText()); } } |
Prethodno je unet teks na nekoj Child formi i tekst smešten u Clipboard. Sada treba da pređemo na neku drugu child formu i da se pozicioniramo na njenu RichTextBox kontrolu. U event handleru za dugme Paste ponovo se određuje aktivna Child forma i vrši se kopiranje teksta u njenu aktivnu kontrolu tj. RichTextBox kontrolu. Čitanje teksta iz Clipboarda se vrši korišćenjem metode GetText.
private void CascadeToolStripMenuItem_Click(object sender, EventArgs e) { LayoutMdi(MdiLayout.Cascade); } |
Enumeracija MdiLayout specificira vrednosti koje predstavljaju prostorni raspored formi potomaka na ekranu. Moguće vrednosti ove enumeracije su: Cascade, TileVertical, TileHorizontal, ArrangeIcons. LayoutMdi metoda klase Form se koristi za specificiranje prostornog rasporeda formi potomaka. U primeru se poziva metoda LayoutMdi i prosleđuje joj se vrednost enumeracije MdiLayout.Cascade. Pozivom ovakve metode vrši se kaskadno ažuriranje formi potomaka.