在picturebox滞后中重新绘制位图



我有一个应用程序,可以在其中绘制一些形状,通过顶点捕捉它们并移动垂直线。我将形状的顶点存储在List中,并在分配给PictureBox.Image的位图中重新绘制整个对象列表(当垂直线被捕获并鼠标移动时)。当我添加5个以上的形状时,移动的垂直线是滞后的。这里有一段代码:

    private void DrawFullList()
    {
        if (pictureBox2.Image != null)
        {
            pictureBox2.Image.Dispose();
            g.Dispose();
        }
        graphic = new Bitmap(pictureBox2.Width, pictureBox2.Height);
        g = Graphics.FromImage(graphic);
        pictureBox2.Image = graphic;
        for (int i = 0; i < PointsList.Count; i++)
            Draw(BrushList[i], PointsList[i]);
    }
    private void Draw(Brush brush, Point[] points)
    {
        Pen PathPen = new Pen(brush);
        PathPen.Width = 3;
        if (points.Length == 2)
            g.DrawLine(PathPen, points[0], points[1]);
        else
            g.FillPolygon(brush,points);
        pictureBox2.Image = graphic;
    }

如果有什么可以改进的?我尝试graphic.Clear(Color.Transparent),但无法更改位图的大小(调整窗口大小时使用该函数)。

有什么建议吗?

我发现了一个简单的错误,实际上是什么造成了滞后。pictureBox2.Image = graphic;被连续执行两次,而PointsList.Count != 0正在创建滞后。

您的代码看起来过于复杂且无效。此外,您的代码过于依赖垃圾收集器(最好在使用后立即处理GraphicsBrushPen类)。

我认为在您的情况下,最好的想法是避免完全创建和处理位图。例如,您可以用Panel类替换PictureBox,订阅其Paint事件,并在此方法中绘制形状。当顶点的位置发生变化时,只需调用Invalidate方法即可重新绘制面板内的形状。

最新更新