加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Graphic – DrawLine – 绘制线并移动它

发布时间:2020-12-15 03:45:47 所属栏目:百科 来源:网络整理
导读:在我的.net c#程序中,我使用文本框中的值绘制几行(我使用DrawLine函数).我想要通过clik移动其中的一条,并用鼠标移动这条线 – 是可能吗? 解决方法 public class LineMover : Form{ public LineMover() { this.DoubleBuffered = true; this.Paint += new Pai
在我的.net c#程序中,我使用文本框中的值绘制几行(我使用DrawLine函数).我想要通过clik移动其中的一条,并用鼠标移动这条线 – 是可能吗?

解决方法

public class LineMover : Form
{
  public LineMover()
  {

    this.DoubleBuffered = true;

    this.Paint += new PaintEventHandler(LineMover_Paint);
    this.MouseMove += new MouseEventHandler(LineMover_MouseMove);
    this.MouseDown += new MouseEventHandler(LineMover_MouseDown);
    this.MouseUp += new MouseEventHandler(LineMover_MouseUp);

    this.Lines = new List<GraphLine>()
    {
      new GraphLine (10,10,100,200),new GraphLine (10,150,120,40),};
  }

  void LineMover_MouseUp(object sender,MouseEventArgs e)
  {
    if (Moving != null)
    {
      this.Capture = false;
      Moving = null;
    }
    RefreshLineSelection(e.Location);

  }

  void  LineMover_MouseDown(object sender,MouseEventArgs e)
  {
    RefreshLineSelection(e.Location);
    if (this.SelectedLine != null && Moving == null)
    {
      this.Capture = true;
      Moving = new MoveInfo 
       {
          Line = this.SelectedLine,StartLinePoint = SelectedLine.StartPoint,EndLinePoint = SelectedLine.EndPoint,StartMoveMousePoint = e.Location 
       };
    }
    RefreshLineSelection(e.Location);
  }

  void LineMover_Paint(object sender,PaintEventArgs e)
  {
    e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    foreach (var line in Lines)
    {
      var color = line == SelectedLine ? Color.Red : Color.Black;
      var pen = new Pen(color,2);
      e.Graphics.DrawLine(pen,line.StartPoint,line.EndPoint);
    }
  }
  void LineMover_MouseMove(object sender,MouseEventArgs e)
  {
    if (Moving != null)
    {
      Moving.Line.StartPoint = new PointF(Moving.StartLinePoint.X + e.X - Moving.StartMoveMousePoint.X,Moving.StartLinePoint.Y + e.Y - Moving.StartMoveMousePoint.Y);
      Moving.Line.EndPoint = new PointF(Moving.EndLinePoint.X + e.X - Moving.StartMoveMousePoint.X,Moving.EndLinePoint.Y + e.Y - Moving.StartMoveMousePoint.Y);
    }
    RefreshLineSelection(e.Location);
  }

  private void RefreshLineSelection(Point point)
  {
    var selectedLine = FindLineByPoint(Lines,point);
    if (selectedLine != this.SelectedLine)
    {
      this.SelectedLine = selectedLine;
      this.Invalidate();
    }
    if (Moving != null)
      this.Invalidate();

    this.Cursor =
        Moving != null ? Cursors.Hand :
        SelectedLine != null ? Cursors.SizeAll :
          Cursors.Default;

  }



  public List<GraphLine> Lines = new List<GraphLine>();
  GraphLine SelectedLine = null;
  MoveInfo Moving = null;


  static GraphLine FindLineByPoint(List<GraphLine> lines,Point p)
  {
    var size = 10;
    var buffer = new Bitmap(size * 2,size * 2);
    foreach (var line in lines)
    {
      //draw each line on small region around current point p and check pixel in point p 

      using (var g = Graphics.FromImage(buffer))
      {
        g.Clear(Color.Black);
        g.DrawLine(new Pen(Color.Green,3),line.StartPoint.X - p.X + size,line.StartPoint.Y - p.Y + size,line.EndPoint.X - p.X + size,line.EndPoint.Y - p.Y + size);
      }

      if (buffer.GetPixel(size,size).ToArgb() != Color.Black.ToArgb())
        return line;
    }
    return null;
  }

  public static void Main()
  {
    Application.Run(new LineMover());
  }
}

public class MoveInfo
{
  public GraphLine Line;
  public PointF StartLinePoint;
  public PointF EndLinePoint;
  public Point StartMoveMousePoint;
}
public class GraphLine
{
  public GraphLine(float x1,float y1,float x2,float y2)
  {
    this.StartPoint = new PointF(x1,y1);
    this.EndPoint = new PointF(x2,y2);
  }
  public PointF StartPoint;
  public PointF EndPoint;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读