Vb.net缩放/选择框的图表慢



我有一个显示各种数据的图表。用户可以点击图表(第一次点击),鼠标移动的地方就会出现一个框。在第二次点击时,所选区域将成为图表的新边界(放大)。

我通过在绘制事件中为图表绘制4条线,并调用chart来实现这一点。每次鼠标移动时无效,以强制绘制事件。

它在小于1000个数据点的情况下工作得很好,但超过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

我以前遇到过这种情况。我的解决方案是在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,强制重新绘制面板和矩形。私有属性用于存储矩形的边界。

最新更新