![]() |
Languages »
C# »
Windows Forms
Beginner
License: The Code Project Open License (CPOL)
Introduction to MDI Forms with C#By Smitha VijayanAn article on how to develop an MDI application using C# and the .NET framework |
C#, Windows, .NET 1.0, Dev
|
|
Advanced Search |
|
|
|
||||||||||||||||

This article tries to explain how to develop an MDI application. Text editors and image editors are common examples where multiple documents are useful. The attached demo application allows you to open images in child windows and then watermark them with a custom text.
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.
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();
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. |
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);
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.
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
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;
}
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.
ActiveMdiChild
property of the parent form to find the currently active child window. I have
used this to implement the Close child form feature.
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].
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 24 Jan 2003 Editor: Nishant Sivakumar |
Copyright 2003 by Smitha Vijayan Everything else Copyright © CodeProject, 1999-2009 Web20 | Advertise on the Code Project |