【问题标题】:Vb.net Zoom/Selection Box for Chart slowVb.net 缩放/图表慢速选择框
【发布时间】:2014-07-07 16:04:14
【问题描述】:

我有一个显示各种数据的图表。用户可以单击图表(第一次单击),鼠标移动到任何地方都会绘制一个框。第二次单击时,所选区域将成为图表的新边界(放大)。

我通过在图表的绘制事件中绘制 4 条线来做到这一点,并在每次鼠标移动时调用 chart.invalidate 来强制绘制事件。

它在少于 1000 个数据点的情况下工作得非常好,但是通过它变得相当滞后。我想知道是否有一种方法可以做到这一点,而无需在每次移动鼠标时都重新绘制图表(因为我认为这是问题所在)

我也尝试过使用自定义“浮动线”来绘制表单上的所有控件(包括图表),但我遇到了幽灵线(想想:快速移动 Windows XP 窗口)。我认为这是不断移动线路位置不可避免的错误。

感谢任何想法/想法。

重绘代码:

Private Sub Chart1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles      Chart1.Paint
    Dim arbitraryPen As New Pen(Brushes.Black, 1)
    e.Graphics.DrawLine(arbitraryPen, point1.x, point1.y, point2.x, point1.y)
    e.Graphics.DrawLine(arbitraryPen, point1.x, point1.y, point1.x, point2.y)
    e.Graphics.DrawLine(arbitraryPen, point1.x, point2.y, point2.x, point2.y)
    e.Graphics.DrawLine(arbitraryPen, point2.x, point1.y, point2.x, point2.y)
    arbitraryPen.Dispose()
End Sub

【问题讨论】:

  • 不确定为什么这被标记为C#。删除标签。

标签: vb.net charts line paint


【解决方案1】:

我以前遇到过这种情况。我的解决方案是在MouseDown 事件(保存图表的容器)中创建图表的图像,并将其添加到图表顶部的窗口中。在MouseMove 事件中,我像你一样画线 - 但没有调用chart.Invalidate()。在MouseUp 事件中,我删除了图表的图像,并执行了缩放。这有点骇人听闻,但我发现在处理这些图表中的大量数据点时,很多事情都是这种情况。

用于创建图像并显示它的 ETA 代码

    private void CreateImagePanel()
    {
        Bitmap image = new Bitmap(Chart.Width, Chart.Height);
        Chart.DrawToBitmap(image, Chart.ClientRectangle);

        Panel panel = new Panel();
        SetDoubleBuffered(panel);
        panel.BackgroundImage = image;
        panel.Width = Chart.Width;
        panel.Height = Chart.Height;
        panel.Location = Chart.Location;
        panel.Paint += PaintRectangle;
        panel.Name = "imagePanel";
        _imagePanel = panel;

        Chart.Parent.Controls.Add(panel);
        panel.BringToFront();
    }

_imagePanel 是该类的私有成员,因此可以轻松移除面板。 SetDoubleBuffered 是另一个私有方法,可以很容易地修改为扩展方法:

    private void SetDoubleBuffered(Control c)
    {
        if (SystemInformation.TerminalServerSession) return;
        PropertyInfo property = typeof(Control).
            GetProperty("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance);
        property.SetValue(c, true, null);
    }

图像面板的PaintRectangle 事件被处理为仅绘制选择矩形。在MouseMove 事件中,图像面板是Invalidated,强制重绘面板和矩形。私有属性用于存储矩形的边界。

【讨论】:

  • 我真的很喜欢这个解决方案...你能提供更多细节吗?您是如何创建图像以及如何显示它的?
  • 完美的解释。工作出色。感谢您的帮助,我会在获得声誉后立即对答案进行投票(我是新来的)。谢谢!
猜你喜欢
  • 2019-01-04
  • 1970-01-01
  • 2013-07-14
  • 2012-06-13
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
相关资源
最近更新 更多