Introduction
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.
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.
Collapse | Copy Code
Form2 chForm = new Form2();
chForm.MdiParent=this;
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
MenuItem
s in the child form has
MergeOrder
values from 1 to 3 so that those
MenuItem
s appear between File and Close
MenuItem
s 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 MenuItem s 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 |
Collapse | Copy Code
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.
Collapse | Copy Code
Form[] charr= this.MdiChildren;
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:
Collapse | Copy Code
private void Form2_Resize(object sender, System.EventArgs e)
{
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:
Collapse | Copy Code
if (pictureBox1.Image != null)
{
Image tmp = pictureBox1.Image;
Graphics g = Graphics.FromImage(tmp);
String wmString = "Code Project";
Font wmFont = new Font("Trebuchet MS", 10);
SolidBrush wmBrush = new SolidBrush(Color.Black);
PointF wmPoint = new PointF(10.0F, 10.0F);
g.DrawString(wmString, wmFont, wmBrush, wmPoint);
pictureBox1.Image= tmp;
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
Comments
Post a Comment