C#プログラミングTips

Windowsアプリケーションのスケルトンを知る

デジタルアドバンテージ
2001/03/30


 Windowsアプリケーションなど、複雑な機能を持つプログラムでは、システム側が用意するライブラリを多用して、機能を実装するのが一般的である。このようなプログラムでは、ライブラリの流儀に従うために、どのようなプログラムにも必ず含まれるお決まりのコードというものがある。広義にはそれをプログラムのスケルトンと呼ぶ。ただしVisual C++では、AppWizardなどによって自動生成されるソース・コードを指して「スケルトン・ファイル」と呼んでいる。

 今回は、このように自動生成されるスケルトンではなく、あくまで.NET Framework上のWindowsアプリケーションとして、最低限何が必要なのかを知るために、手作業でソース・コードを記述してみた。新規にプログラムを書き始める場合(特にテキスト・エディタでコーディングする場合)、まったく白紙の状態からコードを記述するよりも、まずはお決まりのスケルトンを一式コピーし、そのコードに肉付けしていくのが簡単でよいだろう。

.NET FrameworkでのWindowsアプリケーションのスケルトン

 .NET Framework上でWindowsアプリケーションを作成する場合にも、やはりスケルトンはある。スケルトンはあくまでもプログラムの骨格なので、それ単体では意味のないものであるが、GUIベースのWindowsアプリケーションであるため、少なくとも画面上にウィンドウを開くコードは含まれている。スケルトンのコードを見れば、最も原始的なWindowsアプリケーションの姿をかいま見ることができるし、何より、あらゆるアプリケーションの出発点となるスケルトンを理解することは、Windowsプログラミングの第一歩でもある。

 たいていのWindowsアプリケーションは、ユーザー・インターフェイスの部品として、ボタンなどのコントロールを持っていて、そのコントロールがユーザによって操作された場合に実行されるイベント・ハンドラを備えている。例えば、ボタンがクリックされるとクリック・イベントが発生し、クリック時の処理を行うためのイベント・ハンドラが呼び出される。今回ご紹介するスケルトンでは、最も基本的なボタン・コントロールのコードも入れておこう。

 まずはプログラム・コード全体を示す(ファイル名はskeleton.cs)。たったこれだけの短いコードだが、プログラムは立派な(?)Windowsアプリケーションとして動作する。

 1: // skeleton.cs
 2:
 3: using System;
 4: using System.Drawing;
 5: using System.WinForms;
 6:
 7: public class Skeleton : Form {
 8:     private Button button1;
 9:
10:     protected void button1_Click(object s, System.EventArgs e) {
11:         Application.Exit();
12:     }
13:
14:     public Skeleton() {
15:         this.Size = new Size(320, 240);
16:         this.Text = "スケルトン・サンプル";
17:
18:         this.button1     = new Button();
19:         button1.Location = new Point(10, 10);
20:         button1.Size     = new Size(100, 50);
21:         button1.Text     = "閉じる";
22:         button1.Click   += new EventHandler(button1_Click);
23:
24:         this.Controls.Add(button1);
25:     }
26:
27:     public static void Main() {
28:         Application.Run(new Skeleton());
29:     }
30: }
skeleton.csのソースコード

 このプログラムをコンパイルして実行すると、次に示すように[閉じる]ボタンが1つあるウィンドウが表示される。ここで[閉じる]ボタンをクリックすれば、ウィンドウが閉じられてプログラムが終了する。

skeletonプログラムを実行したところ
[閉じる]ボタンをクリックするとウィンドウが閉じるだけのシンプルなプログラム。ただしウィンドウのデフォルトの動作として、ウィンドウのサイズ変更や最大化、最小化の機能は持っている。

スケルトンの要点

 それでは前出のスケルトン・コードのポイントとなる部分を簡単に解説しよう。ただしスケルトンといっても、複雑なWindowsアプリケーションの土台であるから、ここですべてをくまなく解説することはできない。途中いくつか理解できない用語や概念があったとしても、とりあえずはパターンとして覚えておいていただきたい。

 まず、次の部分がウィンドウを開くために最低限必要なコードだ。ウィンドウを開くためにはまずFormクラスから派生したSkeletonクラスを定義する(7行目。これは正式にはSystem.WinForms.Formであるが、5行目にあるusing System.WinFormsにより、ネームスペース部分を省略して記述することができる)。次にSkeletonクラスのインスタンスを引数として、(System.WinFormsネームスペースの)ApplicatoinクラスのRunメソッドを呼び出す(28行目)。

 5: using System.WinForms;
        ・・・
 7: public class Skeleton : Form {
        ・・・
27:     public static void Main() {
28:         Application.Run(new Skeleton());
29:     }
30: }

 Skeletonクラスのインスタンスが作成されるときに呼び出されるSkeletonクラスのコンストラクタでは、フォームのプロパティ設定とボタンの生成を行う。このうち以下のコードは、フォームのプロパティを設定している個所だ。ここでSizeは、ウィンドウの大きさを指定するプロパティであり、プロパティ値の設定には、System.Drawing.Size構造体のインスタンスを作成して代入する。今回はnew Size(320, 240)として、水平方向320ドット、垂直方向240ドットのサイズを指定した(15行目)。次のTextプロパティは、ウィンドウのタイトル・バーに表示される文字列である(16行目)。

14: Public Skeleton() {
15:     this.Size = new Size(320, 240);
16:     this.Text = "スケルトン・サンプル";      

ボタンの作成

 ボタンの作成ではまず、(System.WinFormsネームスペースの)Buttonクラスのインスタンスを作成し(18行目)、クライアント領域内での位置やボタンの大きさ、ボタン上に表示される文字列をプロパティで設定する。このインスタンスをFormクラスのControlsコレクションにAddメソッドを使用して追加することによってフォームとボタンが関連付けられる(24行目)。コレクションは、オブジェクトの集合を保持するためのものである。さらにフォーム上にコントロールを追加するなら、同様にして、それらのインスタンスをAddメソッドによりControlsコレクションに追加していけばよい。

 8: Private Button button1;
       ・・・
14: public Skeleton() {
       ・・・
18:     this.button1     = new Button();
19:     button1.Location = new Point(10, 10);
20:     button1.Size     = new Size(100, 50);
21:     button1.Text     = "閉じる";
       ・・・
24:     this.Controls.Add(button1);        

ボタンのイベント・ハンドラ作成

 ボタンがクリックされたときに呼び出されるイベント・ハンドラの設定は、非常に簡潔に記述することができる。これはC#のデリゲート(Delegate)と呼ばれる機構のおかげだが、詳細はここでは割愛するとして、とりあえずイベントが発生した場合に、自分のメソッドがイベント・ハンドラとして呼び出されるようにするための記述方法だけを解説しておこう。

 まずは、イベント・ハンドラとなるメソッドを定義する。ここではbutton1_Clickというメソッド名を付けた。コントロールのイベント・ハンドラとなるメソッドに与える引数や、メソッドからの戻り値は、あらかじめ決められている。

 次にこのメソッド名を(Systemネームスペースの)EventHandlerクラスのコンストラクタの引数に指定してインスタンスを作成し、button1オブジェクトのClickイベントに「+=」演算子を使用して登録する(22行目)。これによりボタンがクリックされた場合には、button1_Clickメソッドが呼び出されるようになる。今回追加するメソッドでは、ボタンがクリックされるとプログラムの処理を終了するように、Application.Exit()を呼び出している(11行目)。

10: protected void button1_Click(object s, System.EventArgs e) {
11:     Application.Exit();
12: }
        ・・・
22: button1.Click += new EventHandler(button1_Click);        

プログラムのコンパイル

 .NET Framework SDKをインストールした環境でこのプログラムをコンパイルするには、コマンド・プロンプトで次のようにする。

csc /r:Microsoft.Win32.Interop.DLL /r:System.DLL
  /r:System.WinForms.DLL /r:System.Drawing.DLL skeleton.cs

これにより、skeleton.exeができあがる。End of Article

「C#プログラミングTips」

 



Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間