İngilizce dilinde oku

Aracılığıyla paylaş


BufferedGraphics Sınıf

Tanım

Çift arabelleğe alma için bir grafik arabelleği sağlar.

C#
public sealed class BufferedGraphics : IDisposable
Devralma
BufferedGraphics
Uygulamalar

Örnekler

Aşağıdaki kod örneği, çeşitli arabellek uygulama türlerini kullanarak grafik çizmek için bir BufferedGraphics nesne kullanmayı gösterir. Forma tıklamak, çizim güncelleştirmelerine neden olan bir zamanlayıcıyı alternatif olarak başlatır ve durdurur. Çizim güncelleştirmeleri, çift arabelleğe almanın etkisini gözlemlemenize olanak sağlar. Forma sağ tıklanması aşağıdaki çizim modlarında döngü yapar:

Her modda, geçerli modu tanımlayan ve her fare düğmesine basıldığında oluşan davranışı açıklayan metin çizilir.

C#
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace BufferingExample
{
    public class BufferingExample : Form
    {
        private BufferedGraphicsContext context;
        private BufferedGraphics grafx;

    private byte bufferingMode;
    private string[] bufferingModeStrings =
        { "Draw to Form without OptimizedDoubleBufferring control style",
          "Draw to Form using OptimizedDoubleBuffering control style",
          "Draw to HDC for form" };

    private System.Windows.Forms.Timer timer1;
    private byte count;

        public BufferingExample() : base()
        {
            // Configure the Form for this example.
            this.Text = "User double buffering";
            this.MouseDown += new MouseEventHandler(this.MouseDownHandler);
            this.Resize += new EventHandler(this.OnResize);
            this.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true );

            // Configure a timer to draw graphics updates.
        timer1 = new System.Windows.Forms.Timer();
        timer1.Interval = 200;
        timer1.Tick += new EventHandler(this.OnTimer);

        bufferingMode = 2;
        count = 0;

            // Retrieves the BufferedGraphicsContext for the
            // current application domain.
            context = BufferedGraphicsManager.Current;

            // Sets the maximum size for the primary graphics buffer
            // of the buffered graphics context for the application
            // domain.  Any allocation requests for a buffer larger
            // than this will create a temporary buffered graphics
            // context to host the graphics buffer.
            context.MaximumBuffer = new Size(this.Width+1, this.Height+1);

            // Allocates a graphics buffer the size of this form
            // using the pixel format of the Graphics created by
            // the Form.CreateGraphics() method, which returns a
            // Graphics object that matches the pixel format of the form.
            grafx = context.Allocate(this.CreateGraphics(),
                 new Rectangle( 0, 0, this.Width, this.Height ));

        // Draw the first frame to the buffer.
        DrawToBuffer(grafx.Graphics);
        }

    private void MouseDownHandler(object sender, MouseEventArgs e)
        {
        if( e.Button == MouseButtons.Right )
        {
                 // Cycle the buffering mode.
             if( ++bufferingMode > 2 )
                     bufferingMode = 0;

                 // If the previous buffering mode used
                 // the OptimizedDoubleBuffering ControlStyle,
                 // disable the control style.
                 if( bufferingMode == 1 )
                     this.SetStyle( ControlStyles.OptimizedDoubleBuffer, true );

                 // If the current buffering mode uses
                 // the OptimizedDoubleBuffering ControlStyle,
                 // enabke the control style.
                 if( bufferingMode == 2 )
                     this.SetStyle( ControlStyles.OptimizedDoubleBuffer, false );

                 // Cause the background to be cleared and redraw.
                 count = 6;
                 DrawToBuffer(grafx.Graphics);
         this.Refresh();
        }
        else
        {
                // Toggle whether the redraw timer is active.
        if( timer1.Enabled )
            timer1.Stop();
        else
            timer1.Start();
        }
        }

    private void OnTimer(object sender, EventArgs e)
    {
            // Draw randomly positioned ellipses to the buffer.
        DrawToBuffer(grafx.Graphics);

            // If in bufferingMode 2, draw to the form's HDC.
        if( bufferingMode == 2 )
                    // Render the graphics buffer to the form's HDC.
            grafx.Render(Graphics.FromHwnd(this.Handle));
            // If in bufferingMode 0 or 1, draw in the paint method.
        else
            this.Refresh();
    }

        private void OnResize(object sender, EventArgs e)
        {
           // Re-create the graphics buffer for a new window size.
           context.MaximumBuffer = new Size(this.Width+1, this.Height+1);
           if( grafx != null )
           {
           grafx.Dispose();
               grafx = null;
           }
           grafx = context.Allocate(this.CreateGraphics(),
               new Rectangle( 0, 0, this.Width, this.Height ));

           // Cause the background to be cleared and redraw.
           count = 6;
           DrawToBuffer(grafx.Graphics);
       this.Refresh();
        }	

    private void DrawToBuffer(Graphics g)
    {
            // Clear the graphics buffer every five updates.
        if( ++count > 5 )
            {
                count = 0;
                grafx.Graphics.FillRectangle(Brushes.Black, 0, 0, this.Width, this.Height);
            }

            // Draw randomly positioned and colored ellipses.
        Random rnd = new Random();
        for( int i=0; i<20; i++ )
        {
        int px = rnd.Next(20,this.Width-40);
        int py = rnd.Next(20,this.Height-40);
        g.DrawEllipse(new Pen(Color.FromArgb(rnd.Next(0, 255), rnd.Next(0,255), rnd.Next(0,255)), 1),
            px, py, px+rnd.Next(0, this.Width-px-20), py+rnd.Next(0, this.Height-py-20)); 	    			
        }

            // Draw information strings.
        g.DrawString("Buffering Mode: "+bufferingModeStrings[bufferingMode], new Font("Arial", 8), Brushes.White, 10, 10);
            g.DrawString("Right-click to cycle buffering mode", new Font("Arial", 8), Brushes.White, 10, 22);
            g.DrawString("Left-click to toggle timed display refresh", new Font("Arial", 8), Brushes.White, 10, 34);
    }

    protected override void OnPaint(PaintEventArgs e)
        {
        grafx.Render(e.Graphics);
    }

        [STAThread]
        public static void Main(string[] args)
        {
        Application.Run(new BufferingExample());
        }
    }
}

Açıklamalar

sınıfı, BufferedGraphics grafikleriniz için özel çift arabelleğe alma uygulamanızı sağlar. Grafik arabelleği için bir sarmalayıcı ve arabelleğe yazmak ve içeriğini bir çıkış cihazına işlemek için kullanabileceğiniz yöntemler sağlar.

Çift arabelleğe alma kullanan grafikler, ekran yüzeyinin yeniden çizilmesi nedeniyle oluşan titreşimi azaltabilir veya ortadan kaldırabilir. Çift arabelleğe alma kullandığınızda, güncelleştirilmiş grafikler önce bellekteki bir arabelleğe çekilir ve bu arabelleğin içeriği görüntülenen yüzeyin bir kısmına veya tümüne hızla yazılır. Görüntülenen grafiklerin bu görece kısa üzerine yazma işlemi genellikle grafikler güncelleştirildiğinde oluşan titreşimi azaltır veya ortadan kaldırır.

Not

.NET 6 ve sonraki sürümlerde, bu türü içeren System.Drawing.Common paketi yalnızca Windows işletim sistemlerinde desteklenir. Platformlar arası uygulamalarda bu türün kullanılması derleme zamanı uyarılarına ve çalışma zamanı özel durumlarına neden olur. Daha fazla bilgi için bkz . System.Drawing.Common yalnızca Windows'ta desteklenir.

Not

Çift arabelleğe almayı kullanmanın en basit yolu, yöntemini kullanarak bir denetimde denetim stili bayrağını ayarlamaktır OptimizedDoubleBufferSetStyle . Denetimin bayrağını OptimizedDoubleBuffer ayarlamak, denetime yönelik tüm boyamayı ek kod gerektirmeden varsayılan grafik arabelleği aracılığıyla yeniden yönlendirir. Bu bayrak varsayılan olarak olarak true ayarlanır.

Sınıfın BufferedGraphics ortak oluşturucu yok ve yöntemi kullanılarak Allocate bir uygulama etki alanı için tarafından BufferedGraphicsContext oluşturulması gerekir. Statik özelliğinden BufferedGraphicsManager.Current geçerli uygulama etki alanı için değerini alabilirsinizBufferedGraphicsContext.

Graphics özelliği grafik arabelleğine çizim yapmak için kullanılabilir. Bu özellik, bu BufferedGraphics nesne için Graphics ayrılan grafik arabelleğine çizen nesneye erişim sağlar.

Render Bağımsız değişken içermeyen yöntemi, grafik arabelleğinin içeriğini arabellek ayrıldığında belirtilen yüzeye çeker. yönteminin Render diğer aşırı yüklemeleri, grafik arabelleğinin içeriğinin çizildiği bir cihaz bağlamını işaret eden bir nesne veya IntPtr nesne belirtmenize Graphics olanak sağlar.

Çift arabelleğe alınan grafikler çizme hakkında daha fazla bilgi için bkz. Çift Arabelleğe Alınan Grafikler.

Özellikler

Graphics

Grafik arabelleğine çıkış veren bir Graphics nesne alır.

Yöntemler

Dispose()

nesnesi tarafından BufferedGraphics kullanılan tüm kaynakları serbest bırakır.

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

(Devralındığı yer: Object)
Finalize()

Bir nesnenin atık toplama tarafından geri kazanılmadan önce kaynakları boşaltmaya ve diğer temizleme işlemlerini gerçekleştirmeye çalışmasına izin verir.

GetHashCode()

Varsayılan karma işlevi işlevi görür.

(Devralındığı yer: Object)
GetType()

Type Geçerli örneğini alır.

(Devralındığı yer: Object)
MemberwiseClone()

Geçerli Objectöğesinin sığ bir kopyasını oluşturur.

(Devralındığı yer: Object)
Render()

Grafik arabelleğinin içeriğini varsayılan cihaza yazar.

Render(Graphics)

Grafik arabelleğinin içeriğini belirtilen Graphics nesneye yazar.

Render(IntPtr)

Grafik arabelleğinin içeriğini belirtilen IntPtr tanıtıcıyla ilişkilendirilmiş cihaz bağlamı için yazar.

ToString()

Geçerli nesneyi temsil eden dizeyi döndürür.

(Devralındığı yer: Object)

Şunlara uygulanır

Ürün Sürümler
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9

İş Parçacığı Güvenliği

BufferedGraphics Sınıfı iş parçacığı güvenli değil. Ayrı iş parçacıklarından bir grafik arabelleğine erişirken, çakışmaları önlemek için bir iş parçacığı erişim denetim mekanizması kullanmak önemlidir.

Ayrıca bkz.