获取 ChartControl 中 Point(X,Y) 的 Form.Left 值
Get Form.Left value of Point(X,Y) in ChartControl
我需要图表控件中特定点的左值(或屏幕上的位置)。
基本上是 0,0 点,因为它会在调整表单大小时发生变化。
干杯
假设您指的是 DataPoint
与 XValue = 0
和 YValue[0] = 0
的位置,您可以为此使用 XAxis
函数 ValueToPixelPosition
;这是一个示例,假设您已将 Label lbl
添加到图表的 Controls
并将 Label
保持在第 3 个 DataPoint
:[=33= 的位置]
private void chart1_Resize(object sender, EventArgs e)
{
DataPoint dp = chart1.Series[0].Points[2];
ChartArea ca = chart1.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
int px = (int) ax.ValueToPixelPosition(dp.XValue);
int py = (int) ay.ValueToPixelPosition(dp.YValues[0]);
lbl.Location = new Point(px, py);
}
请注意,此函数以及其他转换函数 (PixelPositionToValue
) 仅在 Pre/PostPaint
事件或鼠标事件中有效。 Resize
事件似乎也有效。
在其他时间使用它们,尤其是在图表完成其布局之前,将产生错误值或空值。
px、py像素值是相对于图表的。要将它们转换为相对于 Form 的点,您可以使用常用的转换函数 PointToScreen
and PointToClient
.
更新:
如果你真的想要 ChartArea.InnerPlotPosition
左上角的像素坐标,你可以使用 these two functions:
RectangleF ChartAreaClientRectangle(Chart chart, ChartArea CA)
{
RectangleF CAR = CA.Position.ToRectangleF();
float pw = chart.ClientSize.Width / 100f;
float ph = chart.ClientSize.Height / 100f;
return new RectangleF(pw * CAR.X, ph * CAR.Y, pw * CAR.Width, ph * CAR.Height);
}
RectangleF InnerPlotPositionClientRectangle(Chart chart, ChartArea CA)
{
RectangleF IPP = CA.InnerPlotPosition.ToRectangleF();
RectangleF CArp = ChartAreaClientRectangle(chart, CA);
float pw = CArp.Width / 100f;
float ph = CArp.Height / 100f;
return new RectangleF(CArp.X + pw * IPP.X, CArp.Y + ph * IPP.Y,
pw * IPP.Width, ph * IPP.Height);
}
也许可以在 Resize
事件中像这样使用它:
ChartArea ca = chart1.ChartAreas[0];
Rectangle ipr = Rectangle.Round(InnerPlotPositionClientRectangle(chart1, ca));
lbl.Location = ipr.Location;
如果你现在愿意,你可以轻松地将它偏移几个像素..
解决方案
这就是我需要的代码。它在调整图表大小时使标签靠近左上角。同样,当 Y 轴移动时,标签会粘在上面。
感谢@TaW 提供所需的代码(参见答案 1)
ChartArea ca = prodChart.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
int px = (int)ax.ValueToPixelPosition(ax.Minimum + (ax.Maximum * 0.01));
int py = (int)ay.ValueToPixelPosition(ay.Maximum - (ay.Maximum * 0.02));
px = px - 5;
qtyLabel.Location = new Point(px, py);
sheetNameLabel.Location = new Point(px, py + 17);
dateRangeLabel.Location = new Point(px, py + 34);
我需要图表控件中特定点的左值(或屏幕上的位置)。 基本上是 0,0 点,因为它会在调整表单大小时发生变化。
干杯
假设您指的是 DataPoint
与 XValue = 0
和 YValue[0] = 0
的位置,您可以为此使用 XAxis
函数 ValueToPixelPosition
;这是一个示例,假设您已将 Label lbl
添加到图表的 Controls
并将 Label
保持在第 3 个 DataPoint
:[=33= 的位置]
private void chart1_Resize(object sender, EventArgs e)
{
DataPoint dp = chart1.Series[0].Points[2];
ChartArea ca = chart1.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
int px = (int) ax.ValueToPixelPosition(dp.XValue);
int py = (int) ay.ValueToPixelPosition(dp.YValues[0]);
lbl.Location = new Point(px, py);
}
请注意,此函数以及其他转换函数 (PixelPositionToValue
) 仅在 Pre/PostPaint
事件或鼠标事件中有效。 Resize
事件似乎也有效。
在其他时间使用它们,尤其是在图表完成其布局之前,将产生错误值或空值。
px、py像素值是相对于图表的。要将它们转换为相对于 Form 的点,您可以使用常用的转换函数 PointToScreen
and PointToClient
.
更新:
如果你真的想要 ChartArea.InnerPlotPosition
左上角的像素坐标,你可以使用 these two functions:
RectangleF ChartAreaClientRectangle(Chart chart, ChartArea CA)
{
RectangleF CAR = CA.Position.ToRectangleF();
float pw = chart.ClientSize.Width / 100f;
float ph = chart.ClientSize.Height / 100f;
return new RectangleF(pw * CAR.X, ph * CAR.Y, pw * CAR.Width, ph * CAR.Height);
}
RectangleF InnerPlotPositionClientRectangle(Chart chart, ChartArea CA)
{
RectangleF IPP = CA.InnerPlotPosition.ToRectangleF();
RectangleF CArp = ChartAreaClientRectangle(chart, CA);
float pw = CArp.Width / 100f;
float ph = CArp.Height / 100f;
return new RectangleF(CArp.X + pw * IPP.X, CArp.Y + ph * IPP.Y,
pw * IPP.Width, ph * IPP.Height);
}
也许可以在 Resize
事件中像这样使用它:
ChartArea ca = chart1.ChartAreas[0];
Rectangle ipr = Rectangle.Round(InnerPlotPositionClientRectangle(chart1, ca));
lbl.Location = ipr.Location;
如果你现在愿意,你可以轻松地将它偏移几个像素..
解决方案
这就是我需要的代码。它在调整图表大小时使标签靠近左上角。同样,当 Y 轴移动时,标签会粘在上面。
感谢@TaW 提供所需的代码(参见答案 1)
ChartArea ca = prodChart.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
int px = (int)ax.ValueToPixelPosition(ax.Minimum + (ax.Maximum * 0.01));
int py = (int)ay.ValueToPixelPosition(ay.Maximum - (ay.Maximum * 0.02));
px = px - 5;
qtyLabel.Location = new Point(px, py);
sheetNameLabel.Location = new Point(px, py + 17);
dateRangeLabel.Location = new Point(px, py + 34);