2012-01-20 6 views
1

PictureBoxUserControlです。私はこれをメインフォームにUser Controlと追加しました。今私は、ボタンを押して、ユーザーコントロール上に行を作成する必要があります。私のプロジェクトでは、このボタンを押すたびに、2つのPointF(xとy)のパラメータをユーザーコントロールに送信し、既存のものに加えて新しい行を描画したいと考えています。私はこれまでにpictureboxがロードされたときにPaintイベントを持っています。親からPictureBoxに線を描く

ボタンのクリックに線を描きたいことを、ここにあなたのコードの修正版だと仮定すると、
private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    Pen graphPen = new Pen(Color.Red, 2); 
    PointF pt1D = new PointF(); 
    PointF pt2D = new PointF(); 
    pt1D.X = 0; 
    pt1D.Y = 10; 
    pt2D.X = 10; 
    pt2D.Y = 10; 

    e.Graphics.DrawLine(graphPen, pt1D, pt2D); 
} 

答えて

1

:あなたはPictureBoxクラスのCreateGraphics()を通じてGraphicsオブジェクトを取得することができます

List<PointF> points = new List<PointF>(); 
Pen graphPen = new Pen(Color.Red, 2); 

private void btnDrawLines_Click(object sender, EventArgs e) 
{ 
    Graphics g = picBox.CreateGraphics(); 
    PointF pt1D = new PointF(); 
    PointF pt2D = new PointF(); 
    pt1D.X = 0; 
    pt1D.Y = 10; 
    pt2D.X = 10; 
    pt2D.Y = 10;  
    g.DrawLine(graphPen, pt1D, pt2D); 
    points.Add(pt1D); 
    points.Add(pt2D); 
} 

private void picBox_Paint(object sender, PaintEventArgs e) 
{ 
    for (int i = 0; i < points.Count; i+=2) 
     e.Graphics.DrawLine(graphPen, points[i], points[i + 1]); 
} 

注メソッドは、Paintイベントハンドラのe.Graphicsオブジェクトと同じです。

+0

'CreateGraphics'と' e.Graphics'は全く同じものではありません。ユーザーがフォームを最小化して元に戻す場合、バージョンによって図面が保持されません。 – LarsTech

+0

私は半分あなたに同意するでしょう。描画されたものは、フォームやピクチャボックスを強制的に再描画するようなイベントが発生した後にすべて消えますが、CreateGraphicsとe.Graphicsは同じGraphicsクラスのインスタンスを返します。ペイントハンドラで行われた変更は、すべての再描画の後に呼び出されるため、保持されます。実行する必要があるのは、クリックハンドラに描画された線を保持し、ペイントで描画することです。私は少なくとも変更を保存するために私の質問を更新します。 – Abbas

+0

ありがとうございました。メインフォームのボタンを押す必要があることに注意してください。画像ボックスはユーザーコントロール内にあります。このメソッドにパラメータ(x、y、linecolorなど)を送信し、これらのパラメータに従って線を描くことができます。 – Avrum

0

あなたはおそらく少しLineクラスたい、描画する行を追加する場合:

public class Line { 
    public Point Point1 { get; set; } 
    public Point Point2 { get; set; } 

    public Line(Point point1, Point point2) { 
    this.Point1 = point1; 
    this.Point2 = point2; 
    } 
} 

をそしてあなただけのリストにこれらの「行」を追加することができます。

private List<Line> _Lines = new List<Line>(); 

それらに追加し、図面を更新するようにコントロールに指示します。

_Lines.Add(new Line(new Point(10, 10), new Point(42, 42))); 
_Lines.Add(new Line(new Point(20, 40), new Point(20, 60))); 
pictureBox1.Invalidate() 

private void pictureBox1_Paint(object sender, PaintEventArgs e) { 
    e.Graphics.Clear(Color.White); 
    foreach (Line l in _Lines) { 
    e.Graphics.DrawLine(Pens.Red, l.Point1, l.Point2); 
    } 
}