Introduction
MDI (Multiple Document Interface) is nothing but a way of displaying windows form where there is atleast one parent and many
child windows eg. word Excel Powerpoint kind of windows where each document , sheet or slide act as a child under the parent
container window.
SDI(Single document Interface) examples are Windows Explorer,Internet explorer,Notepad etc...where only one window acts
as an interface. If you are a beginner(or intermediate) and want to develop an MDI application with basic functionality using the powerful
C# language checkout the following step-by-step guide to develop. Even people coming from VB6 background face lots of
problem because of the pure OOPs usage in C#. Follow this small step by step walkthrough to make a small MDI application.
Step by Step Walkthrough
- Goto File->New->Blank Solution
- Select Visual C# Projects in Project Types
- Select WindowsApplication in Templates
- Type for eg. myBestMDI in the Name textbox
- By Clicking the browse button select the location & Click OK
Creating All the Necessary Forms & Coding Them
Creating the Main MDI Form(frmMDIMain) to Act as a Container
- In the View->Solution Explorer click Form1 only once
- Locate the property FileName and type "frmMDIMain.cs"
- In the Solution Explorer now doubleclick frmMDIMain
- Locate the property (Name) and type "frmMDIMain"
- Locate the property Text and type "This is the Parent"
- Locate the property IsMDIContainer and set it to true
- Locate the property WindowState and set it to Maximized
Creating the Child form (frmMChild) to Demonstrate Multiple Instance
- Goto Project Menu-Add Windows Forms & type frmMChild
- In the Solution Explorer now doubleclick frmMChild
- Locate the property Text and type "This is the Multi Instance Child"
- Locate the property size & set it to 568, 464
Creating the Child Form (frmSChild) to Demonstrate Single Instance
- Goto Project Menu-Add Windows Forms & type frmSChild
- In the Solution Explorer now doubleclick frmSChild
- Locate the property Text and type "This is the Single Instance Child"
- Locate the property size & set it to 568, 464\
Creating the About form (frmAbout) to Give Information About this Product
- Goto Project Menu-Add Windows Forms & type frmAbout
- In the Solution Explorer now doubleclick frmAbout
- Locate the property Text and type "About My Best MDI"
- Locate the property size & set it to 448, 304
- Locate the property FormBorderstyle & set it to FixedToolWindow
Creating the Splash form (frmSplash) to Display the Welcome Information with Company Logo
- Goto Project Menu-Add Windows Forms & type frmSplash
- In the Solution Explorer now doubleclick frmSplash
- Locate the property size and set it to 448, 320
- Locate the property ControlBox and set it to False
- Locate the property FormBoderStyle and set it to None
- Locate the property StartupPosition and set it to CenterScreen
- Locate the property BackGroundImage and browse a nice image along with your company logo
- Locate the property cursor & set it to waitCursor
Adding a Timer Control to the Splash Screen for Holding it for Few Seconds so
that the User Can Read It
- Goto View->Toolbox and Double click Timer control
- Locate timer1 control & click it once
- Set its Interval property to 2000 i.e. in milliseconds
- Set its Enabled property to true
- Double click to reach its Tick event
type :-
timer1.Enabled = false;
this.Close();
Adding two classes 1 to Act as the Main Startup Class(clsMain) & 1 for Holding
Global Objects(clsGlobal)
- In the Solution explorer right click the Project Name myBestMdi
- Click Add->New Folder and type classes
- right click the Folder classes
- Click Add->Add New Item and class and type clsGlobal in name
Note: myBestMDI.Classes
is automatically taken as the namespace due to folder level
- change the modifiers for the class from
public class clsGlobal
to public sealed class clsGlobal
(This is to protect an instantiation of this class)
- Just after the curly braces of the class starts paste the following line
public static frmMDIMain g_objfrmMDIMain;
//this is to declare a global static reference to our MDI parent so that the same
//instance is referred across all child with no extra line of code
- Again in the Solution explorer right click the Folder classes
- Click Add->Add New Item and class and type clsMain in name
- just below the constructor clsMain function in the clsMain class paste the following
snippet
[STAThread]
static void Main()
{
try
{
frmSplash objfrmSplash = new frmSplash();
objfrmSplash.ShowDialog();
clsGlobal.g_objfrmMDIMain = new frmMDIMain();
Application.Run(clsGlobal.g_objfrmMDIMain);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message,"My Best MDI",
MessageBoxButtons.OK,MessageBoxIcon.Stop);
}
}
//This is the Single Threaded Apartment Model(out of our scope)
//of the application which will run the Main function
//when the application starts
- Since we are using Application class and MessageBox functions in the above code we need a
add the foolowing line on the top
using System.Windows.Forms;
- Now go to frmMain now and from its code window remove the following piece of code
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
Creating Menus in the main MDI Form
- Click View->Designer of frmMdiMain
- Goto Toolbox and add a double click MainMenu control
- Click once on the typehere menu
- Locate the property Name & set it to mnuFile
- Locate the property Text & set it to &File
Note: & is for underscore which will enable the Hot key 'F'
- Same way click on the sub menu TypeHere box
- Locate the property Name & set it to mnuFileNewMultiple
- Locate the property Text & set it to &New Multiple
- Locate the property ShortCut & choose CtrlN
- Same way click on the sub menu TypeHere box
- Locate the property Name & set it to mnuFileNewSingle
- Locate the property Text & set it to New &Single
- click on the sub menu TypeHere box
- Locate the property Name & set it to mnuFileCloseChild
- Locate the property Text & set it to &Close Child
- click on the sub menu TypeHere box
- Locate the property Name & set it to mnuFileSep1
- Locate the property Text & set it to -
Note - is a hyphen which will automatically put a whole seperator
- click on the sub menu TypeHere box
- Locate the property Name & set it to mnuFileExit
- Locate the property Text & set it to E&xit
Now I am sure by now you should be able to create one more menu
- Create one more top level menu with Name mnuWindow and text &Window
set its MDIList property to true(will show names of opened windows)
with 3 sub menus with name
mnuWindowCascade and text &Cascade
mnuWindowTileVertical and text Tile&Vertical
mnuWindowTileHorizontal and text Tile&Horizontal
- Create one more top level menu with Name mnuHelp and text &Help
with a sub menu with name mnuHelpAbout and text &About...
'...' as the suffix is just a Microsoft convention to signify that the command will show a dialog box.
Putting Life in the Menus Created by Adding Code to It
- Now in the frmSChild code add the following lines
private static frmSChild m_SChildform;
public static frmSChild GetChildInstance()
{
if (m_SChildform ==null) m_SChildform = new frmSChild();
return m_SChildform; }
- Click View->Designer of frmMdiMain again
- Double click New Single Menu on MDI main form
add the following code
frmSChild objfrmSChild = frmSChild.GetChildInstance();
objfrmSChild.MdiParent = this;
objfrmSChild.Show();
objfrmSChild.BringToFront();
- Click View->Designer of frmMdiMain again
- Double click New Multi Menu on MDI main form
add the following code
frmMChild objfrmMChild = new frmMChild();
objfrmMChild.MdiParent = this;
objfrmMChild.Show();
- Double click CloseChild on MDI main form
add the following code
try
{
if(this.ActiveMdiChild.Name =="frmMChild")
{
frmMChild objfrmMChild = (frmMChild)this.ActiveMdiChild;
objfrmMChild.Close();
}
else
{
frmSChild objfrmSChild = (frmSChild)this.ActiveMdiChild;
objfrmSChild.Close();
}
}
catch
{
}
- Double click Exit on MDI main form
add the following code
Application.Exit();
- Double click Cascade menu under Windows on MDI main form
add the following code
this.LayoutMdi(MdiLayout.Cascade);
- same way for tile Vertical add
this.LayoutMdi(MdiLayout.TileVertical);
- and for tile horizontal add
this.LayoutMdi(MdiLayout.TileHorizontal);
- Now finally double click About menu in Help to add
frmAbout objfrmAbout = new frmAbout();
objfrmAbout.ShowDialog();
- Press F5 to start with debugging or Ctrl+F5 to start w/o debugging
Enjoy programming!!