Skip to content

SDI и MDI апликације

До сада смо креирали само SDI (Single Document Interface) апликације, односно апликације у којима може бити отворен само један документ (нпр. Notepad). У пракси је често потребно да апликација треба да има могућност да отвори више докумената истовремено (нпр. Visual Studio). Апликације које могу да отворе више докумената истовремено називају се MDI (Multiple Document Interface) апликације. MDI апликације састоје се од родитељског прозора тј. контејнера, у оквиру којег се отварају прозори потомака.

Како би стандардна форма постала родитељска форма, потребно је да својство форме IsMdiContainer поставимо на True.

Како би демонстрирали рад са MDI апликацијама, поред Form1 која је сада родитељска форма, додајмо још две форме Form2 и Form3. На родитељској форми можемо додати и мени са ставкама за приказ форми 2 и 3.

Ако желимо да у оквиру родитељске форме кликом на мени прикажемо форму 2 само једном:

        Form2 f2;
        private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (f2 == null)
            {
                f2 = new Form2();
                f2.MdiParent = this;
                f2.Show();
                f2.FormClosed += new FormClosedEventHandler(f2_zatvorena);
            }
            else
                f2.Activate();
        }

        void f2_zatvorena(object sender, FormClosedEventArgs e)
        {
            f2 = null;
        }

Ако желимо да у оквиру родитељске форме кликом на мени прикажемо форму 3 у више инстанци:

        private void form3ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form3 f3 = new Form3();
            f3.MdiParent = this;
            f3.Show();
        }

Форме потомака нису модалне – не могу се приказивати са ShowDialog()!

MDI шаблон

Како је рад са MDI апликацијама честа пракса, у оквиру развојног окружења Visual Studio направљен је шаблон за MDI родитељске форме. Кренимо са новим Windows Forms пројектом. У менију Project кликните на Add New Item. У Add New Item прозору одаберите MDI Parent и кликните Add.

Form1 који је иницијално креиран можете избрисати у Solution Explorer-у. Такође, у Program.cs измените Form1 са именом којим сте назвали креирану родитељску форму.

        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MDIParent1());
        }

Анализирајте генерисани код за поједине ставке менија у MDI Parent форми.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MDIapp2
{
    public partial class MDIParent1 : Form
    {
        private int childFormNumber = 0;

        public MDIParent1()
        {
            InitializeComponent();
        }

        private void ShowNewForm(object sender, EventArgs e)
        {
            Form childForm = new Form();
            childForm.MdiParent = this;
            childForm.Text = "Window " + childFormNumber++;
            childForm.Show();
        }

        private void OpenFile(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            openFileDialog.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";
            if (openFileDialog.ShowDialog(this) == DialogResult.OK)
            {
                string FileName = openFileDialog.FileName;
            }
        }

        private void SaveAsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            saveFileDialog.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";
            if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
            {
                string FileName = saveFileDialog.FileName;
            }
        }

        private void ExitToolsStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void CutToolStripMenuItem_Click(object sender, EventArgs e)
        {
        }

        private void CopyToolStripMenuItem_Click(object sender, EventArgs e)
        {
        }

        private void PasteToolStripMenuItem_Click(object sender, EventArgs e)
        {
        }

        private void ToolBarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            toolStrip.Visible = toolBarToolStripMenuItem.Checked;
        }

        private void StatusBarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            statusStrip.Visible = statusBarToolStripMenuItem.Checked;
        }

        private void CascadeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.Cascade);
        }

        private void TileVerticalToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.TileVertical);
        }

        private void TileHorizontalToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.TileHorizontal);
        }

        private void ArrangeIconsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.ArrangeIcons);
        }

        private void CloseAllToolStripMenuItem_Click(object sender, EventArgs e)
        {
            foreach (Form childForm in MdiChildren)
            {
                childForm.Close();
            }
        }
    }
}