Windows窗体:在C#中创建透明图形

时间:2012-02-13 17:18:17

标签: c# winforms graphics charts

我详尽地使用了搜索,但未能找到令人满意的解决方案。

我使用图表(datavisualization.charting.chart)编程了数据可视化。此图表显示稳定变化,因为它显示了某种模拟结果。 我想在图表上绘制一条线(取决于鼠标位置),以显示上下文敏感信息。

因此,我尝试了两个实现,两者都没有完全按照我的意愿工作:

在MouseMove-事件

上调用plotLine

gGraph是使用底层图形创建的:chartCreateGraphics();

protected void plotLine(object sender, System.EventArgs e)
{
  if (this.chart.Series.Count > 0) //ensure that the chart shows data
  {
    plotChart(); // this plots the underlying chart
    penGraph = new Pen(Color.Black);
    Point point1 = new Point(Form1.MousePosition.X - chart.Location.X, 0);
    Point point2 = new Point(Form1.MousePosition.X - chart.Location.X,     
    chart.Location.Y + chart.Size.Height);
    gGraph.DrawLine(penGraph, point1, point2);
    penGraph.Dispose();     
  }
}

此处,线条在每次绘制后立即消失,但只要不移动鼠标就会保留。

protected void plotLine(object sender, System.EventArgs e)
{
  penGraph = new Pen(Color.Black);
  Point point1 = new Point(Form1.MousePosition.X - chart.Location.X, 0);
  Point point2 = new Point(Form1.MousePosition.X - chart.Location.X,     
  chart.Location.Y + chart.Size.Height);
  gGraph.DrawLine(penGraph, point1, point2);
  penGraph.Dispose();           
}

此处,只要图表未按新图绘制,所有绘制的线条都会保留在图形表面中。 (仅保留最后一行以指示鼠标位置)

有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

您应该在OnPaint事件中绘图。您正在规避更新模型,并且正在看到这样做的影响。当然,你在MouseMove中做了一些绘图,但是当Paint事件触发时,它将被简单地删除。

首先将代码放在OnPaint中。在鼠标移动时,只需记录您需要的任何数据(即鼠标位置),然后在图表上调用Invalidate()。当你这样做时,将调用Paint事件并触发你的绘图代码。

经验法则;除了Paint事件之外,永远不会从任何地方画画。