Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用windows窗体图表控件的鼠标单击事件和绘制事件在图表上绘制点?_C#_.net_Winforms - Fatal编程技术网

C# 如何使用windows窗体图表控件的鼠标单击事件和绘制事件在图表上绘制点?

C# 如何使用windows窗体图表控件的鼠标单击事件和绘制事件在图表上绘制点?,c#,.net,winforms,C#,.net,Winforms,我现在添加了起点终点和鼠标x和鼠标y变量,我想在鼠标左键单击时使用它们在图表控件上绘制点 但我希望只在图表区域上绘制点,并且仅当鼠标位于图表中的正方形区域内时才绘制点,这样它就不会在正方形边界线上或图表控制区域之外绘制点 以及在图表中的方框中移动鼠标时显示,以显示标签上的X轴和Y轴值 左轴1至120当前时间和下轴1至30当前天。 因此,如果我在第一个正方形区域移动鼠标,它将显示第1天时间112或第2天时间33 这就是为什么我也不确定X轴和Y轴上的空间是否正确。 它应该是1到120和1到30,但我

我现在添加了起点终点和鼠标x和鼠标y变量,我想在鼠标左键单击时使用它们在图表控件上绘制点

但我希望只在图表区域上绘制点,并且仅当鼠标位于图表中的正方形区域内时才绘制点,这样它就不会在正方形边界线上或图表控制区域之外绘制点

以及在图表中的方框中移动鼠标时显示,以显示标签上的X轴和Y轴值

左轴1至120当前时间和下轴1至30当前天。 因此,如果我在第一个正方形区域移动鼠标,它将显示第1天时间112或第2天时间33

这就是为什么我也不确定X轴和Y轴上的空间是否正确。 它应该是1到120和1到30,但我认为每个方块应该在3天和120次内呈现,但以1步1跳的方式呈现,所以当我用鼠标移动时,我可以看到第一个方块第1天第3次或第3天第66次 下一排方块将显示第4到第6天

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;
using System.Windows.Forms.DataVisualization.Charting;

namespace Test
{
    public partial class Form1 : Form
    {
        private Point startPoint = new Point();
        private Point endPoint = new Point();
        private int mouseX = 0;
        private int mouseY = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void chart1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                mouseX = System.Windows.Forms.Cursor.Position.X;
                mouseY = System.Windows.Forms.Cursor.Position.Y;
                chart1.Invalidate();

            }
        }

        private void chart1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g1 = this.CreateGraphics();
            Pen linePen = new Pen(Color.Green, 1);
            Pen ellipsePen = new Pen(Color.Red, 1);
            startPoint = new Point(mouseX, mouseY);
            endPoint = new Point(mouseX, mouseY);
            g1.DrawLine(linePen, startPoint, endPoint);
            g1.DrawEllipse(ellipsePen, mouseX - 2, mouseY - 2, 4, 4);
            linePen.Dispose();
            ellipsePen.Dispose();
            g1.Dispose();
        }
    }
}

现在代码的方式是,它绘制的点远离图表控制区域

这是因为您使用了错误的鼠标坐标。 更换这些线路

mouseX = System.Windows.Forms.Cursor.Position.X;
mouseY = System.Windows.Forms.Cursor.Position.Y;
为此:

mouseX = e.X;
mouseY = e.Y;

使用窗体作为基准返回鼠标的坐标,而使用引发事件的控件作为基准返回鼠标的坐标。

可能重复TaW我在那里尝试了您的解决方案,它确实有效。我接受了你的第二个解决方案代码,并做了一些更改。而不是使用点列表,我在paint事件中只使用了lastPoint变量,我这样做了:e.Graphics.drawerlipse(pen,lastPoint.X,lastPoint.Y,4,4);我这样做是因为我每次只想画一个点。现在的问题是,每次单击鼠标时,它都会删除最后绘制的点。我怎样才能保证它不会删除最后一个点呢?帖子一直在向datapoints集合添加绘制的点。如果你不想这样,只画一个点,你仍然会将它添加到系列点,或者可能是一个额外的系列;然后,您可以计算其正确位置,并使用这些坐标设置新点。最后,您将删除数据点。。我理解得对吗?你说得对。谢谢。一定要看看我的表。它包含将值点转换为图形点的通用代码。。