Csharp/C Sharp/2D Graphics/Double Buffer

Материал из .Net Framework эксперт
Версия от 11:41, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Double buffer draw

using System;
using System.Drawing;
using System.Collections;
using System.ruponentModel;
using System.Windows.Forms;
using System.Data;
public class Form1 : System.Windows.Forms.Form {
   private System.ruponentModel.Container components = null;
   public Form1() {
      InitializeComponent();
   }
   protected override void Dispose( bool disposing ) {
      if( disposing ) {
         if (components != null) {
            components.Dispose();
         }
      }
      base.Dispose( disposing );
   }
   private void InitializeComponent() {
      this.ruponents = new System.ruponentModel.Container();
      this.Size = new System.Drawing.Size(300,300);
      this.Text = "Form1";
   }
   static void Main() {
      Application.Run(new Form1());
   }
   protected override void OnPaint(PaintEventArgs e) {
      Graphics displayGraphics = e.Graphics;
      Random r = new Random();
      Image i = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
      Graphics g = Graphics.FromImage(i);
      g.FillRectangle(Brushes.White, ClientRectangle);
      for (int x = 0; x < ClientRectangle.Width; x++) {
         for (int y = 0; y < ClientRectangle.Height; y += 10) {
            Color c = Color.FromArgb (r.Next(25), r.Next(55), r.Next(5));
            Pen p = new Pen(c, 1);
            g.DrawLine(p, new Point(ClientRectangle.Width/2, ClientRectangle.Height/2), new Point(x, y));
            p.Dispose();
         }
      }
      displayGraphics.DrawImage(i, ClientRectangle);
      i.Dispose();
  }
}


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.ruponentModel;
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.ruponentModel.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.ruponents = new System.ruponentModel.Container();
            this.chkDoubleBuffer = new System.Windows.Forms.CheckBox();
            this.tmrRefresh = new System.Windows.Forms.Timer(this.ruponents);
            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();
            }
        }
    }
}