Você está na página 1de 7

MDI

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):

Estrutura do menu principal

3. Mo no Cdigo!

Clique duas vezes no mnuAbrirFilho1 e adicione o seguinte cdigo:

private void mnuAbrirFilho1_Click(object sender, EventArgs e)


{
FormFilho1 form = new FormFilho1();
form.Show();
}

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:

private void mnuAbrirFilho1_Click(object sender, EventArgs e)


{
FormFilho1 form = new FormFilho1();
form.MdiParent = this;
form.Show();
}

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:

private void mnuAbrirFilho2_Click(object sender, EventArgs e)


{
FormFilho2 form = new FormFilho2();
form.MdiParent = this;
form.Show();
}

private void mnuAbrirFilho3_Click(object sender, EventArgs e)

{
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

5. Layout dos Forms Filhos

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:

private void mnuCascata_Click(object sender, EventArgs e)


{
this.LayoutMdi(MdiLayout.Cascade);
}

private void mnuHorizontal_Click(object sender, EventArgs e)


{
this.LayoutMdi(MdiLayout.TileHorizontal);
}

private void mnuVertical_Click(object sender, EventArgs e)


{
this.LayoutMdi(MdiLayout.TileVertical);
}

private void mnuIconesMinimizados_Click(object sender, EventArgs e)


{
this.LayoutMdi(MdiLayout.ArrangeIcons);
}

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:

Lado a lado horizontalmente


Lado a lado verticalmente
Agora minimize os 3 forms filhos, clique e arraste as janelas minimizadas para algum local da janela
principal e depois clique no menu cones Minimizados, veja o resultado:
cones minimizados

6. Algo mais com MDI

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:

private void btnMdiChildren_Click(object sender, EventArgs e)


{
foreach (Form form in this.MdiChildren)
{
form.Text = "Novo Texto";
}
}

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.

Você também pode gostar