これでひとまず表示はできましたが、MDIでは子フォームの管理が重要となります。子フォームを自動的に並べて表示するには、System.Windows.Forms.FormクラスのLayoutMdiメソッドを使用します。
また、子フォームの一覧を表示するメニューを作るには、System.Windows.Forms.MenuStripオブジェクトのMdiWindowListItemプロパティにSystem.Windows.Forms.ToolStripMenuItemオブジェクトのインスタンスを指定します。子フォームの管理を最低限だけ行うサンプルプロジェクトLayoutMdiSampleのコードを掲載しますので、コードをよく見てください。
using System;
using System.Windows.Forms;
static class LayoutMdiSample
{
static void Main()
{
//---------------------------------親フォームを作成---------------------------------
Form parent = new Form();
parent.Text = "親フォーム";
parent.IsMdiContainer = true;
parent.WindowState = FormWindowState.Maximized;
//-------------------------------各種メニューを作成-------------------------------
//子フォームの表示方法を指定するメニュー
ToolStripMenuItem WindowLayoutMenu = new ToolStripMenuItem();
WindowLayoutMenu.Name = "WindowLayoutMenu";
WindowLayoutMenu.Text = "ウィンドウの表示";
WindowLayoutMenu.AutoSize = true;
//子フォームを重ねて表示するメニュー
ToolStripMenuItem CascadeMenu = new ToolStripMenuItem();
CascadeMenu.Name = "CascadeMenu";
CascadeMenu.Text = "重ねて表示";
CascadeMenu.AutoSize = true;
CascadeMenu.Click += delegate {
parent.LayoutMdi( MdiLayout.Cascade );
};
//子フォームを垂直に並べて表示するメニュー
ToolStripMenuItem TileVerticalMenu = new ToolStripMenuItem();
TileVerticalMenu.Name = "TileVerticalMenu";
TileVerticalMenu.Text = "垂直に並べて表示";
TileVerticalMenu.AutoSize = true;
TileVerticalMenu.Click += delegate {
parent.LayoutMdi( MdiLayout.TileVertical );
};
//子フォームを水平に並べて表示するメニュー
ToolStripMenuItem TileHorizontalMenu = new ToolStripMenuItem();
TileHorizontalMenu.Name = "TileHorizontalMenu";
TileHorizontalMenu.Text = "水平に並べて表示";
TileHorizontalMenu.Click += delegate {
parent.LayoutMdi( MdiLayout.TileHorizontal );
};
//子フォームを最小表示状態で並べて表示する(子フォームをアイコン化する)メニュー
ToolStripMenuItem ArrangeIconsMenu = new ToolStripMenuItem();
ArrangeIconsMenu.Name = "ArrangeIconsMenu";
ArrangeIconsMenu.Text = "最小表示状態のフォームを並べる";
ArrangeIconsMenu.AutoSize = true;
ArrangeIconsMenu.Click += delegate {
parent.LayoutMdi( MdiLayout.ArrangeIcons );
};
//子フォームの一覧を表示するメニュー
ToolStripMenuItem WindowMenu = new ToolStripMenuItem();
WindowMenu.Name = "WindowMenu";
WindowMenu.Text = "ウインドウ";
WindowMenu.AutoSize = true;
//全てのメニューを持つメインメニュー
MenuStrip MainMenu = new MenuStrip();
MainMenu.Name = "MainMenu";
//--------------------------------各種メニューを設定--------------------------------
WindowLayoutMenu.DropDownItems.AddRange( new ToolStripItem[ ] {
CascadeMenu, TileVerticalMenu, TileHorizontalMenu, ArrangeIconsMenu
} );
MainMenu.Items.AddRange( new ToolStripItem[ ] {
WindowLayoutMenu, WindowMenu} );
MainMenu.MdiWindowListItem = WindowMenu;
parent.MainMenuStrip = MainMenu;
parent.Controls.Add( MainMenu );
//---------------------------------子フォームを作成---------------------------------
Form child = new Form();
child.Text = "子フォーム1";
child.MdiParent = parent;
child.Show();
Form child1 = new Form();
child1.Text = "子フォーム2";
child1.MdiParent = parent;
child1.Show();
Form child2 = new Form();
child2.Text = "子フォーム3";
child2.MdiParent = parent;
child2.Show();
//-------------------------------------実行開始-------------------------------------
Application.EnableVisualStyles();
Application.Run( parent );
}
}

サンプルを実行して分かりにくいのがLayoutMdi( MdiLayout.ArrangeIcons )だと思います。MdiLayout.ArrangeIconsが指定された場合は、「最小表示になっているフォーム」のみ画面の隅で整列されます。そのため、最小表示にしていないフォームは整列しません。一度サンプルで、複数のフォームを最小表示してから実行してみてください。
これで基本的なMDIアプリケーションについての解説は終わりです。サンプルを触っていると、細かい点で気になるところがあると思いますが、仮想ネットワークの話題とは関係ないのでひとまず気にしないでください。
次項からはGraffitiを実装するために必要となる、.NETのグラフィックプログラミング「GDI+(Graphical Device Interface)」の解説を始めます。
