Click here to Skip to main content
Click here to Skip to main content

Introduction to MDI Forms with C#

, 24 Jan 2003 CPOL
Rate this:
Please Sign up or sign in to vote.
An article on how to develop an MDI application using C# and the .NET Framework.

Introduction

This article tries to explain how to develop an MDI application. Text editors and image editors are common examples where multiple document interfaces are useful. The attached demo application allows you to open images in child windows and then watermark them with a custom text.

Using the code

Creating parent window

Add a new form to your application. To make this form as the parent form, set its IsMDIContainer property to true. A MainMenu can be added to the parent form, which will have options to open a new child form, close a child form, switch between child forms, and change layout style of child forms.

Creating child form template

Add a second form which will be the template for the child forms. Each time you want to create a new child window to your application, you can create a new instance of this template form and make the first form as its parent form.

//Create a new instance of the MDI child template form
Form2 chForm = new Form2(); 

//Set parent form for the child window 
chForm.MdiParent=this;

//Display the child window
chForm.Show();

Merging menus of child and parent

When we have a MainMenu for both the parent and child form(s), we can merge the menus if we want to do so. This is done by setting the MergeType property of the MenuItem(s) to MergeItems. In the sample, I wanted the File menu of the child and the parent to merge. So I set the MergeType property to MergeItems for the File MenuItem of the child and the parent forms. In addition, we can utilize the MergeOrder property of the MenuItem(s) to set the relative position of each MenuItem, when menus are merged. In my sample application, I have set the MergeOrder property of the New MenuItem in the parent form to 0 and that of the Close MenuItem to 4. The MenuItems in the child form has MergeOrder values from 1 to 3 so that those MenuItems appear between File and Close MenuItems of the parent form, after merge.

The MergeType property can be assigned any of the following four values:

Value Meaning
Add A MenuItem is added to the combined set of MenuItems while merging menus
Remove A MenuItem is not included when menus are merged
MergeItems When you have submenu items to a MenuItem, use this value to merge the items to the combined menu
Replace This value is used when a MenuItem should replace another MenuItem in the same position in a merged menu.

Changing layout of child windows within the parent

To change the layout of child forms within a parent form use LayoutMdi method of the parent form. Child forms can be tiled horizontally, vertically, cascaded or as icons within the parent form. MdiLayout enumeration has four values which can be supplied as arguments to the LayoutMdi method to achieve any of the four layouts.

Value Purpose
ArrangeIcons child window icons are arranged within the parent
Cascade arrange the child windows within the parent window in a cascaded fashion
TileHorizontal tile the child windows horizontally
TileVertical tile the child windows vertically
//Cascade all child forms.        
this.LayoutMdi(System.Windows.Forms.MdiLayout.Cascade);

Minimize all and Maximize all

The MdiChildren property of a form gives the array of child forms which belong to the parent form. To maximize or minimize all child windows together, all we need to do is to loop through this array of child forms and set the WindowState property of each child form to the proper value in FormWindowState enumeration.

//Gets forms that represent the MDI child forms 
//that are parented to this form in an array 
Form[] charr= this.MdiChildren; 
     
//For each child form set the window state to Maximized 
foreach (Form chform in charr) 
   chform.WindowState=FormWindowState.Maximized;

If we loop through the child forms and call the Close method of each, we will get a "Close all child forms" feature.

Adding scroll for large images

The child form template has a Panel and a PictureBox control. A Panel is a container control. And if its AutoScroll property is set to true, any controls contained within it can be scrolled. I have set the SizeMode property of PictureBox to AutoSize so that it resizes according to the image it contains. The Panel will add scrolls to the PictureBox if the image is larger than the display area of the PictureBox.

Making the images resize with the form

When a child window is resized the PictureBox has to be resized to fit in the child window. This can be attained using the following code in the resize event:

private void Form2_Resize(object sender, System.EventArgs e) 
{ 
    //Resize the panel to fit in the form 
    //when the form is maximised or minimised 
    panel1.Width= this.Width-20; 
    panel1.Height=this.Height-40; 
}

Adding a simple text watermark to an image

To add a text watermark to the image in the child window this is what we do:

if (pictureBox1.Image != null)
{
    //Create image.
    Image tmp = pictureBox1.Image;
    //Create graphics object for alteration.
    Graphics g = Graphics.FromImage(tmp);

    //Create string to draw. 
    String wmString = "Code Project"; 
    //Create font and brush.
    Font wmFont = new Font("Trebuchet MS", 10); 
    SolidBrush wmBrush = new SolidBrush(Color.Black); 
    //Create point for upper-left corner of drawing. 
    PointF wmPoint = new PointF(10.0F, 10.0F);
    //Draw string to image.
    g.DrawString(wmString, wmFont, wmBrush, wmPoint);
    //Load the new image to picturebox 
    pictureBox1.Image= tmp;        
    //Release graphics object. 
    g.Dispose();                
}

We create a Graphics object of the image in the PictureBox. The DrawString method of the Graphics object is used to add a watermark text to the image. This method draws a specified text string at the specified location.

Points of Interest

  • When an MDI parent form is closed all child forms are closed before it.
  • Use ActiveMdiChild property of the parent form to find the currently active child window. I have used this to implement the Close child form feature.
  • Setting the MDIList property of a MenuItem to true, will give at runtime, a list of all open child forms. It will display a tick mark next to the active child window. [This is how the Window MenuItem in the sample is implemented].

Acknowledgement

  • C# Guru - James T Johnson, for enlightening me on how Panel Class can be effectively used to avoid scrollbar headache.
  • Nish, for reviewing and commenting on this work.
  • All CP'ians who encouraged my first article, prompting me to write another, when I myself had to do some learning on MDI forms.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Smitha Vijayan
The Code Project
United States United States
Smitha is a software developer, and has been in the industry since January 2000. She has experience in ASP.NET, C#, Windows Forms, Visual Basic, ASP, JavaScript, VBScript, and HTML. She has been with CodeProject since 2003 and currently works as Senior Editor.
 
In her free time, she tries out new dishes, reads a little, and puts together jigsaw puzzles. Originally from Trivandrum, Smitha currently lives with her husband and fellow CP'ian Nish [^] and her son Rohan in Columbus, Ohio.

Comments and Discussions

 
GeneralThanks PinmemberСергей Чеботарев10-Nov-14 1:39 
GeneralMy vote of 2 PinmemberMember 105072406-Jan-14 14:20 
AnswerRe: My vote of 2 [modified] PinmemberLeo Tully17-Mar-14 10:48 
QuestionWHY YOU DELETE MY ARTICLES? PinmemberOpenXLive24-Apr-13 23:32 
GeneralMy vote of 4 Pinmemberupendra kumar pandey24-Jan-13 0:03 
QuestionMDI Forms PinmemberChris@noruo3-Oct-12 6:36 
GeneralMy vote of 5 Pinmemberkamlesh_patidar9-Sep-12 4:41 
Questionmdi parent form Pinmemberarun_kamboj15-Aug-12 12:50 
Questionhow to hide main panel of child form in which the minimize and maximize button is situated PinmemberAditya Singh23-Jul-12 22:32 
QuestionMDI Form in C# 3.5 PinmemberDibu.net15-Jul-12 6:52 
Questionc# to solve ant colony PinmemberMember 80430366-May-12 5:44 
GeneralMy vote of 5 PinmemberShahin Khorshidnia12-Mar-12 11:41 
GeneralMy vote of 5 PinmemberMember 249996119-Feb-12 0:58 
GeneralMy vote of 5 Pinmemberversion_2.016-Aug-11 22:14 
QuestionMy vote of 5 PinmemberMassimo Conti21-Jun-11 11:29 
GeneralMy vote of 5 Pinmembermc_avr9-May-11 20:47 
GeneralMy vote of 5 Pinmemberdarshan yadav23-Dec-10 21:17 
Generalcalling mdi child form from another child Pinmemberfrancis36-Oct-09 22:41 
GeneralRe: calling mdi child form from another child Pinmembersouvikcode21-Jan-12 6:47 
GeneralGreat PinmemberMohammad Dayyan15-Sep-09 12:47 
GeneralNice Article Pinmemberravivertis2-Jun-09 22:00 
Generalpls help Pinmemberskvs2-Jun-09 3:59 
GeneralRe: pls help Pinmemberskvs2-Jun-09 4:27 
GeneralHI. Pinmemberskvs28-May-09 7:33 
QuestionOpening MDI child in normal window state Pinmembersudagnr2-Feb-09 20:46 
GeneralMy vote of 1 Pinmembergirish giri16-Dec-08 0:44 
QuestionSpawning a new form PinmemberbuyValu27-Aug-08 6:55 
GeneralHI PinmemberYulianto.10-Jul-08 16:26 
QuestionHow to change child window location when it is minimized PinmemberMember 276154118-Jun-08 21:32 
AnswerRe: How to change child window location when it is minimized Pinmemberdidietexas15-Jul-09 5:58 
Generalthanks and... Pinmembervish11113-Jun-08 23:19 
GeneralMDI Child Forms in C# .NEt PinmemberEdwinDanny3-Jun-08 14:27 
QuestionProblem to get values from one child form to other child form Pinmembersaqib_tipo24-Apr-08 13:44 
AnswerRe: Problem to get values from one child form to other child form PinmemberEFEaglehouse10-Mar-11 10:04 
GeneralThanks PinmemberMurat Firat28-Oct-07 9:13 
Questionenable and disable menu of Mdi form in C# Pinmemberkk_upadhyay16-Jul-07 5:21 
QuestionError in creating window handle C# Pinmembercodeprojectsan15-May-07 5:22 
QuestionMergeItems? PinmemberDRAYKKO12-May-07 1:52 
Generalhelp... PinmemberMember #38862364-Mar-07 3:53 
GeneralThank you miss "Heidi"! Pinmember¤ Muammar ¤3-Dec-06 22:44 
GeneralChild form is not showing on the top Pinmembermsshweta9-Nov-06 18:58 
GeneralRe: Child form is not showing on the top PinmemberRajiv Kr. Gautam25-Jun-08 1:42 
Generalaccessing controls between 2 child forms PinmemberGodwin Sam Josh21-Sep-06 2:54 
GeneralRestrict Child to Client PinmemberLimeyRedneck30-Aug-05 12:55 
General[Message Deleted] PinmemberJignesh Dhamecha13-Jul-05 12:38 
GeneralRe: Do you think this source code is working PinstaffNishant Sivakumar14-Jul-05 19:48 
GeneralRe: Do you think this source code is working PinstaffSmitha Vijayan14-Jul-05 19:53 
GeneralRe: Do you think this source code is working PinstaffNishant Sivakumar14-Jul-05 19:56 
GeneralOpen an image processing in a Child Pinmembertulo_mga12-Apr-05 5:18 
GeneralDisable/enable MDI Parent toolbar Pinmembermarysiatko12-Oct-04 1:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.1411023.1 | Last Updated 25 Jan 2003
Article Copyright 2003 by Smitha Vijayan
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid