6月 13

MDI子ウィンドウをタブ表示にして切り替える

MDI子ウィンドウをタブ表示にする方法です。
VisualStudioのようにウィンドウをタブ表示にしたいことがあると思いますが
ちょっと工夫して擬似的にこれを実現する方法を書いてみます。

完成のサンプルはこんな感じです

mdi_tab

作り方はTabコントロールを貼り付けているだけなのですが、コツは

1.MDI子ウィンドウが1つ以上ある時だけTabコントロールを表示する
2.Tabコントロールのタブ部分のみ表示する
3.MDI子ウィンドウをTabコントロール上に配置するのではない

です。

あとは
・TabコントロールのSelectedIndexChangedイベントハンドラでActiveな子ウィンドウを切り替え
・親FormのMdiChildActivateイベントハンドラでTabコントロールの選択状態を変更

などの処理を自分で書きます。

これを実現する有料コンポーネントなども見かけましたが
手作りで近いものをこの方法で作れると思います。

6月 13

アクティブなMDI子ウィンドウを取得する

現在アクティブなMDI子ウィンドウを取得するには
ActiveMdiChildプロパティーを参照します。

例ではメニューから【閉じる】が選択されると
現在アクティブなMDI子ウィンドウを閉じます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        System.Diagnostics.PerformanceCounter pc = new System.Diagnostics.PerformanceCounter();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // MDI親ウィンドウにする
            this.IsMdiContainer = true;
        }

        private void 開くToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // MDI子ウィンドウを開く
            Form2 form = new Form2();
            form.MdiParent = this;  // 親を指定
            form.Text = "新しいForm:" + this.MdiChildren.Length.ToString();
            form.Show();
        }

        private void 閉じるToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if(this.ActiveMdiChild != null)
            {
                this.ActiveMdiChild.Close();
            }
        }
    }
}
6月 13

MDI子ウィンドウの一覧を表示する

MDI子ウィンドウの一覧を表示する例です。

mdi_child1

このように
あるメニューを選ぶと、MDI子ウィンドウの一覧を表示させたい場合
MenuStripコントロールに仕組みが用意されています。

MDI親ウィンドウにMenuStripを配置し
【ウィンドウ】のようなメニューを追加しておきます。

後はMenuStripのMdiWindowListItemプロパティーに
子ウィンドウの一覧を表示させたいメニューを登録するだけです。

mdi_child2

6月 13

MDIウィンドウを作る

MDIウィンドウの例です。
ウィンドウの中に子ウィンドウが入れ子になっています。

MDIウィンドウを作るには
親にしたいFormのIsMdiContainerプロパティーにtrueを設定するだけです。

子ウィンドウ側は
MdiParentプロパティーに親ウィンドウのインスタンスを設定します。
後はShow()するだけです。

例ではForm1を親ウィンドウ、Form2を子ウィンドウとし、
Form1のメニューより【開く】を選択すると子ウィンドウが表示されます。

mdi

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        System.Diagnostics.PerformanceCounter pc = new System.Diagnostics.PerformanceCounter();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // MDI親ウィンドウにする
            this.IsMdiContainer = true;
        }

        private void 開くToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // MDI子ウィンドウを開く
            Form2 form = new Form2();
            form.MdiParent = this;  // 親を指定
            form.Text = "新しいForm:" + this.MdiChildren.Length.ToString();
            form.Show();
        }
    }
}