کار با فرم های MDI

MDI یا Multiple Document Interface، نوعی طراحی رابط گرافیکی چند سندی است که، در آن کاربر قادر است، از چند فرم (فرزند) در داخل یک فرم (پدر) استفاده کند. مثالی از یک رابط چند سندی، نرم افزار مایکروسافت Word یا Excel هست. وقتی Excel رو اجرا می‌کنید یک پنجره والد ظاهر می‌شود که در این پنجره پدر می‌توانید هر تعداد سند بعنوان پنجره‌های فرزند ظاهر می‌گردند را باز کنید.

در یک برنامه MDI، تمام پنجره‌های فرزند از یک نوار ابزار و یا نوار منو که در پنجره والد ظاهر می‌گردد، بصورت مشترک استفاده می‌کنند. یک از محدودیت‌های پنجره‌های فرزند اینست که، می‌توانند تنها در محدوده‌های پنجره والد وجود داشته باشند. اجازه دهید که نحوه کار با فرم‌های چند سندی را با یک مثال توضیح دهیم. یک برنامه ویندوزی ایجاد کرده و نام آن را MDIFroms بگذارید. بعد از بالا آمدن برنامه خاصیت IsMdiContainer فرم را به true تغییر می‌دهید. مشاهده می‌کنید که رنگ پس زمینه فرم به رنگ طوسی پر رنگ در می‌آید :
mdi-form-in-c#-01
با این کار فرم پدر ایجاد می‌شود. حال نوبت به اضافه کردن فرم فرزند می‌رسد. برای اضافه کردن فرم دوم یا فرم فرزند به برنامه به صورت زیر عمل می‌کنیم :
mdi-form-in-c#-02
نام فرم را هم در حالت پیشفرض رها کرده و دکمه add را می‌زنیم :
mdi-form-in-c#-03
همانطور که در شکل زیر مشاهده می‌کنید، یک فرم به نام Form2 به برنامه اضافه می‌شود :
mdi-form-in-c#-04
حال یک منو با استفاده از کنترل MenuStrip به فرم اول یا From1 و چند زیر منو هم به منو اضافه می‌کنیم :
mdi-form-in-c#-05
mdi-form-in-c#-06

حال بر روی زیر منوی Show Form1 دوبار کلیک کرده و کد زیر را در رویداد کلیک آن می‌نویسیم :

private void showForm2ToolStripMenuItem_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2();           
    frm2.Show();
    frm2.MdiParent = this;
}

به کلمه کلیدی this در کد بالا توجه کنید. چون این کلمه را در داخل فرم اول نوشته‌ایم در نتیجه به همین فرم اشاره می‌کند. و معنای آن این است که فرم والد frm2 همین فرم است. برنامه را اجرا کرده و بر روی زیر منوی Show Form2 کلیک کنید :
mdi-form-in-c#-07
همانطور که در شکل بالا مشاهده می‌کنید، فرم دوم در داخل فرم اول نمایش داده و نسبت به گوشه بالا سمت چپ تراز می‌شود. اگر دوباره بر روی گزینه Show Form2 مشاهده می‌کنید که یک بار دیگر فرم دوم در داخل فرم اول به نمایش در می‌آید، برای جلوگیری از این کار می‌توانید کد بالا را به صورت زیر تغییر دهید :

private void showForm2ToolStripMenuItem_Click(object sender, EventArgs e)
{
    foreach (Form form in Application.OpenForms)
    {                                           
        if (form.GetType() == typeof(Form2))    
        {                                       
            form.Activate();                    
            return;                             
        }                                       
    }                                           

    Form2 frm2 = new Form2();         
    frm2.Show();
    frm2.MdiParent = this;

}

حال اگر بخواهید فرم دوم در وسط فرم اول نمایش داده شود می‌توانید کد زیر را هم به انتهای کدهای بالا اضافه کنید :

frm2.StartPosition = FormStartPosition.CenterScreen;

البته به جای CenterScreen می‌توان مقادیر CenterParent، Manual، WindowsDefaultBounds و WindowsDefaultLocation را نوشت و نحوه عملکرد آنها را امتحان کرد. حال اگر بخواهید فرم فرزند کل فرم اول را در بر بگیرد و با تغییر سایز فرم پدر او نیز تغییر اندازه دهد باید از کد زیر استفاده کنید :

frm2.Dock = DockStyle.Fill;

حال برنامه را اجرا و نتیجه را مشاهده کنید :
mdi-form-in-c#-09
البته این خط بالا را در برنامه فقط برای تست بنویسید و دوباره پاک کنید. اگر بخواهید از چند فرم در داخل فرم پدر استفاده کنید، وضع به همین منوال است. یک فرم دیگر به برنامه بالا و یک زیر منو هم به صورت زیر به منو اضافه کنید :
mdi-form-in-c#-10
بر روی زیرمنوی جدید دوبار کلیک کرده و کدهای زیر را در داخل آن بنویسید :

private void showForm3ToolStripMenuItem_Click(object sender, EventArgs e)
{
    Form3 frm3 = new Form3();
    frm3.StartPosition = FormStartPosition.CenterScreen;
    frm3.Show();
    frm3.MdiParent = this;

}

برنامه را اجرا و هر دو فرم را باز کنید :
mdi-form-in-c#-12
مشاهده می‌کنید که هر دو فرم بر روی هم قرار می‌گیرند چون خاصیت StartPosition بر روی CenterScreen است. حال اگر بخواهید آنها را به صورت مرتب‌تری در داخل فرم اول نمایش دهید باید چکار کنید؟ یک منوی با چند زیر منوی دیگر به فرم اضافه کنید :
mdi-form-in-c#-11
به ترتیب بر روی زیر منوهای بالا کلیک کرده و کدهای زیر را در داخل آنها بنویسید :

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

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

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

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

اجرای برنامه و کلیک بر روی زیر منوهای بالا به صورت زیر است :
mdi-form-in-c#-13
Cascade
 

mdi-form-in-c#-14
Horizontal
 

mdi-form-in-c#-15
Vertical
 
به این نکته توجه کنید که گزینه Arrange icon فقط در صورتیکه فرم‌های فرزند Minimize باشند کار می‌کند. به این صورت که اگر فرم‌ها را Minimize کرده و ترتیب آنها را بر هم بزنید این گزینه آنها را مرتب می‌کند :
mdi-form-in-c#-16

mdi-form-in-c#-17