2016-07-29 16 views
2

ウィンドウのように線を描画する方法ペイントは固定された最初の点を1回クリックし、2番目の点(および線)はマウスで移動し、もう1回クリックすると線が固定されます。c#ドラッグして線を引く方法

int x = 0, y = 0; 
protected override void OnMouseMove(MouseEventArgs e) 
{ 
    base.OnMouseMove(e); 
    // Create the graphics object 
    Graphics g = CreateGraphics(); 
    // Create the pen that will draw the line 
    Pen p = new Pen(Color.Navy); 
    // Create the pen that will erase the line 
    Pen erase = new Pen(Color.White); 
    g.DrawLine(erase, 0, 0, x, y); 
    // Save the mouse coordinates 
    x = e.X; y = e.Y; 
    g.DrawLine(p, 0, 0, x, y); 
} 

クリックイベントの一部は正常であるが、上記のこの方法では、消去線は、実際には他の背景画像の上に重なって以前に青い線をプロットした白線です。

もっと管理しやすい方法がありますか?ありがとう

+0

その後、結果の画像を保存しますか? – Takarii

答えて

1

フォームクライアント領域の図面は、OnPaintイベントに実装して、奇妙な影響を避ける必要があります。 次のコードフラグメントを検討してください。

Point Latest { get; set; } 

List<Point> _points = new List<Point>(); 

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    base.OnMouseMove(e); 

    // Save the mouse coordinates 
    Latest = new Point(e.X, e.Y); 

    // Force to invalidate the form client area and immediately redraw itself. 
    Refresh(); 
} 

protected override void OnPaint(PaintEventArgs e) 
{ 
    var g = e.Graphics; 
    base.OnPaint(e); 

    if (_points.Count > 0) 
    { 
     var pen = new Pen(Color.Navy); 
     var pt = _points[0]; 
     for(var i=1; _points.Count > i; i++) 
     { 
      var next = _points[i]; 
      g.DrawLine(pen, pt, next); 
      pt = next; 
     } 

     g.DrawLine(pen, pt, Latest); 
    } 
} 

private void Form1_MouseClick(object sender, MouseEventArgs e) 
{ 
    Latest = new Point(e.X, e.Y); 
    _points.Add(Latest); 
    Refresh(); 
} 
+0

ありがとう、私はちょうどそれを試しました。それはかなりきちんとしていますが、Refreshメソッドでは前の行は保持されません。私が新しい線画を始めると、前の線画はなくなります。前の行をすべて保持する方法はありますか? – tomu

+0

その後、** OnClick()**イベントから前のすべてのポイントをリストに保存し、** OnPaint()**から描画することができます。 – Jackdaw

+0

上記の更新されたコードの断片を参照してください。 – Jackdaw

1

線の上に線を描こうとしないでください。オフスクリーンのバッファーに描画し、各ドローコールペイントでコントロールにビットマップされたペイントすると、より良い結果が得られます。そうすれば、ちらつきのないグラフィックスと、あなたが望むように動作するきれいなラインが得られます。

Graphicsクラスをどのように使用すればよいか、また一般的には描画する方法については、this forum postをご覧ください。ポストの最後には良いサンプルプログラムもあります。私は、指示を守った後、そのソースコードを見てみることをお勧めします。

関連する問題