C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Formの以外のクラス内のコードを使ったパネルへの折れ線描画


(過去ログ 30 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■14149 / inTopicNo.1)  Formの以外のクラス内のコードを使ったパネルへの折れ線描画
  
□投稿者/ Tetsu (1回)-(2008/02/11(Mon) 12:57:48)

分類:[C#] 

使用言語:C#
開発環境:Visual Studio 2005

C#を最近使い始めた者です。よろしくお願いします。

1.Form上のボタンを押すと
2.データベースから点座標をクエリで取得し、
3.その点をつないで折れ線をパネル上に描く

というアプリケーションを作成しようとしています。上記の2は完成しているのですが、

「ボタンを押すとパネル上に折れ線が描かれる」

という部分がどうしてもうまくいきません。私が試みているのは、Formの上ではなく、他にDrawingMODというクラス(以下DrawingMOD)を作成し、そのDrawingMODの中に「パネル上に描画をする」というイベントを定義しようとしている、ということです。その際に、クラスの中にDrawOnPanelというデリゲートを宣言し、Form上のボタンクリックのイベントハンドラ(button1_Click)の中に、Form上で扱うDrawingMOD型のmyDrawオブジェクトのイベント(DrawPanel)とイベントハンドラ(myDraw_DrawPanel)の関連づけを行うことで、目的を達成しようとしています。一番下にコードをペーストさせていただきます。

問題になっている部分は、「描画を行うクラス:DrawingMOD」のコードの中の一番最後、

DrawPanel(this, new PaintEventArgs()); //パネルへの描画

という部分です。コードを走らせようとすると、「PaintEventArgs()」の部分に青線が出て、

「Error 1 No overload for method 'PaintEventArgs' takes '0' arguments」

と出ます。私が参考にした本では、デリゲートの引き数に

object sender



EventArgs e

の二つが定義されていました。デリゲートの引数は任意のものでよいという認識のもと、EventArgsではなくPaintEventArgsを使用したところ、エラーが出ました。このエラーの対処法を教えていただけないでしょうか。よろしくお願いいたします。



【描画を行うクラス:DrawingMOD】

public delegate void DrawOnPanel(object sender, PaintEventArgs e);//デリゲート

class DrawingMOD
{

public event DrawOnPanel DrawPanel; //イベントフィールド

//コンストラクタ
public DrawingMOD()
{

}

//パネルに折れ線を描画するメソッド
public void DrawMovingObjects()
{
DrawPanel(this, new PaintEventArgs()); //パネルへの描画
}


}


【フォームのコード】
public partial class Form1 : Form
{
DrawingMOD myDraw; //Form1で共通に使用するオブジェクト変数の宣言

public Form1()
{
InitializeComponent();
}

//描画に使用する3点の座標
private float xOne = 50.01f;
private float yOne = 100.01f;
private float xTwo = 100.01f;
private float yTwo = 100.01f;
private float xThree = 120.01f;
private float yThree = 120.01f;

private void button1_Click(object sender, EventArgs e)
{
//myDrawオブジェクトのDrawPanelイベントと、myDraw_DrawPanelイベントハンドラの関連付け
myDraw = new DrawingMOD();
myDraw.DrawPanel += new DrawOnPanel(myDraw_DrawPanel);
}

//myDraw_DrawPanelイベントハンドラ
private void myDraw_DrawPanel(object sender, PaintEventArgs e)
{

Panel panel = sender as Panel;
e.Graphics.Clear(Color.Green);

//ペンの色を定義
int cRed = 200;
int cGreen = 100;
int cBlue = 100;

//折れ線に使用する3点をPointF[]に格納する
PointF[] myPoints = new PointF[3];
myPoints[0] = new PointF(xOne, yOne);
myPoints[1] = new PointF(xTwo, yTwo);
myPoints[2] = new PointF(xThree, yThree);

Pen pen = new Pen(Color.FromArgb(cRed, cGreen, cBlue), 4); //ペンを作成

pen.EndCap = LineCap.ArrowAnchor; //折れ線を矢印にする
e.Graphics.DrawLines(pen, myPoints); //折れ線を描く

e.Dispose(); //Graphicsオブジェクトの破棄
}

}





引用返信 編集キー/
■14150 / inTopicNo.2)  Re[1]: Formの以外のクラス内のコードを使ったパネルへの折れ線描画
□投稿者/ 引っ込んだ(略) (5回)-(2008/02/11(Mon) 14:05:12)
2008/02/11(Mon) 16:01:19 編集(投稿者)

(変更履歴)
1.コードのミスを修正。
 (DrawingMOD.DrawMovingObjects()内。修正前のコードでもエラーが出なかったため気づくのが遅れました)
   this.DrawPanel(this, e);
       ↓
   this.DrawPanel(this.m_control, e);

はじめまして、引っ込んだ(略)と申します。
 お答えいたします。
 
 以下のコードで試してみてください。
 
//【フォームのコード】
public partial class Form3 : Form
{
DrawingMOD myDraw; //Form1で共通に使用するオブジェクト変数の宣言

public Form3()
{
InitializeComponent();
this.myDraw = new DrawingMOD(this.panel1);
myDraw.DrawPanel += new DrawOnPanel(myDraw_DrawPanel);
}

//描画に使用する3点の座標
private float xOne = 50.01f;
private float yOne = 100.01f;
private float xTwo = 100.01f;
private float yTwo = 100.01f;
private float xThree = 120.01f;
private float yThree = 120.01f;

private void button1_Click(object sender, EventArgs e)
{
this.myDraw.DrawMovingObjects();
}

//myDraw_DrawPanelイベントハンドラ
private void myDraw_DrawPanel(object sender, PaintEventArgs e)
{
Panel panel = sender as Panel;
e.Graphics.Clear(Color.Green);

//ペンの色を定義
int cRed = 200;
int cGreen = 100;
int cBlue = 100;

//折れ線に使用する3点をPointF[]に格納する
PointF[] myPoints = new PointF[3];
myPoints[0] = new PointF(xOne, yOne);
myPoints[1] = new PointF(xTwo, yTwo);
myPoints[2] = new PointF(xThree, yThree);

Pen pen = new Pen(Color.FromArgb(cRed, cGreen, cBlue), 4); //ペンを作成

pen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor; //折れ線を矢印にする
e.Graphics.DrawLines(pen, myPoints); //折れ線を描く

////////e.Dispose(); //Graphicsオブジェクトの破棄
}

}//End Class


public delegate void DrawOnPanel(object sender, PaintEventArgs e);//デリゲート

class DrawingMOD
{

public event DrawOnPanel DrawPanel; //イベントフィールド

private Control m_control;

//コンストラクタ
public DrawingMOD(Control c)
{
this.m_control = c;
//this.m_control.Paint += new PaintEventHandler(this.control_paint);
}

// ↓パネルに折れ線を描画するメソッド(その1)
// ↓Paintイベントで描画する場合はこちら。
//public void DrawMovingObjects()
//{
// this.m_control.Invalidate();
//}
//private void control_paint(object sender, PaintEventArgs e)
//{
// this.DrawPanel(sender, e);
//}

// ↓パネルに折れ線を描画するメソッド(その2)
// ↓Buttonクリック時のみ描画する場合はこちら。
public void DrawMovingObjects()
{
PaintEventArgs e = new PaintEventArgs(m_control.CreateGraphics(), m_control.ClientRectangle);
/////////////this.DrawPanel(this, e); // [修正前]
this.DrawPanel(this.m_control, e); // [修正後]
e.Graphics.Dispose();
}

}//End Class

以上です。
引用返信 編集キー/
■14177 / inTopicNo.3)  Re[2]: Formの以外のクラス内のコードを使ったパネルへの折れ線描画
□投稿者/ Tetsu (3回)-(2008/02/12(Tue) 14:22:36)
引っ込んだ(略)さん、ありがとうございました。早速試してみましたが、思い描いていたとおりに動いてくれました。
本当にありがとうございます。大変勉強になりました。感謝しています。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -