C#でWindowsフォームアプリケーションのフォームを開く(表示する)方法と閉じる方法を紹介します。
本記事ではVisual Studioで作成した、Windowsフォームアプリケーションのプロジェクトに記述するコードを記載します。
Windowsフォームアプリケーションのプロジェクトを作成する方法については、以下の記事を参照してください。
目次
フォームを開く(表示する)
フォームを開くには、アプリケーションのメインエントリーポイントでApplicationクラスのRun静的メソッドに表示するフォームのインスタンスを渡して表示する方法と、フォームクラスのShowメソッドまたはShowDialogメソッドを使用して表示する方法があります。
メインエントリーポイント(Mainメソッド)から表示
アプリケーションのメインエントリーポイント(Mainメソッド)から表示する場合は、Formクラスのインスタンスを生成して、ApplicationクラスのRun静的メソッドのパラメーターに指定します。Formクラス、Applicationクラスは、System.Windows.Forms名前空間にあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } |
上記のサンプルコードはWindowsフォームアプリケーションを作成した際に、自動で生成されるProgram.csファイルのコードです。
Form1クラスはFormクラスを継承したサブクラスになります。
ApplicationクラスのEnableVisualStyles静的メソッドは、アプリケーションで visual スタイルを有効にします。
ApplicationクラスのSetCompatibleTextRenderingDefault静的メソッドは、Windowsフォーム上のコントロールなどにテキストを描画する既定(デフォルト)の方法を切り替えるためのものです。SetCompatibleTextRenderingDefault静的メソッドのパラメーターにfalseを指定して呼び出すことで、よりパフォーマンスに優れたテキストの描画を行ってくれるようになります。
Formクラスを作成して独自に起動する場合の例も以下に記載しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System; using System.Windows.Forms; public class HelloWorld { [STAThread] public static void Main() { Form form = new Form(); form.Text = "Hello world!"; Application.Run(form); } } |
上記の例ではFormクラスのインスタンスを作成してApplicationクラスのRun静的メソッドのパラメーターに指定しています。
ApplicationクラスのRun静的メソッドのパラメーターにFormクラス(派生クラスを含む)のインスタンスを指定することで、Formを閉じた時にアプリケーションが終了します。
FormクラスのShowメソッドで表示
既に表示されているフォームからモードレスフォームを表示する際は、Showメソッドを使用します。(モードレスフォーム: フォームの表示後も他のフォームの要素を自由に操作できるフォーム)
1 2 3 |
Form1 form1 = new Form1(); // フォームを表示する form1.Show(); |
上記の例ではFormクラスの派生クラスのForm1クラスのインスタンスを生成して、Showメソッドでモードレスフォームを表示しています。
Showメソッドにはパラメーターとしてフォームを所有するオブジェクトを指定できます。
1 |
public void Show (System.Windows.Forms.IWin32Window owner); |
System.Windows.Forms.IWin32Window型のownerには、表示するフォームを所有するトップレベル ウィンドウを表すオブジェクト(通常はオーナーフォーム)を指定します。
以下に既に表示されているフォーム(Form1)から新しいフォーム(Form2)を表示する例を示します。
1 2 3 |
Form2 form2 = new Form2(); // フォームを表示する form2.Show(this); |
上記の例のShowメソッドのパラメーターに指定している「this」は、Form2を所有するオーナーフォームのForm1のインスタンスになります。
Showメソッドのパラメーター(owner)にオーナーフォームを指定すると、オーナーフォームを閉じた際に、Showメソッドで表示したフォーム(上記の例ではForm2)も閉じられます。
パラメーターにオーナーフォームを指定すると、表示されたフォームのOwnerプロパティでオーナーフォームを取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Form2 form2 = new Form2(); // フォームを表示する form2.Show(); Console.WriteLine(form2.Owner != null); // False Form3 form3 = new Form3(); // フォームを表示する form3.Show(this); Console.WriteLine(form3.Owner != null); // True |
Showメソッドでフォームを表示した場合は、フォームを表示したオーナーフォームを操作することができます。
Showメソッドでフォームを表示することは、Visibleプロパティをtrueに設定することと同じになります。ですので、Showメソッドの代わりにVisibleプロパティにtrueを指定することでフォームを表示することもできます。
1 2 3 |
Form2 form2 = new Form2(); // フォームを表示する form2.Visible = true; |
Showメソッドで表示したフォームはHideメソッド非表示にすることもできます。
1 2 |
// フォームを非表示にする form2.Hide(); |
Hideメソッドでフォームを非表示にすることで、Visibleプロパティがfalseになります。従ってVisibleプロパティにfalseを指定することでフォームを非表示にする(隠す)こともできます。
1 2 |
// フォームを非表示にする form2.Visible = false; |
FormクラスのShowDialogメソッドで表示
既に表示されているフォームからモーダルフォームを表示する際は、ShowDialogメソッドを使用します。(モーダルフォーム: フォームの表示後は他のフォームの要素を操作でき内容にロックするフォーム)
1 2 |
Form3 form3 = new Form3(); form3.ShowDialog(); |
ShowDialogメソッドもShowメソッドと同様にパラメーターにオーナーを指定することができます。
1 |
public void ShowDialog (System.Windows.Forms.IWin32Window owner); |
以下に既に表示されているフォーム(Form3)から新しいフォーム(Form4)を表示する例を示します。
1 2 |
Form4 form4 = new Form4(); form4.ShowDialog(this); |
上記の例のShowDialogメソッドのパラメーターに指定している「this」は、Form4を所有するオーナーフォームのForm3のインスタンスになります。
ShowDialogメソッドでフォームを表示した場合は、フォームを閉じるまでフォームを表示したオーナーフォームを操作することはできません。
フォームを閉じる
フォームを閉じるにはFormクラスのCloseメソッドを使用します。
1 2 |
// フォームを閉じる form.Close(); |
上記の例のformは表示されているフォームのインスタンス変数です。
フォームを閉じると、オブジェクト内で作成されたすべてのリソースが閉じられ、フォームが破棄されます。ですので次のコードはエラーになります。
1 2 3 4 5 6 7 8 9 10 |
Form form = new Form(); // フォームを表示する form.Show(); // フォームを閉じる form.Close(); // フォームを表示する form.Show(); // 例外が発生する |
Closeメソッドで閉じたフォームをShowメソッドで表示資料とすると「System.ObjectDisposedException: ‘破棄されたオブジェクトにアクセスできません。」という例外が発生します。
表示したフォームを一時的に非表示にする場合は、FormクラスのHideメソッドを使用するか、Visibleプロパティをfalseに設定します。
1 2 3 4 5 6 7 8 9 10 11 12 |
Form form = new Form(); // フォームを表示する form.Show(); // フォームを非表示にする(隠す) form.Hide(); // または // form.Visible = false; // フォームを表示する form.Show(); // フォームが再度表示される |
HideメソッドまたはVisibleプロパティで非表示にしたフォームは、オブジェクトが破棄されないので再度表示することができます。
サンプルプログラム
Windowsフォームアプリケーションを作成してフォームを開く(表示する)、閉じる、非表示にするプログラムを作成します。
ユーザーインターフェース
ユーザーインターフェースのフォームを3つ作成します。
プロジェクト構成
プロジェクトの構成は以下のようになります。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { // コンストラクタ public Form1() { InitializeComponent(); } // Form2をShow private void button1_Click(object sender, EventArgs e) { try { Form2 form2 = new Form2(); form2.Show(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form2 : Form { // Form3のインスタンス変数 private Form3 form3; // コンストラクタ public Form2() { InitializeComponent(); // Form3のインスタンスを生成 form3 = new Form3(); } // パラメーターなしでForm3をShow private void button1_Click(object sender, EventArgs e) { try { form3.Show(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } // パラメーターにForm1を指定してForm3をShow private void button2_Click(object sender, EventArgs e) { try { form3.Show(this); } catch (Exception ex) { MessageBox.Show(ex.Message); } } // Form3をClose private void button3_Click(object sender, EventArgs e) { try { form3.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } // Form3をHide private void button4_Click(object sender, EventArgs e) { try { form3.Hide(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } // パラメーターなしでForm3をShowDialog private void button5_Click(object sender, EventArgs e) { try { form3.ShowDialog(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } // パラメーターにForm2を指定してForm3をShowDialog private void button6_Click(object sender, EventArgs e) { try { form3.ShowDialog(this); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form3 : Form { // コンストラクタ public Form3() { InitializeComponent(); } // OnLoad protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (Owner == null) { MessageBox.Show("オーナーは指定されていません。"); } else { Form ownerForm = Owner; MessageBox.Show($"オーナーフォーム: {ownerForm.Name}"); } } // Form3をClose private void button1_Click(object sender, EventArgs e) { try { Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } // Form3をHide private void button2_Click(object sender, EventArgs e) { try { Hide(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } |
プログラムの実行
プロジェクトのデバッグを開始してプログラムを実行します。
Form1のForm2を表示するボタンをクリックするとForm2が表示されます。
Fomr2のForm3を表示するボタンをクリックするとForm3が表示されます。
パラメーターなしでForm3を表示するとOwnerプロパティがnullになっているメッセージが表示されます。
パラメーターありでForm3を表示するとOwnerプロパティのフォーム(Form2)の名前が表示されます。
フォームをShowメソッドで表示後、Closeメソッドで閉じて、再度表示すると例外が発生します。
Hideメソッドで非表示にして、再表示した場合は例外が発生せずフォームが表示されます。