Em interface gráfica do usuário (GUI), uma interface de documentos múltiplos, ou MDI, acrônimo para Multiple Document Interface é um método de organização de aplicações gráficas em janelas que residem em uma única janela, a janela principal da aplicação. A única exceção são possíveis janelas modais da aplicação.
Com múltiplas interfaces de documentos, uma única barra de menu e / ou barra de ferramentas é compartilhado entre todas as janelas filho, reduzindo a desordem e uma utilização mais eficiente do espaço na tela. As janelas filho de um aplicativo pode ser ocultada / mostrada / minimizada / maximizada como um todo. Os autores de aplicações multi-plataforma podem fornecer a seus usuários um comportamento consistente da aplicação entre plataformas.
MdiClient
Representa o recipiente para uma interface de documentos múltiplos (MDI) formulários filho. Você definir se um formulário será um container para múltiplos documentos através da propriedade Form.IsMdiContainer.
Form Child
Você pode definir um formulário como filho o atribuindo a um formulário pai através da propriedade MdiParent, que 0btém ou define uma interface de documentos múltiplos.
Exemplo:
Neste exemplo criamos um formulário MDI básico e um menu. Ressaltando que usamos o Design Time do Visual Studio somente para criar os formulários por opção, o código é inserido parte no construtor da classe do formulário e parte no evento OnShown do Form. Você pode criar tudo dinamicamente ou tudo em Design Time. Vale brincar com o construtor e os eventos dos formulários, porque apesar de alguns eventos possuírem funcionalidades parecidas, não são iguais e existem diferenças peculiares entre eles.
Para criar o segundo formulário, clique com o botão direito em cima do seu projeto na janela Solution Explorer e clique em Add e em Windows Form.
C#
Formulario – Pai
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace formularioMdi { public partial class Form1 : Form { // Declara componentes MenuStrip menu; public Form1() { // Inicializa formulario // Define formulario como pai. this.IsMdiContainer = true; // Cria painel para formularios filhos ToolStripPanel painel = new ToolStripPanel(); // Define tamanho do painel painel.Dock = DockStyle.Fill; // Cria barra do menu menu = new MenuStrip(); // Cria menu ToolStripMenuItem itens1 = new ToolStripMenuItem("Formularios"); // Cria itens do menu ToolStripMenuItem m1item1 = new ToolStripMenuItem("Novo", null, new EventHandler(clique1_m1)); ToolStripMenuItem m1item2 = new ToolStripMenuItem("Sair", null, new EventHandler(clique2_m1)); // Adiciona itens ao menu e menu a barra de menu itens1.DropDownItems.Add(m1item1); itens1.DropDownItems.Add(m1item2); menu.Items.Add(itens1); InitializeComponent(); } private void Form1_Shown(object sender, EventArgs e) { // Define texto this.Text = "Desenvolvimento Aberto - Formulario - Main Form / Child Form"; // Define tamanho e posição do formulario principal this.Top = 0; this.Left = 0; this.Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width - 50; this.Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height - 50; // Adiciona menu ao formulario this.Controls.Add(menu); } private void clique1_m1(object sender, EventArgs e) { // Chama instancia do formulario filho FormularioFilho formularioFilho = new FormularioFilho(); formularioFilho.MdiParent = this; // Usa metodo estatico para exibir numero da instancia formularioFilho.Text = "Formulario Filho - Instancia:" + this.MdiChildren.Length.ToString(); // Chama formulario formularioFilho.Show(); } private void clique2_m1(object sender, EventArgs e) { // Fecha formulario this.Close(); } } }
Formulario – Filho
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace formularioMdi { public partial class FormularioFilho : Form { // Declara componentes Label rotulo; TextBox campo; Button botao; public FormularioFilho() { InitializeComponent(); } private void FormularioChild_Shown(object sender, EventArgs e) { // Define tamanho do formulario this.Size = new Size(360, 150); // Cria componentes rotulo = new Label(); campo = new TextBox(); botao = new Button(); // Defie tamanho rotulo.Size = new Size(200, 20); campo.Size = new Size(300, 20); // Define posição rotulo.Location = new Point(12, 20); campo.Location = new Point(12, 40); botao.Location = new Point(12, 70); // Define texto rotulo.Text = "Digite seu nome:"; botao.Text = "Ok"; // Adiciona componentes ao fomrulario this.Controls.Add(rotulo); this.Controls.Add(campo); this.Controls.Add(botao); } } }