【发布时间】:2015-05-14 20:59:40
【问题描述】:
在设计器中,我有两个文本框。 还有一个图表控件。 我希望当我在第一个文本框中输入数字 120 并在第二个文本框中输入数字 1 时,它将在 120,1 的图表上绘制一个点,但我的意思是 120 和 1 作为轴 x 和轴 y 值。
红色实心圆圈不在 120 和 1 处。 我的意思是红圈应该画在120的左轴上。 如果我将改为 120 116 而不是 1 25,则应在左轴 116 和下轴 25 上绘制圆。
但是现在圆圈已经从图表中画出来了。
这是我的代码:
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;
using System.Drawing.Drawing2D;
using System.Collections;
namespace Test
{
public partial class Form1 : Form
{
private Point startPoint = new Point();
private Point endPoint = new Point();
private int X = 0;
private int Y = 0;
private List<Point> points = new List<Point>();
private Point lastPoint = Point.Empty;
private ArrayList myPts = new ArrayList();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Random rdn = new Random();
for (int i = 120; i > 0; i--)
{
chart1.Series["Series1"].Points.AddXY
(rdn.Next(0, 10), rdn.Next(0, 10));
}
chart1.Series["Series1"].ChartType = SeriesChartType.FastLine;
chart1.Series["Series1"].Color = Color.Red;
ChartArea area = chart1.ChartAreas[0];
area.AxisX.Minimum = 1;
area.AxisX.Maximum = 30;
area.AxisY.Minimum = 1;
area.AxisY.Maximum = 120;
LineAnnotation line = new LineAnnotation();
Point p1 = new Point(1, 120);
chart1.Annotations.Add(line);
line.AxisX = area.AxisX;
line.AxisY = area.AxisY;
line.IsSizeAlwaysRelative = false;
line.X = 1; line.Y = 120;
line.Right = 30; line.Bottom = 1;
line.LineColor = Color.Blue;
line.LineWidth = 3;
}
SolidBrush myBrush = new SolidBrush(Color.Red);
private void chart1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
foreach (Point p in myPts)
g.FillEllipse(myBrush, p.X, p.Y, 10, 10);
}
private void chart1_MouseClick(object sender, MouseEventArgs e)
{
myPts.Add(new Point(X,Y));
chart1.Invalidate();
}
private void txtT_TextChanged(object sender, EventArgs e)
{
X = int.Parse(txtWeight.Text);
}
private void txtDays_TextChanged(object sender, EventArgs e)
{
Y = int.Parse(txtDays.Text);
}
}
}
我所做的是,在我输入两个 textBoxes 值之后,当我用鼠标单击图表控制区域上的任意位置时,它应该在 TextBoxes 的坐标上绘制圆。
但是圆圈没有画在正确的地方。
文本框名称 txtT 是左侧轴的左侧值。 textBox txtDays 应该是底部值的轴。
【问题讨论】:
-
这并不容易。现在你是按像素来做的,但是图表控件将图表轴值插入到画布区域。它还考虑了定位,因此为了做到这一点,您需要获取图表轴的绝对位置并从轴单位插入像素。
-
您可以研究this post 以了解绘制点和数据点如何相互转换。这很棘手,并且每当图表布局发生变化时都必须重复。它还需要在其中一个 Paint 事件中完成..
标签: c# .net winforms charts drawing