how to stop flickering C# winforms

前端 未结 16 2389
故里飘歌
故里飘歌 2020-11-28 04:16

I have a program that is essentially like a paint application. However, my program has some flickering issues. I have the following line in my code (which should get rid of

16条回答
  •  甜味超标
    2020-11-28 04:39

    Double buffering is not going to be of much help here I'm afraid. I ran into this a while ago and ended up adding a separate panel in a rather clumsy way but it worked for my application.

    Make the original panel that you have ( panelArea ) a transparent area, and put it on top of a 2nd panel, which you call panelDraw for example. Make sure to have panelArea in front. I whipped this up and it got rid of the flickering, but left the shape that was being drawn smeared out so it's not a full solution either.

    A transparent panel can be made by overriding some paint actions from the original panel:

    public class ClearPanel : Panel
    {
        public ClearPanel(){}
    
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams createParams = base.CreateParams;
                createParams.ExStyle |= 0x00000020;
                return createParams;
            }
        }
    
        protected override void OnPaintBackground(PaintEventArgs e){}
    }
    

    The idea is to handle drawing the temporary shape during the MouseMove event of the 'panelArea' and ONLY repaint the 'panelDraw' on the MouseUp Event.

    // Use the panelDraw paint event to draw shapes that are done
    void panelDraw_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = panelDraw.CreateGraphics();
    
        foreach (Rectangle shape in listOfShapes)
        {
            shape.Draw(g);
        }
    }
    
    // Use the panelArea_paint event to update the new shape-dragging...
    private void panelArea_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = panelArea.CreateGraphics();
    
        if (drawSETPaint == true)
        {
            Pen p = new Pen(Color.Blue);
            p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
    
            if (IsShapeRectangle == true)
            {
                g.DrawRectangle(p, rect);
            }
            else if (IsShapeCircle == true)
            {
                g.DrawEllipse(p, rect);
            }
            else if (IsShapeLine == true)
            {
                g.DrawLine(p, startPoint, endPoint);
            }
        }
    }
    
    private void panelArea_MouseUp(object sender, MouseEventArgs e)
    {
    
        endPoint.X = e.X;
        endPoint.Y = e.Y;
    
        drawSETPaint = false;
    
        if (rect.Width > 0 && rect.Height > 0)
        {
            if (IsShapeRectangle == true)
            {
                listOfShapes.Add(new TheRectangles(rect, currentColor, currentBoarderColor, brushThickness));
            }
            else if (IsShapeCircle == true)
            {
                listOfShapes.Add(new TheCircles(rect, currentColor, currentBoarderColor, brushThickness));
            }
            else if (IsShapeLine == true)
            {
                listOfShapes.Add(new TheLines(startPoint, endPoint, currentColor, currentBoarderColor, brushThickness));
            }
    
            panelArea.Invalidate();
        }
    
        panelDraw.Invalidate();
    }
    

提交回复
热议问题