如何在winforms中移动动态添加的图形线 [英] How to move dynamically added graphics line in winforms

查看:27
本文介绍了如何在winforms中移动动态添加的图形线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在表单中动态显示两条线,想垂直移动线.

I am displaying two lines dynamically in form and want to move line vertically.

我尝试使用 mousemove 事件移动,但它同时移动了两条线.

I tried to move using mousemove event but it's moving both lines together.

那么是否可以在表单上单独移动动态添加的行?

So is it possible to move dynamically added line individually on the form?

这是我的代码

Graphics g;
    int Y = 250;
    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
    }

    private void Form2_Paint(object sender, PaintEventArgs e)
    {
        g = e.Graphics;
        g.DrawLine(Pens.Red, new Point(0, Y), new Point(1500, Y));
        g.DrawLine(Pens.LimeGreen, new Point(0, Y+50), new Point(1500, Y+50));
    }


    public void Form2_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            Y = e.Location.Y;
            Refresh();
        }
    }

任何意见将不胜感激.

推荐答案

您可以使用以下代码来解决您的问题.

You may use following code to solve your purpose.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestWin
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
            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 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;
        }


    }

}

这篇关于如何在winforms中移动动态添加的图形线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆