Escolar Documentos
Profissional Documentos
Cultura Documentos
1. Introduo
MDI significa Multiple Document Interface, o conceito dessa interface abrir vrias janelas dentro de
uma janela principal, ou seja, adicionar diversas janelas filhas dentro de uma janela pai, exemplos
dessa interface so os conhecidos Microsoft Word, Excel, etc..
Uma interface diferente ser o SDI, que significa Single Document Interface, nesse caso cada
Form aberto representa uma janela diferente na aplicao.
Neste artigo, vamos criar um projeto em C# que engloba os principais conceitos da interface MDI
2. Crie a Interface
Crie um novo projeto do tipo Windows Forms e chame de ProjetoMDI, adicione 4 novos Forms com os
seguintes nomes: FormPrincipal, FormFilho1, FormFilho2 e FormFilho3. Para o FormPrincipal, v at a
janela de propriedades e defina a propriedadeWindowState como Maximized para que a janela abra
em tela cheia.
Crie um MenuStrip no FormPrincipal e chame-o de mnuPrincipal e crie a seguinte estrutura de itens de
menu (MenuItems):
3. Mo no Cdigo!
Compile e execute a aplicao, clique no menu Abrir Filho 1 e repare que o FormFilho1 foi aberto em
outra janela (interface SDI), veja que ao minimizar a janela aberta esta fica na barra do menu iniciar.
Como fazer para abrir dentro da janela principal? Sero dois passos simples. Primeiro precisamos dizer
que o FormPrincipal um MdiContainer, ou seja, ele pode ter Forms filhos dentro dele, para isso
configure a propriedade IsMdiContainer como true no FormPrincipal. Feito isso, precisamos fazer uma
alterao no nosso cdigo onde abrimos o FormFilho1 dizendo quem ser o pai dele, ou seja, dentro
de qual janela ele abrir, fazemos isso pela propriedade MdiParentde FormFilho1:
this, nada mais que a instncia do Form que voc est trabalhando, dessa forma, falamos que o
pai de FormFilho1 o Form atual this que o FormPrincipal.
Agora adicione os cdigos para abrir os outros Forms:
{
FormFilho3 form = new FormFilho3();
form.MdiParent = this;
form.Show();
}
Compile e execute a aplicao, abra varias vezes cada Form e veja que todos eles abrem dentro de
FormPrincipal, minimize e maximize as janelas filhas abertas e veja que diferente da interface SDI, as
janelas no aparecem na barra do menu iniciar, mas sim dentro de apenas uma janela, o FormPrincipal.
4. Forms Abertos
Imagine agora que voc tem uma aplicao grande com a interface MDI e tem vrios Forms abertos,
uns minimizados e outros no e deseja ter um local no menu onde mostre todas as janelas abertas
dentro da aplicao e que facilite a navegao entre elas? Voc deve estar pensando que algo muito
complicado mas eu venho aqui desmentir seu pensamento e mostrar como to simples fazer isso.
V para a janela de propriedades de mnuPrincipal e altere a propriedade MdiWindowListItem para o
nosso item de menu responsvel por essa tarefa que no nosso caso mnuFormsAbertos. :
Menu Forms Abertos
E se agora voc quiser organizar as janelas abertas em cascata, lado a lado horizontal ou vertical ou at
arranjar os Forms que esto minimizados.
Para isso, clique duas vezes em cada item do menu mnuJanela e adicione os seguintes cdigos:
Explicando o cdigo acima, a funo LayoutMdi responsvel por organizar o layout dos Forms filhos de
FormPrincipal, aceita como parmetro a Enum MdiLayout que contm 4 modos diferentes:
- Cascade: Os Forms so arranjados em cascata
- TileHorizontal: Os Forms so arranjados lado a lado horizontalmente
- TileVertical: Os Forms so arranjados lado a lado verticalmente
- ArranjeIcons: Os Forms esto minimizados so arranjados abaixo e a esquerda do FormPrincipal.
Compile e execute a aplicao, abra os 3 forms filhos e aps clique no menu cascata, lado a lado
horizontal e lado a lado vertical e veja as mudanas:
Voc ainda pode obter uma coleo de todos os forms filhos que esto dentro do FormPrincipal atravs
da coleo this.MdiChildren, veja o cdigo a seguir que altera a propriedade Text de todos os forms
filhos de FormPrincipal para Novo Texto contido em um evento de um boto chamado
btnMdiChildren:
Tambm podemos utilizar a propriedade this.ActiveMdiChild para obter a instncia do Form ativo na
aplicao, o cdigo a seguir, escreve Novo Texto 2 apenas no Form ativo, evento criado para o boto
btnActiveMdiChild:
private void btnActiveMdiChild_Click(object sender, EventArgs e)
{
this.ActiveMdiChild.Text = "Novo Texto 2";
}
Sabendo ento que podemos pegar a instncia de qualquer Form aberto no FormPrincipal, temos um
leque de operaes para serem feitas entre as janelas, eu ensino como fazer comunicao entre Forms
de 3 formas diferentes neste post.