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 が表示される。
上の例は 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 を下に示す。