从鼠标hover在类对象上获取值C#

我有一个带有360号码的txt文件,我必须阅读所有这些并绘制一种由FillPie制成的光盘,由于列表的价值,每个人都以灰色标度着色。 在这里,一切都非常简单。我用一个Paint方法创建了一个类,其中包含一个完整颜色的Paint方法的数据(txt和degree中的值)。 这是该类的代码:

class DatoDisco { int valoreSpicchio; int gradi; public DatoDisco(int valoreTastatore, int gradiLettura) { valoreSpicchio = valoreTastatore; gradi = gradiLettura; } public void Clear() { valoreSpicchio = 0; gradi = 0; } private int ScalaGrigi() { int grigio = 0; if (valoreSpicchio <= 0) { grigio = 125 + (valoreSpicchio / 10); if (grigio  0) { grigio = 125 + (valoreSpicchio / 10); if (grigio > 230) grigio = 230; } return grigio; } public void Paint (Graphics grafica) { try { Brush penna = new SolidBrush(Color.FromArgb(255, ScalaGrigi(), ScalaGrigi(), ScalaGrigi())); grafica.FillPie(penna, 0, 0, 400, 400, gradi, 1.0f); } catch { } } public int ValoreSpicchio { get { return valoreSpicchio; } } public int Gradi { get { return gradi; } } } 

这是我画一切的地方:

 public partial class Samac : Form { libnodave.daveOSserialType fds; libnodave.daveInterface di; libnodave.daveConnection dc; int rack = 0; int slot = 2; int scalaGrigi = 0; int angolatura = 0; List valoriY = new List(); //Disco disco = new Disco(); List disco = new List(); float[] valoriTastatore = new float[360]; public Samac() { InitializeComponent(); StreamReader dataStream = new StreamReader("save.txt"); textBox1.Text = dataStream.ReadLine(); dataStream.Dispose(); for (int i = 0; i <= 360; i++ ) chart1.Series["Series2"].Points.Add(0); //AggiornaGrafico(textBox1.Text, chart1); SetStyle(ControlStyles.SupportsTransparentBackColor, true); } string indirizzoIpPlc { get { FileIniDataParser parser = new FileIniDataParser(); IniData settings = parser.LoadFile("config.ini"); return settings["PLC_CONNECTION"]["PLC_IP"]; } } private void AggiornaGrafico(string nomeFile, Chart grafico, bool online) { int max = 0; int min = 0; grafico.Series["Series1"].Points.Clear(); grafico.Series["Series2"].Points.Clear(); grafico.Series["Series3"].Points.Clear(); grafico.Series["Series4"].Points.Clear(); grafico.ChartAreas[0].AxisX.Maximum = 360; grafico.ChartAreas[0].AxisX.Minimum = 0; grafico.ChartAreas[0].AxisY.Maximum = 500; grafico.ChartAreas[0].AxisY.Minimum = -500; String file = nomeFile; valoriY.Clear(); disco.Clear(); if (online == false) { System.IO.File.WriteAllText("save.txt", nomeFile); } StreamReader dataStreamGrafico = new StreamReader(file); StreamReader dataStreamScheda = new StreamReader("Scheda.sch"); string datasample; string[] scheda = new string[56]; for (int i = 0; i  800) || (Math.Abs(min) > 800)) { if (Math.Abs(max) >= Math.Abs(min)) { chart1.ChartAreas[0].AxisY.Maximum = max + 200; chart1.ChartAreas[0].AxisY.Minimum = -(max + 200); } else { chart1.ChartAreas[0].AxisY.Maximum = min + 200; chart1.ChartAreas[0].AxisY.Minimum = -(min + 200); } } else { chart1.ChartAreas[0].AxisY.Maximum = 800; chart1.ChartAreas[0].AxisY.Minimum = -800; } boxGraficaDisco.Refresh(); } private void button1_Click(object sender, EventArgs e) { DialogResult result = openFileDialog1.ShowDialog(); textBox1.Text = openFileDialog1.FileName; if (result == DialogResult.OK) { AggiornaGrafico(textBox1.Text, chart1, timer1.Enabled); } } ToolTip tooltip = new ToolTip(); private int lastX; private int lastY; private void chart1_MouseMove(object sender, MouseEventArgs e) { if (eX != this.lastX || eY != this.lastY) { try { int cursorX = Convert.ToInt32(chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.Location.X)); tooltip.Show("X:" + cursorX.ToString("0.00") + "Y:" + Convert.ToInt32(chart1.Series[0].Points[cursorX].YValues[0]).ToString(), this.chart1, e.Location.X + 20, e.Location.Y + 20); } catch { } } this.lastX = eX; this.lastY = eY; } private void button1_Click_1(object sender, EventArgs e) { int indice = ((int)Char.GetNumericValue(textBox1.Text[textBox1.Text.Length - 5]))+1; if (File.Exists(textBox1.Text.Substring(0, textBox1.Text.Length - 5) + indice + ".txt")) { textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 5) + indice + ".txt"; try { AggiornaGrafico(textBox1.Text, chart1, timer1.Enabled); } catch { MessageBox.Show("Il File non esiste"); } } else { MessageBox.Show("Il File non esiste"); } } private void btnGrafMeno_Click(object sender, EventArgs e) { int indice = ((int)Char.GetNumericValue(textBox1.Text[textBox1.Text.Length - 5])) - 1; if (indice >= 0) { textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 5) + indice + ".txt"; try { AggiornaGrafico(textBox1.Text, chart1, timer1.Enabled); } catch { MessageBox.Show("Il File non esiste"); } } else { MessageBox.Show("Prima lettura disco"); } } private void btnConnetti_Click(object sender, EventArgs e) { fds.rfd = libnodave.openSocket(102, indirizzoIpPlc); fds.wfd = fds.rfd; if (fds.rfd > 0) { di = new libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k); di.setTimeout(1000000); dc = new libnodave.daveConnection(di, 0, rack, slot); int res = dc.connectPLC(); timer1.Start(); // AggiornaGrafico("Disco.csv", chart1, timer1.Enabled); } else { MessageBox.Show("Impossibile connettersi"); } } private void timer1_Tick(object sender, EventArgs e) { if (timer1.Enabled == true) { int res; res = dc.readBytes(libnodave.daveDB, 21, 40, 1, null); if (res == 0) { var letturaDati = (dc.getS8At(0) & (1 << 0)) != 0; if (letturaDati == true) { int puntatore = 30; StreamWriter datiDisco = new StreamWriter("DatiDaPlc.csv"); datiDisco.WriteLine("X;" + "C;" + "Z;"); while (puntatore = contatore && Convert.ToInt32(values[1])  minX && Convert.ToInt32(values[0]) <= maxX)) { scritt.WriteLine(Convert.ToInt32(float.Parse(values[2]) * 1000).ToString()); contatore += 1000; } } lettura.Close(); scritt.Close(); AggiornaGrafico("Disco.csv", chart1, timer1.Enabled); } } else { timer1.Stop(); MessageBox.Show("Disconnesso"); dc.disconnectPLC(); di.disconnectAdapter(); fds.rfd = libnodave.closeSocket(102); fds.wfd = fds.rfd; } } } private void btnDisconnetti_Click(object sender, EventArgs e) { if (timer1.Enabled == true) { dc.disconnectPLC(); di.disconnectAdapter(); fds.rfd = libnodave.closeSocket(102); fds.wfd = fds.rfd; timer1.Stop(); AggiornaGrafico(textBox1.Text, chart1, timer1.Enabled); } } private void Samac_FormClosing(object sender, FormClosingEventArgs e) { if (timer1.Enabled == true) { dc.disconnectPLC(); di.disconnectAdapter(); libnodave.closeSocket(102); timer1.Stop(); } } private void button1_Click_2(object sender, EventArgs e) { if (timer1.Enabled == true) { AggiornaGrafico("Disco.csv", chart1, timer1.Enabled); } else { AggiornaGrafico(textBox1.Text, chart1, timer1.Enabled); } } private void chart2_MouseMove(object sender, MouseEventArgs e) { if (eX != this.lastX || eY != this.lastY) { try { int cursorX = Convert.ToInt32(chart2.ChartAreas[0].AxisX.PixelPositionToValue(e.Location.X)); int cursorY = Convert.ToInt32(chart2.ChartAreas[0].AxisY.PixelPositionToValue(e.Location.Y)); //tooltip.Show("X:" + chart2.Series[0].Points[cursorX].XValue.ToString() + "Y:" + chart2.Series[0].Points[cursorX].YValues[0].ToString(), this.chart2, e.Location.X + 20, e.Location.Y + 20); tooltip.Show("X:" + cursorX.ToString() + "Y:#VALY" , this.chart2, e.Location.X + 20, e.Location.Y + 20); //chart2.Series[0].ToolTip="#VALY"; } catch { } } this.lastX = eX; this.lastY = eY; } private void boxGraficaDisco_Paint(object sender, PaintEventArgs e) { Graphics grafica = e.Graphics; //disco.Paint(grafica); foreach (DatoDisco d in disco) { d.Paint(grafica); } } private void boxGraficaDisco_MouseMove(object sender, MouseEventArgs e) { if (eX != this.lastX || eY != this.lastY) { try { foreach (DatoDisco d in disco) { } } catch { } } this.lastX = eX; this.lastY = eY; } } 

现在我需要当我用鼠标滑过绘制的光盘时,工具提示会显示fillPie的数据(txt的度数和值),但我无法弄清楚如何。 有人可以帮帮我吗? 这是光盘的图像 在此处输入图像描述

最终看起来你想要的只是一个函数来获得鼠标位置和光盘中心之间的角度。

这是一个计算给定两点角度的函数:

 double AngleFromPoints(Point pt1, Point pt2) { Point P = new Point(pt1.X - pt2.X, pt1.Y - pt2.Y); double alpha = 0d; if (PY == 0) alpha = PX > 0 ? 0d : 180d; else { double f = 1d * PX / (Math.Sqrt(PX * PX + PY * PY)); alpha = Math.Acos(f) * 180d / Math.PI; if (PY > 0) alpha = 360d - alpha; } return alpha; }