単純なフォームの生成

Copyright © 2003-2004, Hirofumi Fujii

[目次へ] [戻る] [次へ]

フォームを作る

Console Application 作るだけなら、何もわざわざ C# など使わなくても フリーの C/C++ コンパイラーで作ればよい。問題は、GUI Application が どの程度の作業でできるのかである。そこで単純な GUI Application を 作ってみよう。

Visual Basic をやった人間ならわかると思うが、Visual Basic の場合は、 Form が GUI の土台になる。 そこで、Microsoft のことだから Visual Basic の Form に相当するものが、 きっと用意されているに違いないとにらんで、それを生成してみる ことを考える。

作業を始める前に、コンパイルオプションを確認する。GUI のプログラムの 場合、コンパイルオプションとして、/t:winexe を指定する必要 がある。これを指定しないとプログラムを実行した場合に、Console Window が一緒に出てくる。これはこれで利用価値があるような気もするが、 とりあえず必要無いので、以下のプログラムを実際にコンパイルする時には、

  csc /t:winexe
でコンパイルする。

まずやらなければいけないのは、Form がどこに用意されている か探しだすことである。付属のドキュメントで、「検索」「キーワード」 で Form をキーワードにしてみると、Form という Class があることが わかる。でもって、これは System.Windows.Forms に属す名前 だということがわかるので、

using System;
using System.Windows.Forms;

class MainApp
{
  public static void Main()
  {
    Application.Run(new Form());
  }
}
と書いてみる。ここで、Main() の中の Application.Run() は 付属のドキュメントのチュートリアルを眺めて、まあこんな感じ ではということで書いてみた。実際、コンパイル・リンクも問題なく、 実行させてみると、下のような Window が表示される。
できたフォーム
しかも、最大化、最小化ボタンも働くし、大きさもマウスで変えられる。 終了ボタン [×] を押せば、終了もする(Java は終了処理を書かなければ 終了しない)。

フォームの設定

上の例は Window としてはそれなりの振る舞いはするが、これだけでは単なる灰色の 四角なので、少し細工をしてみよう。 タイトルを付け、初期の大きさを (320,160) にして、色を白にしよう。 どうするのが、正しい作法かよくわからないが、適当に思い付くのは、 Form から自分の Class を派生させて、その Constructor の中で 設定してしまえばよかろうということで、それを書いてみる。

using System;
using System.Windows.Forms;

class MyForm : Form
{
  public MyForm()
  {
    Text = "私のフォーム";
    Size = new System.Drawing.Size(320,160);
    BackColor = System.Drawing.Color.White;
  }
}

class MyApp
{
  public static void Main()
  {
    Application.Run(new MyForm());
  }
}  
これを見てわかるように、クラスを派生させるのは、 C++ と同じ書き方である。一方文字列は Java と同じく Unicode ベースであるそうである。従って、上のように安心して日本語を 入れ込んでよい。このプログラムが作る Window は下の ようになる。
自分で設定したフォーム

上の例では System.Drawing が2回出てきている。 using System.Drawing を先頭に加えてやれば、この部分は 省略可能となる。つまり、以下のコードも同じ。

using System;
using System.Drawing;
using System.Windows.Forms;

class MyForm : Form
{
  public MyForm()
  {
    Text = "私のフォーム";
    Size = new Size(320,160);
    BackColor = Color.White;
  }
}

class MyApp
{
  public static void Main()
  {
    Application.Run(new MyForm());
  }
}  
ただし、複数の名前空間に同じ名前がある時、 予期せぬものが用いられないとは限らない だろうから、明示した方が安全であることは言うまでもないだろう。

上のコードは MyForm と MyApp は別クラスであったが、 必ずしも別クラスにする必要はない。 MyApp を Form から直接 派生させてもよい。

using System;
using System.Windows.Forms;

class MyApp : Form
{
  public MyApp()
  {
    Text = "私のフォーム";
    Size = new System.Drawing.Size(320,160);
    BackColor = System.Drawing.Color.White;
  }
  public static void Main()
  {
    Application.Run(new MyApp());
  }
}  
この方が Java っぽい。

フォームに図形を書く

フォームに図形を書くには、Graphics オブジェクトの描画関数を使う。 MFC や Visual Basic からの類推で、Paint 関数に相当するものがある に違いないと思って Form のメンバー関数を調べていくと、 OnPaint() がある。これを override してみよう。

using System;
using System.Drawing;
using System.Windows.Forms;

class MyForm : Form
{
  public MyForm()
  {
    Text = "白地に赤丸";
    Size = new Size(320,240);
    BackColor = Color.White;
  }
  protected override void OnPaint(PaintEventArgs e)
  {
    Graphics g = e.Graphics;
    g.FillEllipse( Brushes.Red, 100, 40, 120, 120);
  }
}

class MyApp
{
  public static void Main()
  {
    Application.Run(new MyForm());
  }
}  
このプログラムで作られる Window を下に示す。
白地に赤丸のフォーム

[目次へ] [戻る] [次へ]