Double buffering with Panel

后端 未结 3 1028
谎友^
谎友^ 2020-12-01 17:53

Double buffering the whole form can be done by setting the value of the \"AllPaintingInWmPaint\", \"UserPaint\" and \"DoubleBuffer\" ControlStyles to \"true\" (this.Se

相关标签:
3条回答
  • 2020-12-01 18:01

    I should have posted my solution a long time ago...

    Well, here is my solution:

    Bitmap buffer = new Bitmap(screenWidth, screenHeight);//set the size of the image
    System.Drawing.Graphics gfx = Graphics.FromImage(buffer);//set the graphics to draw on the image
    drawStuffWithGraphicsObject(gfx);//draw
    pictureBox1.Image = buffer;//set the PictureBox's image to be the buffer
    

    Makes me feel like a complete idiot for finding this solution years after asking this question.

    I have tried this with a Panel, but it has proven to be slower when applying the new image. Somewhere I had read, that it is better to use Panel instead of PictureBox. I don't know if I have to add something to the code to speed things up for the Panel, though.

    0 讨论(0)
  • 2020-12-01 18:10

    Use a PictureBox if you don't need scrolling support, it is double-buffered by default. Getting a double-buffered scrollable panel is easy enough:

    using System;
    using System.Windows.Forms;
    
    class MyPanel : Panel {
        public MyPanel() {
            this.DoubleBuffered = true;
            this.ResizeRedraw = true;
        }
    }
    

    The ResizeRedraw assignment suppresses a painting optimization for container controls. You'll need this if you do any painting in the panel. Without it, the painting smears when you resize the panel.

    Double-buffering actually makes painting slower. Which can have an effect on controls that are drawn later. The hole they leave before being filled may be visible for a while, also perceived as flicker. You'll find counter-measures against the effect in this answer.

    0 讨论(0)
  • 2020-12-01 18:18

    If acceptable you can stop refreshing the panel while resizing and enable it again after, this way you get rid of the ugly flickering.

    0 讨论(0)
提交回复
热议问题