まずは、前章と同じ方法でPaintイベントを処理するプログラムを見てみましょう。
今度は、Mainメソッドを含むクラスをFormクラスから継承しています。
// paintargs02.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class paintargs02 : Form
{
public static void Main()
{
paintargs02 p = new paintargs02();
Application.Run(p);
}
public static void OnMyHandler(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawLine(new Pen(Color.Red), 10, 100, 200, 100);
}
public paintargs02()
{
Text = "猫でもわかるプログラミング";
BackColor = Color.Pink;
Paint += new PaintEventHandler(OnMyHandler);
}
}
この例では、Formクラスから継承されたpaintargs02クラスのコンストラクタで、イベントとデリゲートを関連づけています。基本的には、前章と同じです。さて、Formクラスには、protectedで修飾されたメンバがいろいろあります。これは、継承先でしかアクセスできません。と、いうことは前章のプログラムでは利用できないということですね。
その中でも、代表格なのがOnナンタラメソッドでしょう。Paintイベントに関したものでいえば、OnPaintメソッドです。
protected virtual void OnPaint ( PaintEventArgs e )eは、イベントデータを含むPaintEvetnArgsくらすのオブジェクトです。
そして、Onナンタラメソッドは全部Controlクラスからの継承です。これらを利用するときは、オーバーライドします。
さらに、よいことにはOnナンタラメソッドを使うときは、イベントにデリゲートを関連づける必要がありません。
では、OnPaintの例を見てみましょう。
// onpaint01.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class onpaint01 : Form
{
public static void Main()
{
onpaint01 myform = new onpaint01();
Application.Run(myform);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.DrawLine(new Pen(Color.Yellow, 5F),
new Point(10, 50), new Point(180, 50));
}
public onpaint01()
{
Text = "猫でもわかるプログラミング";
BackColor = Color.Green;
}
}
Mainメソッドをメンバに有しているonpaint01クラスはFormクラスから派生しています。Mainメソッドでは、onpaint01クラスのインスタンスを生成して、Application.Runメソッドに渡しています。
ここまでは、同じです。
次に、OnPaintメソッドをオーバーライドして、
protected override void OnPaint(PaintEventArgs e){...}
と、なっています。
この関数からグラフィックスを取得して描画を行います。オーバーライドしたOn何とかメソッドでは、基本クラスのメソッドを一度呼び出しておくことが推奨されています。
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
//自分でやりたいこと
}
今回は、DrawLineメソッドでPenの太さも指定しています。
public Pen ( Color color, float width )withにペン幅を指定します。
また、直線の始点、終点にPoint構造体を使っています。コンストラクタは、オーバーロードされた3つのバージョンがありますが、もっとも普通に使われるのは、次のようなものです。
public Point ( int x, int y )では、サンプルのプログラムの実行結果を見てみましょう。
Update 19/Oct/2006 By Y.Kumei