.NET Framework SDKで始める.NETプログラミング(後編)

1.フォーム・デザイナでGUIを設計する

デジタルアドバンテージ 遠藤孝信
2001/05/18

Page1 Page2 Page3 Page4 Page5

Windows Formsデザイナ:WinDes.exe

 本稿の前編では、.NET SDKに付属するコマンド一覧を掲載した(「3..NET SDKのインストール」のページ)。この表から分かるとおり、ほとんどはコマンド・プロンプトから使用するプログラムで、数としてはX.509証明書(ITUが規定したデジタル証明書の標準仕様)に関連したセキュリティ・ツールが多い。これらはプログラム・コードの身元を明らかにするためなどに使用されるが、ベータ1の段階である現時点では、一部のプログラマを除けば、これらを使う機会はあまりない。以下では、.NET SDKに含まれるものの中から、通常の.NETプログラミングで活用できるツールをいくつか取りあげてご紹介することにしよう。

 まずは、Windows Formsの機能を利用したアプリケーション、Windows環境で実行可能ないわゆる「Windowsアプリケーション」のGUI(グラフィカル・インターフェイス)を設計するためのツールであるWinDes.exeである。次の画面に示すように、このツールはVisual Basicのフォーム・デザイナによく似たインターフェイスを持ち、設計対象となるフォームを開き、マウスを使ってその上にコントロールを配置することで、最終的には必要なC#あるいはVB.NETのソースコードを出力してくれるというものだ。

 なお.NET SDKでは、このWinDesを始めとして、GUIを備えた本格的なツールがいくつか提供されているが、これらのショートカットは[スタート]−[プログラム]−[Microsoft .NET Framework SDK]には自動的には登録されないので、実行時にはエクスプローラなどで.NET SDKのインストール・フォルダを参照する必要がある。

Windows Formsデザイナー、WinDes.exeでGUIを作成しているところ
  フォーム上で使用可能なコントロールを一覧表示したToolbox。最初にここで使用するコントロールをクリックしてから、のフォーム上でマウスをドラッグすると、ドラッグされた矩形サイズでコントロールが配置される。
  コントロールを配置するフォーム。プログラムの実行時には、このフォームがウィンドウとしてそのまま表示される。
  タイマー・コントロールなど、GUIを持たないコントロールをフォーム上に配置した場合には、それらがここに列挙される。
  フォームやコントロールのプロパティ(表示内容や挙動を切り替える属性)を設定するところ。左のフォーム上でコントロールやフォームを選択すると、そのプロパティがここに表示される。
  選択しているプロパティの簡単な説明が表示される。。

 画面を見れば一目瞭然だが、これはVisual Basicなどの統合環境によく似ている。実際、基本的な使い方もよく似ている。WinDesでWindowsアプリケーションのプロトタイプを作成する手順は次のようになる。

  1. フォーム上にコントロールを配置する。
  2. [Format]メニューの各コマンド(並べ替えやサイズ調整など)を使って、配置したコントロールの大きさや位置を整える。
  3. コントロールのプロパティ(表示される文字列や色、基本的な挙動など)を設定する。
  4. コントロールをダブル・クリックしてプログラム・コードを開き、コントロールが操作された場合のコードなどを追加する。
  5. メニュー・バーの実行ボタン(小さな右向きの三角形のイメージが表示されたボタン)をクリックするか、[File]−[Run]メニューを実行し、プログラムをコンパイルし、実行する。

 このように書くと、WinDesだけですべてできそうだが、標準的なキーボード・ショートカットはまったくなく、コピー&ペースト(ショートカットはCtrl+[C]とCtrl+[V])などはすべてメニューから実行しなければならない。またWinDesでコード記述用に開かれるウィンドウは単なるエディット・コントロールであり(メニューからメモ帳で開くことも可)、デバッガも組み込まれていないため、統合環境のような使い勝手は得られない。WinDesは、あくまでもコントロールを配置したウィンドウのベースとなるコードを生成するだけのツールと考えるべきだ。なお、開発途中のベータ1だからかもしれないが、生成されたコードをエディタなどで独自に変更すると、フォームが2度と表示されなくなってしまうことがよく起こった。

 WinDesの欠点ばかりを並べ立てたが、自動生成されるコードは、VS.NETで生成されるそれとほぼ同じで、プログラムを作り始める際の雛形としては十分役に立つ。これまでのWindowsプログラミングでは、CやC++ではリソース・ファイル、VBではフォーム(.frmファイル)など、プログラムのソース・ファイルとは別の拡張子を持つ特別なファイルが必要だったが、C#やVB.NETでは、すべて1種類のファイル(C#なら.csファイル、VB.NETなら.vbファイル)でプログラムが記述される(ビットマップやアイコンは別ファイル)。このため簡単なWindowsアプリケーションであれば、すべてテキスト・エディタだけで作成することができるが、数多くのコントロールを使用するアプリケーションを作成するなら、このツールで最初に雛形を作り、エディタで細部を修正するほうが効率的だろう。

 簡単なサンプル・プログラムを作って、WinDesが出力したコードをご紹介しよう。このサンプル・プログラムを実行すると、次のようなウィンドウを表示する。そして「button1」ボタンをクリックすると、ラベル・コントロールの文字列が「Hello WinDes World!」に変わる。

WinDesで作ったサンプル・プログラムをコンパイル/実行したところ
「button1」ボタンをクリックすると、ラベル・コントロールの文字列が「Hello WinDes World!」に変わる。

 このプログラムは、WinDesで次のようにラベルとボタンをフォーム上に配置し、

WinDes用の出力コードを調べるための設計中のサンプル・プログラム
ウィンドウにラベル(「label1」と表示されている部分)とボタン(「button1」と表示されているボタン)だけを配置した簡単なウィンドウを作成した。

配置した「button1」をダブル・クリックして、自動的に追加されるメソッド「button1_Click」に次のコードを追加しただけものだ。

label1.Text = "Hello WinDes World!";
自動的に追加されるメソッド「button1_Click」に追加したコード

 ちなみにWinDesでは、コンパイル時のコマンド行が、コードを保存したディレクトリにファイル名“genXXX.out”(XXXは不定)として生成される。このファイルの内容を見ることで、コンパイル時にどのようなオプションが指定されたかを確認することができる。

 さて、WinDesが自動生成したソースコードは次のようになった。

1: // Win32Form1.cs
2: namespace Win32Form1Namespace {
3:
4:   using System;
5:   using System.Drawing;
6:   using System.ComponentModel;
7:   using System.WinForms;
8:
9:   /// <summary>
10:   ///    Summary description for Win32Form1.
11:   /// </summary>
12:   public class Win32Form1 : System.WinForms.Form {
13:
14:     /// <summary>
15:     ///    Required by the Win Forms designer
16:     /// </summary>
17:     private System.ComponentModel.Container components;
18:     private System.WinForms.Button button1;
19:     private System.WinForms.Label label1;
20:
21:     public Win32Form1() {
22:
23:       // Required for Win Form Designer support
24:       InitializeComponent();
25:
26:
27:       // TODO: Add any constructor code after InitializeComponent call
28:
29:     }
30:
31:     /// <summary>
32:     ///    Clean up any resources being used
33:     /// </summary>
34:     public override void Dispose() {
35:       base.Dispose();
36:       components.Dispose();
37:     }
38:
39:
40:     /// <summary>
41:     ///    The main entry point for the application.
42:     /// </summary>
43:     public static void Main(string[] args) {
44:       Application.Run(new Win32Form1());
45:     }
46:
47:
48:     /// <summary>
49:     ///    Required method for Designer support - do not modify
50:     ///    the contents of this method with an editor
51:     /// </summary>
52:     private void InitializeComponent()
53:     {
54:       this.components = new System.ComponentModel.Container();
55:       this.label1 = new System.WinForms.Label();
56:       this.button1 = new System.WinForms.Button();
57:
58:       //@design this.TrayHeight = 0;
59:       //@design this.TrayLargeIcon = false;
60:       //@design this.TrayAutoArrange = true;
61:       label1.Location = new System.Drawing.Point(8, 24);
62:       label1.Text = "label1";
63:       label1.Size = new System.Drawing.Size(168, 16);
64:       label1.TabIndex = 0;
65:
66:       button1.Location = new System.Drawing.Point(200, 216);
67:       button1.Size = new System.Drawing.Size(80, 40);
68:       button1.TabIndex = 1;
69:       button1.Text = "button1";
70:       button1.Click += new System.EventHandler(button1_Click);
71:
72:       this.Text = "Win32Form1";
73:       this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
74:
75:       this.Controls.Add(button1);
76:       this.Controls.Add(label1);
77:     }
78:     protected void button1_Click(object sender, System.EventArgs e)
79:     {
80:       label1.Text = "Hello WinDes World!";
81:     }
82:
83:   }
84: }
ラベル・コントロールの文字列を変更するだけの簡単なプログラム

 このプログラムの処理の流れはおおまかに次のようになる。

  1. プログラムを起動すると、最初にMainメソッド(43行目)が呼び出される。
  2. Mainメソッド内でWin32Form1クラスのオブジェクトを生成しているため、Win32Form1クラスのコンストラクタであるWin32Form1メソッド(21行目)が呼び出される。
  3. Win32Form1メソッドからInitializeComponentメソッド(52行目)が呼び出される。
  4. InitializeComponentメソッド内でラベルとボタンのオブジェクトを生成し(55、56行目)、フォームに追加する。このうちボタンには、クリック時に呼び出されるメソッドであるbutton1_Clickメソッドをイベント・ハンドラとして設定する(70行目)。このメソッドが実行されると、サンプル・プログラムのウィンドウが表示される。
  5. ボタンがクリックされると、button1_Clickメソッド(78行目)が呼び出される。ここでラベルのTextプロパティに文字列を設定することによって、ラベル上の文字列が書き変わる(80行目)。
  6. プログラムの終了時にはDisposeメソッド(34行目)が呼び出され、ここでクリーンアップ処理を行う。
関連記事(Insider.NET内)
特集
.NET Framework SDKで始める.NETプログラミング(前編) 3..NET SDKのインストール
 

 INDEX
  [特集] .NET Framework SDKで始める.NETプログラミング(後編)
  1.フォーム・デザイナでGUIを設計する
    2.デバッガと逆アセンブラ
    3.サンプル・プログラムとチュートリアル
    4.実用性も高いサンプル・プログラム
 
  [特集] .NET Framework SDKで始める.NETプログラミング(前編)

 



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 記事ランキング

本日 月間