Мой Kbyte.Ru
Рассылка Kbyte.Ru
Группы на Kbyte.Ru
Партнеры Kbyte.Ru
Реклама
Сделано руками
Сделано руками
> Исходные коды - Мэтью Макдональд -

C# - Графика

Все примеры / Мультимедиа / Графика

Двойная буферизация - наглядный пример

Автор: Мэтью Макдональд | добавлено: 10.01.2011, 18:36 | просмотров: 7756 (1+) | комментариев: 0 | рейтинг: *x6
Наглядный пример использования двойной буферизации при прорисовке графической информации на форме для исключения эффекта мерцания изображения.

Код

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

/// <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();
    }

  }
}
Файлы Двойная буферизация - наглядный пример.zip (25,67 Кб)
Об авторе

Мэтью Макдональд

Нет информации об авторе...
Мэтью Макдональд
Другие примеры этого автора (всего: 4)
Последние комментарии (всего: 0)

Добавлять комментарии могут только зарегистрированные пользователи сайта.
Если у Вас уже есть учетная запись на Kbyte.Ru, пройдите процедуру авторизации OpenID.
Если Вы еще не зарегистрированы на Kbyte.Ru - зарегистрируйтесь.


Нет комментариев...

Авторизация
 
OpenID
Зарегистрируйся и получи 10% скидку на добавление своего сайта в каталоги! Подробнее »
Поиск по сайту
Реклама
Счетчики