C# Programming

Imageダイアログ

開発環境: Visual Studio 2003 

1.目次

2.目的

Windows.Forms.Form の基礎について説明します。

3.参考書

(1) VisualStudio.NET のヘルプ

4.ダイアログのスタイル

ダイアログのスタイルは、ダイアログのプロパティの "FormBorderStyle" で指定します(下図)。

None

Image

FixedSingle

Image

Fixed3D

Image

FixedDialog

Image

Sizable

Image

FixedToolWindow

Image

SizableToolWindow

Image

5.モーダルダイアログと、モードレスダイアログの違い

ダイアログには、ダイアログが終了するまで他のウィンドウの操作ができないモーダルダイアログと、MDIのようなモードレスダイアログがあります。
モード動作
モーダル ダイアログモーダルダイアログを表示している間は、常にモーダルダイアログが主で、モーダルダイアログを起動したもともとものメインウィンドウでのキーボードやマウスのクリックはできません。
モードレス ダイアログ これに対し、モードレスダイアログでは、メインウィンドウとモードレスダイアログの どちらにでも、キーボードやマウスのクリックができます。

6.モーダルダイアログの作り方


手順作り方
プロジェクトから Windows.Forms 新規プロジェクト (Dialogs1) を作成します。
これが親ウィンドウになります。
メインウィンドウは、デフォルトで Form1.cs になっているはずです。

ソリューションエクスプローラで、Dialog1 プロジェクトを右クリックし、追加→Windowsフォームの追加を選択します。 すると、新しい項目の追加ダイアログが表示されます。(下図) ここで、テンプレートより、Windows フォームを選択し、Form2.cs を追加します。 これが、子ウィンドウになります。 すると、Windows.Forms.Form から継承した Form2 クラス (ファイルは Form2.cs) がプロジェクトに追加されます。 ここでは、この Form2 をモーダルダイアログで表示するようにします。

Image
メインのフォームウィンドウより、次のように ShowDialog() で、モーダルダイアログ(Form2.cs) を起動します。
モーダルダイアログが閉じるまで、ShowDialog() からの制御は返りません。
ShowDialog() の返り値は、DialogResult です。この返り値に応じて適切な処理を実装します。
この DialogResult の返り値は、OK, Cance, Yes, No, Abort, Ignore, Retry, None のおなじみの値が定義されています。

                        Form modalDialog = new Form2();
                        DialogResult result = modalDialog.ShowDialog();
                        switch(result)
                        {
                                case DialogResult.OK:
                                        // 適当な処理
                                        break;
                                case DialogResult.Cancel:
                                        // 適当な処理
                                        break;
                                case DialogResult.Yes:
                                        // 適当な処理
                                        break;
                                case DialogResult.No:
                                        // 適当な処理
                                        break;
                                case DialogResult.Abort:
                                        // 適当な処理
                                        break;
                                case DialogResult.Ignore:
                                        // 適当な処理
                                        break;
                                case DialogResult.Retry:
                                        // 適当な処理
                                        break;
                                case DialogResult.None:
                                        // 適当な処理
                                        break;
                        }
モーダルダイアログに、OK, Cance, Yes, No, Abort, Ignore, Retry, None ボタンを作ります。
まずは、Form2.cs のフォームデザイナーで、ツールバーより ボタンを7つ配置し、それぞれ ボタンのテキストに OK, Cancel などとセットします。

次に、OKボタンのプロパティを下図のように開きます。"DialogResult" というボタンの属性があるので、そのドロップダウンリストの中から、OK を選びます。これだけで、このボタンを押しただけで、ダイアログが閉じて、ShowDialog() の返り値として DialogResult.OK が返ります。

同様に、Cancel, Yes, No ....とセットしていきます。

Image
ダイアログで リターンキーを押した場合は OK ボタン、エスケープを押した場合は キャンセルボタンを押したのと同じ効果を得るというWindows のお作法があるようですね。
それを実現するには、FormのAcceptButton と、CancelButton プロパティを使用します。
次のように、Form2 のプロパティを開き、AcceptButton には OKボタン、CancelButton には Cancel ボタンをそれぞれ割り当てるだけでOKです。

Image
以上で、ほとんど実装することなく、モーダルダイアログができます。

7.モードレスダイアログ

モーダルダイアログでは、ShowDialog() で呼び出しましたが、モードレスダイアログでは Show() で呼び出します。
Show() の返り値は、void で、先ほどのような DialogResult は使えません。
それでは、先ほどの Form2 のモーダルダイアログをモードレスで呼び出してみましょう。
手順作り方
メインウィンドウの Form1.cs にボタンを追加し、モーダルダイアログという名前にします。

1で作ったボタンをダブルクリックし、イベントハンドラを追加します。

                private void button2_Click(object sender, System.EventArgs e)
                {
                        Form2 form2 = new Form2();
                        form2.Show();
                }

コンパイルして、モードレスダイアログを1回押してみてください。Form2 が表示されたと思います。
ここで、OK, Cancel などのボタンを押してみてください。今度は、何も起こらないですよね。
Xボタンで、明示的にForm を閉じるまで、モーダルダイアログは存在し続けます。
button2_Click で作った form2 インスタンスは、
どこかメモリ上で宙ぶらりんの状態(ダングリング ポインター)になってしまいます。
ですから、このような実装は NG です。

では、連続してモードレスダイアログのボタンを2回押してみてください。
今度は、モーダルダイアログが2つ表示されたと思います。

このように、何も考えずに form2.Show() をどんどん呼べてしまうので、
モーダルダイアログの場合はインスタンスの管理をしっかりするか、
次のようなシングルトンにしないとバグの原因になります。


8.モードレス ダイアログを1つしか表示しない(シングルトン モードレス ダイアログ)

 たとえば、フォントを設定するようなダイアログは、複数表示したくないですよね。
このような場合には、シングルトン ダイアログにすることにより解決できます。
シングルトンにする方法は、こちらを参照にしてください。
注意: 
この方法だと、Form を X ボタンで閉じて、もう一度 Form を起動した場合に、
Form のインスタンスが残っているにもかかわらず Form のコントロールが Dispose されてしまい、
エラーになってしまいます。
このため、次のように Dispose された場合にインスタンスを作り直すようにする必要があります。
手順作り方
Form3 をプロジェクトに追加します。

Form3 は、シールドクラスにして次で説明する Instance() をオーバライドされないようにします。

sealed class Form3 : System.Windows.Forms.Form
Form3 のコンストラクターを private にし、Form のインスタンスを次のように定義します。
                private static Form3 instance = new Form3();

                public static Form3 Instance()
                {
                        if (instance.IsDisposed) 
                                        instance = new Form3();
                        return instance;
                }

Form1 でボタンが押されたら、次のように Form3 のインスタンスに対し、Show() します。

                private void button3_Click(object sender, System.EventArgs e)
                {
                        Form3.Instance().Show();
                }

9.フォームの親子関係

モーダル フォームの親子関係を持たせることにより、親のフォームを最小化すると、子のフォームを最小化することができます。
また、同様に親フォームを閉じると、子フォームも閉じることができます。

逆に言えば、親子関係がないモーダルフォームは、親を最小化しても、他のモーダルフォームには影響ないということです。
ただし、起動もとのフォームを閉じてしまうと、インスタンスそのものがなくなってしまうので、他のモーダルフォームも存在できなくなり、
すべてのフォームが閉じることになります。

手順作り方
自分を子フォームにする子になるフォームのプロパティの Owner で親フォームのインスタンスをしてします。
すると、自動的に親フォームの OwnedForms プロパティに子フォームのインスタンスが追加されます。
子フォームをやめる。フォームのプロパティの Owner を null にする。
自分を親フォームにする。親になるフォームの AddOwnedForm(子フォームのインスタンス) メソッドで子フォームを指定します(養子と同じ)。
すると、自動的に子フォームの Owner プロパティに親フォームのインスタンスが追加されます。
親フォームをやめる。フォームの RemoveOwnedForm(子フォームのインスタンス) で子フォームをはずします(捨て子と同じ)。
すると、自動的に子フォームの Owner プロパティも null になります。

10.MDI のフォームを作る。

MDI ウィンドウを作るには、まず親ウィンドウの IsMdiContainer プロパティを true にします。
次に、子ウィンドウ側の MdiParent で親ウィンドウを指定します。
手順作り方
親ウィンドウから
子ウィンドウをMDI にする。
private Form form2 = new Form2();

this.IsMdiContainer = true;
form2.Show();
form3.Show();

form2.MdiParent = this;
子ウィンドウから、
MDI から抜ける。
this.MdiParent = null;

11. 4〜10までのソースコード

3つのフォーム(Form1.cs, Form2.cs, Form3.cs) から構成されています。

Form1.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace Dialogs1
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
                private System.Windows.Forms.Button button1;
                private System.Windows.Forms.Button button2;
                private System.Windows.Forms.Label label1;
                private System.Windows.Forms.Button button3;
                private System.Windows.Forms.Button button4;
                private System.Windows.Forms.Button button5;
                private System.Windows.Forms.GroupBox groupBox1;
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form1()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.button1 = new System.Windows.Forms.Button();
                        this.button2 = new System.Windows.Forms.Button();
                        this.label1 = new System.Windows.Forms.Label();
                        this.button3 = new System.Windows.Forms.Button();
                        this.button4 = new System.Windows.Forms.Button();
                        this.button5 = new System.Windows.Forms.Button();
                        this.groupBox1 = new System.Windows.Forms.GroupBox();
                        this.groupBox1.SuspendLayout();
                        this.SuspendLayout();
                        // 
                        // button1
                        // 
                        this.button1.Location = new System.Drawing.Point(32, 16);
                        this.button1.Name = "button1";
                        this.button1.Size = new System.Drawing.Size(176, 40);
                        this.button1.TabIndex = 3;
                        this.button1.Text = "モードレス ダイアログ";
                        this.button1.Click += new System.EventHandler(this.button1_Click);
                        // 
                        // button2
                        // 
                        this.button2.Location = new System.Drawing.Point(32, 72);
                        this.button2.Name = "button2";
                        this.button2.Size = new System.Drawing.Size(176, 40);
                        this.button2.TabIndex = 4;
                        this.button2.Text = "モーダル ダイアログ";
                        this.button2.Click += new System.EventHandler(this.button2_Click);
                        // 
                        // label1
                        // 
                        this.label1.Location = new System.Drawing.Point(248, 24);
                        this.label1.Name = "label1";
                        this.label1.Size = new System.Drawing.Size(176, 23);
                        this.label1.TabIndex = 5;
                        this.label1.Text = "ModalDialog の結果";
                        // 
                        // button3
                        // 
                        this.button3.Location = new System.Drawing.Point(32, 160);
                        this.button3.Name = "button3";
                        this.button3.Size = new System.Drawing.Size(176, 40);
                        this.button3.TabIndex = 6;
                        this.button3.Text = "シングルトン モーダル ダイアログ";
                        this.button3.Click += new System.EventHandler(this.button3_Click);
                        // 
                        // button4
                        // 
                        this.button4.Location = new System.Drawing.Point(120, 88);
                        this.button4.Name = "button4";
                        this.button4.Size = new System.Drawing.Size(112, 32);
                        this.button4.TabIndex = 7;
                        this.button4.Text = "従属にする。";
                        this.button4.Click += new System.EventHandler(this.button4_Click);
                        // 
                        // button5
                        // 
                        this.button5.Location = new System.Drawing.Point(248, 88);
                        this.button5.Name = "button5";
                        this.button5.Size = new System.Drawing.Size(112, 32);
                        this.button5.TabIndex = 8;
                        this.button5.Text = "従属を解除する。";
                        this.button5.Click += new System.EventHandler(this.button5_Click);
                        // 
                        // groupBox1
                        // 
                        this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
                        this.button4,
                        this.button5});
                        this.groupBox1.Location = new System.Drawing.Point(16, 128);
                        this.groupBox1.Name = "groupBox1";
                        this.groupBox1.Size = new System.Drawing.Size(384, 136);
                        this.groupBox1.TabIndex = 9;
                        this.groupBox1.TabStop = false;
                        this.groupBox1.Text = "groupBox1";
                        // 
                        // Form1
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(432, 278);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                        this.button3,
                        this.label1,
                        this.button2,
                        this.button1,
                        this.groupBox1});
                        this.Name = "Form1";
                        this.Text = "Form1";
                        this.groupBox1.ResumeLayout(false);
                        this.ResumeLayout(false);

                }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new Form1());
                }

                private void button1_Click(object sender, System.EventArgs e)
                {
                        Form modalDialog = new Form2();
                        DialogResult result = modalDialog.ShowDialog();
                        switch(result)
                        {
                                case DialogResult.OK:
                                        //
                                        break;
                                case DialogResult.Cancel:
                                        //
                                        break;
                                case DialogResult.Yes:
                                        //
                                        break;
                                case DialogResult.No:
                                        //
                                        break;
                                case DialogResult.Abort:
                                        //
                                        break;
                                case DialogResult.Ignore:
                                        //
                                        break;
                                case DialogResult.Retry:
                                        //
                                        break;
                                case DialogResult.None:
                                        //
                                        break;
                        }
                        this.label1.Text = result.ToString() + " が押されました。";
                }

                private void button2_Click(object sender, System.EventArgs e)
                {
                        Form2 form2 = new Form2();
                        form2.Show();
                }

                private void button3_Click(object sender, System.EventArgs e)
                {
                        Form3.Instance().Show();
                }

                private void button4_Click(object sender, System.EventArgs e)
                {
                        this.AddOwnedForm(Form3.Instance());
                }

                private void button5_Click(object sender, System.EventArgs e)
                {
                        this.RemoveOwnedForm(Form3.Instance());
                }

                private void button6_Click(object sender, System.EventArgs e)
                {
                        this.IsMdiContainer = true;
                        Form3.Instance().MdiParent = this;
                }
        }
}

Form2.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace Dialogs1
{
        /// <summary>
        /// Form2 の概要の説明です。
        /// </summary>
        public class Form2 : System.Windows.Forms.Form
        {
                private System.Windows.Forms.Button button1;
                private System.Windows.Forms.Button button2;
                private System.Windows.Forms.RadioButton radioButton1;
                private System.Windows.Forms.RadioButton radioButton2;
                private System.Windows.Forms.RadioButton radioButton3;
                private System.Windows.Forms.RadioButton radioButton4;
                private System.Windows.Forms.RadioButton radioButton5;
                private System.Windows.Forms.RadioButton radioButton6;
                private System.Windows.Forms.RadioButton radioButton7;
                private System.Windows.Forms.Button button3;
                private System.Windows.Forms.Button button4;
                private System.Windows.Forms.Button button5;
                private System.Windows.Forms.Button button6;
                private System.Windows.Forms.Button button7;
                private System.Windows.Forms.GroupBox groupBox1;
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form2()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                        
                        // デフォルトで FormBorderStyle は Sizable
                        this.radioButton5.Checked = true;
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if(components != null)
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.button1 = new System.Windows.Forms.Button();
                        this.button2 = new System.Windows.Forms.Button();
                        this.radioButton1 = new System.Windows.Forms.RadioButton();
                        this.radioButton2 = new System.Windows.Forms.RadioButton();
                        this.radioButton3 = new System.Windows.Forms.RadioButton();
                        this.radioButton4 = new System.Windows.Forms.RadioButton();
                        this.radioButton5 = new System.Windows.Forms.RadioButton();
                        this.radioButton6 = new System.Windows.Forms.RadioButton();
                        this.radioButton7 = new System.Windows.Forms.RadioButton();
                        this.button3 = new System.Windows.Forms.Button();
                        this.button4 = new System.Windows.Forms.Button();
                        this.button5 = new System.Windows.Forms.Button();
                        this.button6 = new System.Windows.Forms.Button();
                        this.button7 = new System.Windows.Forms.Button();
                        this.groupBox1 = new System.Windows.Forms.GroupBox();
                        this.SuspendLayout();
                        // 
                        // button1
                        // 
                        this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
                        this.button1.Location = new System.Drawing.Point(200, 8);
                        this.button1.Name = "button1";
                        this.button1.TabIndex = 0;
                        this.button1.Text = "OK";
                        // 
                        // button2
                        // 
                        this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel;
                        this.button2.Location = new System.Drawing.Point(200, 40);
                        this.button2.Name = "button2";
                        this.button2.TabIndex = 1;
                        this.button2.Text = "Cancel";
                        // 
                        // radioButton1
                        // 
                        this.radioButton1.Location = new System.Drawing.Point(24, 32);
                        this.radioButton1.Name = "radioButton1";
                        this.radioButton1.TabIndex = 2;
                        this.radioButton1.Text = "None";
                        this.radioButton1.CheckedChanged += new System.EventHandler(this.OnCheckedChanged);
                        // 
                        // radioButton2
                        // 
                        this.radioButton2.Location = new System.Drawing.Point(24, 64);
                        this.radioButton2.Name = "radioButton2";
                        this.radioButton2.TabIndex = 3;
                        this.radioButton2.Text = "FixedSingle";
                        this.radioButton2.CheckedChanged += new System.EventHandler(this.OnCheckedChanged);
                        // 
                        // radioButton3
                        // 
                        this.radioButton3.Location = new System.Drawing.Point(24, 96);
                        this.radioButton3.Name = "radioButton3";
                        this.radioButton3.TabIndex = 4;
                        this.radioButton3.Text = "Fixed3D";
                        this.radioButton3.CheckedChanged += new System.EventHandler(this.OnCheckedChanged);
                        // 
                        // radioButton4
                        // 
                        this.radioButton4.Location = new System.Drawing.Point(24, 128);
                        this.radioButton4.Name = "radioButton4";
                        this.radioButton4.TabIndex = 5;
                        this.radioButton4.Text = "FixedDialog";
                        this.radioButton4.CheckedChanged += new System.EventHandler(this.OnCheckedChanged);
                        // 
                        // radioButton5
                        // 
                        this.radioButton5.Location = new System.Drawing.Point(24, 160);
                        this.radioButton5.Name = "radioButton5";
                        this.radioButton5.TabIndex = 6;
                        this.radioButton5.Text = "Sizable";
                        this.radioButton5.CheckedChanged += new System.EventHandler(this.OnCheckedChanged);
                        // 
                        // radioButton6
                        // 
                        this.radioButton6.Location = new System.Drawing.Point(24, 192);
                        this.radioButton6.Name = "radioButton6";
                        this.radioButton6.Size = new System.Drawing.Size(112, 24);
                        this.radioButton6.TabIndex = 7;
                        this.radioButton6.Text = "FixedToolWindow";
                        this.radioButton6.CheckedChanged += new System.EventHandler(this.OnCheckedChanged);
                        // 
                        // radioButton7
                        // 
                        this.radioButton7.Location = new System.Drawing.Point(24, 224);
                        this.radioButton7.Name = "radioButton7";
                        this.radioButton7.Size = new System.Drawing.Size(120, 24);
                        this.radioButton7.TabIndex = 8;
                        this.radioButton7.Text = "SizableToolWindow";
                        this.radioButton7.CheckedChanged += new System.EventHandler(this.OnCheckedChanged);
                        // 
                        // button3
                        // 
                        this.button3.DialogResult = System.Windows.Forms.DialogResult.Abort;
                        this.button3.Location = new System.Drawing.Point(200, 80);
                        this.button3.Name = "button3";
                        this.button3.TabIndex = 9;
                        this.button3.Text = "Abort";
                        // 
                        // button4
                        // 
                        this.button4.DialogResult = System.Windows.Forms.DialogResult.Yes;
                        this.button4.Location = new System.Drawing.Point(200, 120);
                        this.button4.Name = "button4";
                        this.button4.TabIndex = 10;
                        this.button4.Text = "Yes";
                        // 
                        // button5
                        // 
                        this.button5.DialogResult = System.Windows.Forms.DialogResult.No;
                        this.button5.Location = new System.Drawing.Point(200, 160);
                        this.button5.Name = "button5";
                        this.button5.TabIndex = 11;
                        this.button5.Text = "No";
                        // 
                        // button6
                        // 
                        this.button6.DialogResult = System.Windows.Forms.DialogResult.Retry;
                        this.button6.Location = new System.Drawing.Point(200, 200);
                        this.button6.Name = "button6";
                        this.button6.TabIndex = 12;
                        this.button6.Text = "Retry";
                        // 
                        // button7
                        // 
                        this.button7.DialogResult = System.Windows.Forms.DialogResult.Ignore;
                        this.button7.Location = new System.Drawing.Point(200, 232);
                        this.button7.Name = "button7";
                        this.button7.TabIndex = 13;
                        this.button7.Text = "Ignore";
                        // 
                        // groupBox1
                        // 
                        this.groupBox1.Location = new System.Drawing.Point(8, 8);
                        this.groupBox1.Name = "groupBox1";
                        this.groupBox1.Size = new System.Drawing.Size(176, 248);
                        this.groupBox1.TabIndex = 14;
                        this.groupBox1.TabStop = false;
                        this.groupBox1.Text = "FormBorderStyle";
                        // 
                        // Form2
                        // 
                        this.AcceptButton = this.button1;
                        this.AutoScale = false;
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.CancelButton = this.button2;
                        this.ClientSize = new System.Drawing.Size(292, 266);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                        this.button7,
                        this.button6,
                        this.button5,
                        this.button4,
                        this.button3,
                        this.radioButton7,
                        this.radioButton6,
                        this.radioButton5,
                        this.radioButton4,
                        this.radioButton3,
                        this.radioButton2,
                        this.radioButton1,
                        this.button2,
                        this.button1,
                        this.groupBox1});
                        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
                        this.Name = "Form2";
                        this.Text = "Form2";
                        this.ResumeLayout(false);

                }
                #endregion

                private void OnCheckedChanged(object sender, System.EventArgs e)
                {
                        if (this.radioButton1.Checked)
                                this.FormBorderStyle = FormBorderStyle.None;
                        else if (this.radioButton2.Checked)
                                this.FormBorderStyle = FormBorderStyle.FixedSingle;
                        else if (this.radioButton3.Checked)
                                this.FormBorderStyle = FormBorderStyle.Fixed3D;
                        else if (this.radioButton4.Checked)
                                this.FormBorderStyle = FormBorderStyle.FixedDialog;
                        else if (this.radioButton5.Checked)
                                this.FormBorderStyle = FormBorderStyle.Sizable;
                        else if (this.radioButton6.Checked)
                                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
                        else if (this.radioButton7.Checked)
                                this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
                }
        }
}
Form3.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace Dialogs1
{
        /// <summary>
        /// Form3 の概要の説明です。
        /// </summary>
        sealed class Form3 : System.Windows.Forms.Form
        {
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                private Form3()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if(components != null)
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.button1 = new System.Windows.Forms.Button();
                        this.SuspendLayout();
                        // 
                        // button1
                        // 
                        this.button1.Location = new System.Drawing.Point(40, 64);
                        this.button1.Name = "button1";
                        this.button1.Size = new System.Drawing.Size(96, 23);
                        this.button1.TabIndex = 3;
                        this.button1.Text = "子供をやめる";
                        this.button1.Click += new System.EventHandler(this.button1_Click_1);
                        // 
                        // Form3
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(292, 118);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                        this.button1});
                        this.Name = "Form3";
                        this.Text = "Form3";
                        this.ResumeLayout(false);

                }
                #endregion

                private System.Windows.Forms.Button button1;

        
                private static Form3 instance = new Form3();

                public static Form3 Instance()
                {
                        if (instance.IsDisposed) 
                                        instance = new Form3();
                        return instance;
                }

                private void button1_Click_1(object sender, System.EventArgs e)
                {
                        this.Owner = null;
                }
        }
}

12.MDI のフォームのソースコード

3つのフォーム(Form1.cs, Form2.cs, Form3.cs) から構成されています。

Form1.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace Dialog2
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
                private System.Windows.Forms.Button button1;
                private System.Windows.Forms.Button button2;
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form1()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.button1 = new System.Windows.Forms.Button();
                        this.button2 = new System.Windows.Forms.Button();
                        this.SuspendLayout();
                        // 
                        // button1
                        // 
                        this.button1.Location = new System.Drawing.Point(8, 8);
                        this.button1.Name = "button1";
                        this.button1.Size = new System.Drawing.Size(152, 23);
                        this.button1.TabIndex = 0;
                        this.button1.Text = "Form2 を MDI にする。";
                        this.button1.Click += new System.EventHandler(this.button1_Click);
                        // 
                        // button2
                        // 
                        this.button2.Location = new System.Drawing.Point(8, 40);
                        this.button2.Name = "button2";
                        this.button2.Size = new System.Drawing.Size(152, 23);
                        this.button2.TabIndex = 1;
                        this.button2.Text = "Form3 を MDI にする。";
                        this.button2.Click += new System.EventHandler(this.button2_Click);
                        // 
                        // Form1
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(292, 266);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                        this.button2,
                        this.button1});
                        this.Name = "Form1";
                        this.Text = "Form1";
                        this.Load += new System.EventHandler(this.Form1_Load);
                        this.ResumeLayout(false);

                }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new Form1());
                }

                private Form form2 = new Form2();
                private Form form3 = new Form3();

                private void Form1_Load(object sender, System.EventArgs e)
                {
                        this.IsMdiContainer = true;
                        form2.Show();
                        form3.Show();
                }

                private void button1_Click(object sender, System.EventArgs e)
                {
                        form2.MdiParent = this;
                }

                private void button2_Click(object sender, System.EventArgs e)
                {
                        form3.MdiParent = this;
                }
        }
}
Form2.cs

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespace Dialog2 { /// <summary> /// Form2 の概要の説明です。 /// </summary> public class Form2 : System.Windows.Forms.Form { private System.Windows.Forms.Button button1; /// <summary> /// 必要なデザイナ変数です。 /// </summary> private System.ComponentModel.Container components = null; public Form2() { // // Windows フォーム デザイナ サポートに必要です。 // InitializeComponent(); // // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。 // } /// <summary> /// 使用されているリソースに後処理を実行します。 /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// デザイナ サポートに必要なメソッドです。このメソッドの内容を /// コード エディタで変更しないでください。 /// </summary> private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(40, 32); this.button1.Name = "button1"; this.button1.TabIndex = 0; this.button1.Text = "MDI を解除"; this.button1.Click += new System.EventHandler(this.button1_Click); // // Form2 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 12); this.ClientSize = new System.Drawing.Size(200, 102); this.Controls.AddRange(new System.Windows.Forms.Control[] { this.button1}); this.Name = "Form2"; this.Text = "Form2"; this.ResumeLayout(false); } #endregion private void button1_Click(object sender, System.EventArgs e) { this.MdiParent = null; } } }
Form3.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace Dialog2
{
        /// <summary>
        /// Form3 の概要の説明です。
        /// </summary>
        public class Form3 : System.Windows.Forms.Form
        {
                private System.Windows.Forms.Button button1;
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form3()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if(components != null)
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
                        this.button1 = new System.Windows.Forms.Button();
                        this.SuspendLayout();
                        // 
                        // button1
                        // 
                        this.button1.Location = new System.Drawing.Point(8, 8);
                        this.button1.Name = "button1";
                        this.button1.TabIndex = 0;
                        this.button1.Text = "MDI を解除";
                        this.button1.Click += new System.EventHandler(this.button1_Click);
                        // 
                        // Form3
                        // 
                        this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
                        this.ClientSize = new System.Drawing.Size(192, 78);
                        this.Controls.AddRange(new System.Windows.Forms.Control[] {
                        this.button1});
                        this.Name = "Form3";
                        this.Text = "Form3";
                        this.ResumeLayout(false);

                }
                #endregion

                private void button1_Click(object sender, System.EventArgs e)
                {
                        this.MdiParent = null;
                }
        }
}