フォームを表示する
GUI アプリケーション
多くの人は、プログラミング言語や .NET Framework の基礎をコマンドラインを用いて学習したことでしょう。例えば .NET 専用言語である C# の構文を学習することが目的であれば System.Console を用いたコマンドへの出力で動作確認する方法が一番シンプルです。
しかし .NET Framework を実践の Windows アプリケーション開発で用いるには、ウィンドウを表示する GUI の建築が必要となります。.NET Framework はこの要求にも高度に応えてくれるでしょう。
.NET Framework の GUI アプリケーションには System.Windows.Forms 名前空間を用います。この名前空間は、Windows の基本的なコントロールやウィンドウ、イベントなど GUI アプリケーションに必要不可欠な機能をカプセル化しています。
C 言語による Win32 API を直接呼び出すプログラムは大変難しいものです。Windows OS と密なプログラムを作れる反面、学習コストが高く、開発にはそれなりの技術力が必要です。現代では利用者も少なくなり、その役割は終わろうとしています。
.NET Framework における GUI プログラミングは、オブジェクト指向の恩恵を受けることになります。C# 言語と .NET Framework クラスライブラリは統一された完成度の高いフレームワークであり、Visual Studio とも連動したビジュアルな開発にも対応しています。
ウィンドウを表示するアプリケーションを作成するには System.Windows.Forms.Form クラスを利用します。このクラスには、ウィンドウの基本的な機能と処理がパッケージ化されています。私たちは、必要に応じて Form クラスを継承し機能を追加することができます。
Windows フォームでは Form クラスによって表される、タイトルバー、最小化ボタン、最大化ボタン、閉じるボタンなどを持つ標準的な Windows のウィンドウやダイヤログボックスのことを総称してフォームと呼んでいます。
System.Object System.MarshalByRefObject System.ComponentModel.Component System.Windows.Forms.Control System.Windows.Forms.ScrollableControl System.Windows.Forms.ContainerControl System.Windows.Forms.Form
public class Form : ContainerControl
Form クラスは多くのクラスから派生しているクラスですが、これは Form クラスによって表示されるウィンドウも基本的なコンポーネントから構成され、その上に成り立っているからです。
フォームを生成する場合、Main() メソッドの処理が問題となります Main() メソッドがすぐに終了してしまえば、プログラムも勝手に終了してしまいます。通常、Windows フォームでは Main() メソッドからメッセージループの処理を行います。
メッセージループとは、マウスやキーボードなどのイベントを監視するループ処理を指します。アプリケーションは内部で Windows と通信し、描画や入力などウィンドウに送られてくるメッセージを処理しなければなりません。
このような Windows とのメッセージのやり取りを管理する機能を System.Windows.Forms.Application クラスが提供します。このクラスは Windows アプリケーションの基本動作を制御する役割を持っています。
public sealed class Application
このクラスは、メッセージループを起動する Application.Run() メソッドを持ちます。このメソッドを用いれば、フォームを表示して基本的なイベントに対応させることができます。
public static void Run();
public static void Run(ApplicationContext context);
public static void Run(Form mainForm);
パラメータを指定しない場合、フォームの無い状態でメッセージループを起動させます。フォームが無い場合は、Form クラスのようなものがアプリケーションを終了してくれないので、どこかでアプリケーションの終了を明示しなければ、無限ループに陥ってしまいます。
context パラメータは ApplicationContext でメッセージループを走らせます。このクラスは、メッセージループを終了させる方法を独自に制御したい場合に利用します。一般的には、主ウィンドウが閉じられた時点でアプリケーションを終了させる形になるため、めったに使われることはないでしょう。
mainForm パラメータには、メッセージループを用いる Form オブジェクトを指定します。この場合、このフォームがアプリケーションの主ウィンドウとなります。メッセージループが作られると同時に、ウィンドウが自動的に表示されます。
Form オブジェクトを Run() に渡せばフォームが表示されます。フォームは、最小化、最大化、アプリケーションの終了などの基本機能を持ちます。これだけの作業で Windows のデスクトップアプリケーションが開発できてしまうため、古い Win32 API を直接制御する方法から比べると、極めて簡単で美しい設計だと感じることでしょう。
using System.Windows.Forms; class Test { public static void Main(string[] args) { Form form = new Form(); Application.Run(form); } }
どうでしょう。わずか 10 行足らずで基本的なウィンドウを表示するデスクトップアプリケーションが完成しました。ウィンドウの破棄や終了処理は Form クラスが行ってくれています。
私たちは、このような基本機能が完成されているオブジェクトを最初に定義し、必要に応じて機能を付け足したり、すでにある機能を書き換えたりすることができます。
因みに、コマンドプロンプトから起動すると問題ないように思えますが、エクスプローラーから起動した場合、プロンプトが表示されるという問題点があります。これを解決するには、コンパイラオプションで /t:winexe を指定します。こうすればウィンドウだけを表示できます。
致命的な問題にはなりませんが、Form クラスを含むすべてのコントロールは System.ComponentModel.Component クラスから派生しており、この Component クラスが IDisposable インタフェースを実装しています。
Component クラスは内部で暗黙的な解放ができないリソースを含む可能性があるため、明示的に Dispose() メソッドを呼び出してリソースを解放する必要があります。Run() メソッドに Form オブジェクトを渡した場合、フォームが閉じられ Run() メソッドの処理が終了する前に Dispose() メソッドを呼び出してくれます。