これでひとまず表示はできましたが、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)」の解説を始めます。