Double Buffering : Double Buffer « 2D Graphics « C# / C Sharp






Double Buffering

Double Buffering
/*
User Interfaces in C#: Windows Forms and Custom Controls
by Matthew MacDonald

Publisher: Apress
ISBN: 1590590457
*/
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace GDI_Basics
{
    /// <summary>
    /// Summary description for DoubleBuffering.
    /// </summary>
    public class DoubleBuffering : System.Windows.Forms.Form
    {
        internal System.Windows.Forms.CheckBox chkDoubleBuffer;
        internal System.Windows.Forms.Timer tmrRefresh;
        private System.ComponentModel.IContainer components;

        public DoubleBuffering()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.chkDoubleBuffer = new System.Windows.Forms.CheckBox();
            this.tmrRefresh = new System.Windows.Forms.Timer(this.components);
            this.SuspendLayout();
            // 
            // chkDoubleBuffer
            // 
            this.chkDoubleBuffer.BackColor = System.Drawing.Color.PaleTurquoise;
            this.chkDoubleBuffer.Location = new System.Drawing.Point(8, 8);
            this.chkDoubleBuffer.Name = "chkDoubleBuffer";
            this.chkDoubleBuffer.Size = new System.Drawing.Size(336, 16);
            this.chkDoubleBuffer.TabIndex = 1;
            this.chkDoubleBuffer.Text = "Use Double Buffering";
            // 
            // tmrRefresh
            // 
            this.tmrRefresh.Interval = 10;
            this.tmrRefresh.Tick += new System.EventHandler(this.tmrRefresh_Tick);
            // 
            // DoubleBuffering
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 14);
            this.ClientSize = new System.Drawing.Size(376, 294);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.chkDoubleBuffer});
            this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
            this.Name = "DoubleBuffering";
            this.Text = "DoubleBuffering";
            this.Load += new System.EventHandler(this.DoubleBuffering_Load);
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.DoubleBuffering_Paint);
            this.ResumeLayout(false);

        }
        #endregion


        private bool isShrinking = false;
        private int extraSize = 0;


        private void tmrRefresh_Tick(object sender, System.EventArgs e)
        {
            // Change the circle dimensions.
            
            if (isShrinking)
            {
                extraSize--;
            }
            else
            {
                extraSize++;
            }
            
            // Change the sizing direction if needed.
            if (extraSize > (this.Width - 150))
            {
                isShrinking = true;
            }
            else if (extraSize < 1)
            {
                isShrinking = false;
            }
            
            // Repaint the form.
            this.Invalidate();

        }

        
        protected override void OnPaintBackground(
            System.Windows.Forms.PaintEventArgs pevent)
        {
            // Do nothing.
        }


        [STAThread]
        static void Main() 
        {
            Application.Run(new DoubleBuffering());
        }

        private void DoubleBuffering_Load(object sender, System.EventArgs e)
        {
            tmrRefresh.Start();
        }

        private void DoubleBuffering_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            Graphics g;
            Bitmap drawing = null;

            // Check if double buffering is needed, and assign the GDI+ context.
            if (chkDoubleBuffer.Checked)
            {
                drawing = new Bitmap(this.Width, this.Height, e.Graphics);
                g = Graphics.FromImage(drawing);
            }
            else
            {
                g = e.Graphics;
            }

            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            // Draw a rectangle.
            Pen drawingPen = new Pen(Color.Black, 10);
            g.FillRectangle(Brushes.PaleTurquoise , new Rectangle(new Point(0, 0),
                this.ClientSize));
            g.DrawEllipse(drawingPen, 50, 50, 50 + extraSize, 50 + extraSize);

            // If using double buffering, render the final image and dispose of it.
            if (chkDoubleBuffer.Checked)
            {
                e.Graphics.DrawImageUnscaled(drawing, 0, 0);
                g.Dispose();
            }

        }
    }
}



           
       








Related examples in the same category

1.Double buffer drawDouble buffer draw