Denetimlerde boyama ve çizim (Windows Forms .NET)

Denetimlerin özel olarak boyanabilmesi, Windows Forms'un kolaylaştırdığı birçok karmaşık görevden biridir. Özel denetim yazarken, denetiminizin grafik görünümünü işlemek için kullanabileceğiniz birçok seçenek vardır. Özel bir denetim, yani öğesinden Controldevralan bir denetim yazarsanız, grafik gösterimini işlemek için kod sağlamanız gerekir.

Bileşik bir denetim oluşturuyorsanız ( bu, mevcut Windows Forms denetimlerinden UserControl veya bunlardan birinden devralınan bir denetimdir), standart grafik gösterimini geçersiz kılabilir ve kendi grafik kodunuzu sağlayabilirsiniz.

Yeni denetim oluşturmadan mevcut bir denetim için özel işleme sağlamak istiyorsanız seçenekleriniz daha sınırlı hale gelir. Ancak, denetimleriniz ve uygulamalarınız için hala çok çeşitli grafik olasılıkları vardır.

Denetim işlemede aşağıdaki öğeler yer almaktadır:

  • temel sınıfı System.Windows.Forms.Controltarafından sağlanan çizim işlevi.
  • GDI grafik kitaplığının temel öğeleri.
  • Çizim bölgesinin geometrisi.
  • Grafik kaynaklarını boşaltma yordamı.

Denetim tarafından sağlanan çizim

Temel sınıf Control , olayı aracılığıyla Paint çizim işlevi sağlar. Denetim, görüntüsünü güncelleştirmesi Paint gerektiğinde olayı tetikler. .NET'teki olaylar hakkında daha fazla bilgi için bkz . Olayları işleme ve oluşturma.

olayının Paint olay veri sınıfı, PaintEventArgsbir denetim çizmek için gereken verileri (grafik nesnesinin tanıtıcısı ve çizecek bölgeyi temsil eden bir dikdörtgen) tutar.

public class PaintEventArgs : EventArgs, IDisposable
{

    public System.Drawing.Rectangle ClipRectangle {get;}
    public System.Drawing.Graphics Graphics {get;}

    // Other properties and methods.
}
Public Class PaintEventArgs
    Inherits EventArgs
    Implements IDisposable

    Public ReadOnly Property ClipRectangle As System.Drawing.Rectangle
    Public ReadOnly Property Graphics As System.Drawing.Graphics

    ' Other properties and methods.
End Class

Graphics , bu makalenin devamında GDI tartışmasında açıklandığı gibi çizim işlevselliğini kapsülleyen bir yönetilen sınıftır. ClipRectangle, yapının bir örneğidir Rectangle ve bir denetimin çizebileceği kullanılabilir alanı tanımlar. Denetim geliştiricisi, bu makalenin ClipRectangle ClipRectangle devamında geometri tartışmasında açıklandığı gibi denetimin özelliğini kullanarak işlemini hesaplayabilir.

OnPaint

Denetimin öğesinden Controldevraldığı yöntemi geçersiz kılarak OnPaint işleme mantığı sağlaması gerekir. OnPaint bir grafik nesnesine ve içinde çizilecek Graphics ClipRectangle bir dikdörtgene ve geçirilen örneğin özelliklerine PaintEventArgs erişir.

Aşağıdaki kod ad alanını System.Drawing kullanır:

protected override void OnPaint(PaintEventArgs e)
{
    // Call the OnPaint method of the base class.
    base.OnPaint(e);

    // Declare and instantiate a new pen that will be disposed of at the end of the method.
    using var myPen = new Pen(Color.Aqua);

    // Create a rectangle that represents the size of the control, minus 1 pixel.
    var area = new Rectangle(new Point(0, 0), new Size(this.Size.Width - 1, this.Size.Height - 1));

    // Draw an aqua rectangle in the rectangle represented by the control.
    e.Graphics.DrawRectangle(myPen, area);
}
Protected Overrides Sub OnPaint(e As PaintEventArgs)
    MyBase.OnPaint(e)

    ' Declare and instantiate a drawing pen.
    Using myPen = New System.Drawing.Pen(Color.Aqua)

        ' Create a rectangle that represents the size of the control, minus 1 pixel.
        Dim area = New Rectangle(New Point(0, 0), New Size(Me.Size.Width - 1, Me.Size.Height - 1))

        ' Draw an aqua rectangle in the rectangle represented by the control.
        e.Graphics.DrawRectangle(myPen, area)

    End Using
End Sub

OnPaint Temel Control sınıfın yöntemi herhangi bir çizim işlevi uygulamaz, yalnızca olayla Paint kaydedilen olay temsilcilerini çağırır. geçersiz kıldığınızda OnPaint, kayıtlı temsilcilerin OnPaint olayı alması için genellikle temel sınıfın Paint yöntemini çağırmanız gerekir. Ancak tüm yüzeylerini boyayen denetimler, temel sınıfın OnPaintöğesini çağırmamalıdır çünkü bu da titremeye neden olur.

Not

Doğrudan denetiminizden çağırmayın OnPaint ; bunun yerine yöntemini Invalidate (öğesinden devralınan Control) veya çağıran başka bir yöntemi çağırın Invalidate. yöntemi Invalidate de öğesini çağırır OnPaint. Invalidate yöntemi aşırı yüklenmiştir ve için sağlanan bağımsız değişkenlere Invalidate ebağlı olarak ekran alanının bir bölümünü veya tamamını yeniden çizer.

Denetiminizin yöntemindeki OnPaint kod, denetim ilk çizildiğinde ve her yenilendiğinde yürütülür. Denetiminizin yeniden boyutlandırıldığı her seferde yeniden çizildiğinden emin olmak için, denetiminizin oluşturucusna aşağıdaki satırı ekleyin:

SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.ResizeRedraw, True)

OnPaintBackground

Temel Control sınıf, çizim OnPaintBackground için yararlı olan yöntemi olan başka bir yöntemi tanımlar.

protected virtual void OnPaintBackground(PaintEventArgs e);
Protected Overridable Sub OnPaintBackground(e As PaintEventArgs)

OnPaintBackground pencerenin arka planını (ve bu şekilde şekli) boyar ve hızlı olması garanti edilirken OnPaint , ayrıntıları boyar ve tek tek boyama istekleri yeniden çizilmesi gereken tüm alanları kapsayan tek bir Paint olayda birleştirildiğinden daha yavaş olabilir. Örneğin, denetiminiz için gradyan renkli bir arka plan çizmek istediğiniz if öğesini çağırmak OnPaintBackground isteyebilirsiniz.

Olay benzeri bir sıfata sahip olsa ve yöntemiyle aynı bağımsız değişkeni OnPaint alırsaOnPaintBackground, OnPaintBackground gerçek bir olay yöntemi değildir. Olay yoktur PaintBackground ve OnPaintBackground olay temsilcilerini çağırmaz. yöntemi geçersiz kılınırken OnPaintBackground , temel sınıfının yöntemini çağırmak OnPaintBackground için türetilmiş bir sınıf gerekli değildir.

GDI+ Temel Bilgileri

Graphics sınıfı daireler, üçgenler, yaylar ve üç nokta gibi çeşitli şekiller çizmeye yönelik yöntemler ve metin görüntüleme yöntemleri sağlar. Ad System.Drawing alanı, şekiller (daireler, dikdörtgenler, yaylar ve diğerleri), renkler, yazı tipleri, fırçalar vb. gibi grafik öğelerini kapsülleyen ad alanları ve sınıflar içerir.

Çizim Bölgesinin Geometrisi

Denetimin ClientRectangle özelliği, kullanıcının ekranında denetimin kullanabileceği dikdörtgen bölgeyi belirtirken ClipRectangle , özelliği PaintEventArgs ise boyanan alanı belirtir. Denetimin küçük bir bölümü değiştiğinde olduğu gibi, denetimin kullanılabilir alanının yalnızca bir bölümünü boyaması gerekebilir. Bu gibi durumlarda, bir denetim geliştiricisinin içinde çizim yapmak ve bunu öğesine Invalidategeçirmek için gerçek dikdörtgeni hesaplaması gerekir. bir veya Region bağımsız değişkeni olarak alan Rectangle aşırı yüklenmiş sürümleriInvalidate, özelliğini PaintEventArgsoluşturmak ClipRectangle için bu bağımsız değişkeni kullanır.

Serbest Grafik Kaynakları

Grafik nesneleri sistem kaynaklarını kullandıklarından pahalıdır. Bu tür nesneler sınıfın System.Drawing.Graphics örneklerini ve System.Drawing.Brush, System.Drawing.Penve diğer grafik sınıflarını içerir. Grafik kaynağını yalnızca ihtiyacınız olduğunda oluşturmanız ve kullanmayı tamamladığınız anda serbest bırakmanız önemlidir. Arabirimi uygulayan IDisposable bir türün örneğini oluşturursanız, kaynakları boşaltmak için onunla işiniz bittiğinde yöntemini çağırın Dispose .

Ayrıca bkz.