如何在Winforms中动态移动添加的图形行

奇拉格

我正在窗体中动态显示两行,并且想垂直移动行。

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

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

这是我的代码

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();
        }
    }

任何输入将不胜感激。

普拉卡什·维什瓦卡玛(Prakash Vishwakarma)

您可以使用以下代码来解决您的目的。

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;
        }


    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在js中无动态添加移动验证

来自分类Dev

如何在单独的文件夹中添加字符串和移动图形

来自分类Dev

如何在emmeans图形中添加颜色?

来自分类Dev

OxyPlot:如何在图形中添加文本?

来自分类Dev

如何在 ReacjJS 中动态添加/删除表格行

来自分类Dev

如何在我的自定义列中向Winforms DataGridView添加新行

来自分类Dev

如何在动态添加到html表的行中添加行号

来自分类Dev

如何在每个动态行中添加添加和删除按钮?

来自分类Dev

如何在FragmentStatePagerAdapter中动态添加页面

来自分类Dev

如何在JTable中动态添加行

来自分类Dev

如何在片段中动态添加TableRow?

来自分类Dev

如何在VueJs中动态添加属性

来自分类Dev

如何在Bootstrap中动态添加行

来自分类Dev

如何在PHP中动态添加时间

来自分类Dev

如何在listveiw中动态添加行?

来自分类Dev

如何在iframe中添加动态内容?

来自分类Dev

如何在 RecyclerView 中动态添加 CardView?

来自分类Dev

如何在 ReactJS 中动态添加图像?

来自分类Dev

如何在Android中动态添加图标?

来自分类Dev

如何在HighChart图形的Y轴值中添加%符号?

来自分类Dev

如何在图形的图例中添加额外的信息?

来自分类Dev

如何在TensorFlow中向图形添加可选输入?

来自分类Dev

如何在CSS中为几何图形添加边框?

来自分类Dev

如何在networkx的图形中的节点上添加标签?

来自分类Dev

如何在图形的图例中添加额外的信息?

来自分类Dev

如何在amcharts中添加多个图形

来自分类Dev

如何在visual studio中添加图形库?

来自分类Dev

如何在ASP.Net MVC 5中动态添加新行

来自分类Dev

如何在动态创建的行中添加日期选择器

Related 相关文章

热门标签

归档