Aracılığıyla paylaş


Kontroller üzerinde boyama ve çizim

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 kullanırsınız.

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

Mevcut bir denetim için yeni bir denetim oluşturmadan özel render sağlamak istiyorsanız, denetim üzerine çizim yapabilmenizi sağlayan Paint olayını işleyebilirsiniz.

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ı serbest bırakma süreci.

Denetim tarafından sağlanan çizim

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

Paint olayının veri sınıfı, PaintEventArgs olayında bir denetim çizmek için gereken verileri, yani grafik nesnesinin tanıtıcısı ve çizelecek bölgeyi temsil eden bir dikdörtgeni 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, denetimin ClipRectangle özelliğini kullanarak ClipRectangle hesaplayabilir, bu makalede daha sonra tartışılan geometri konusunda açıklandığı gibi.

OnPaint

Bir denetimin OnPaint öğesinden devraldığı Control yöntemini geçersiz kılarak işleme mantığı sağlaması gerekir. OnPaint, kendisine geçirilen Graphics örneğinin ClipRectangle ve PaintEventArgs özellikleri aracılığıyla bir grafik nesnesine ve çizim yapılacak bir dikdörtgene 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

Temel sınıfın OnPaint yöntemi herhangi bir çizim işlevi uygulamaz, sadece Control olayına kaydedilen olay temsilcilerini çağırır. Geçersiz kıldığınızda OnPaint, kayıtlı temsilcilerin OnPaint olayını alabilmesi 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.

Uyarı

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. Invalidate yöntemi sırayla OnPaint öğesini çağırır. Invalidate yöntemi aşırı yüklenmiştir ve için sağlanan bağımsız değişkenlere Invalidateebağlı olarak ekran alanının bir bölümünü veya tamamını yeniden çizer.

Denetiminizin OnPaint yöntemindeki kod, denetim ilk çizildiğinde ve 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 için yararlı olan OnPaintBackground yöntemini 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ğinizde OnPaintBackground öğesini çağırmak isteyebilirsiniz.

Olay benzeri bir sıfata sahip olsa ve yöntemiyle aynı bağımsız değişkeni OnPaintBackground alırsaOnPaint, OnPaintBackground gerçek bir olay yöntemi değildir. Olay yoktur PaintBackground ve OnPaintBackground olay temsilcilerini çağırmaz. OnPaintBackground yöntemini geçersiz kılarken, türetilmiş bir sınıfın temel sınıfının OnPaintBackground yöntemini çağırması 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 görüntüsünün 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 olabilir. Bu gibi durumlarda, bir denetim geliştiricisinin çizim yapmak için gerçek dikdörtgeni hesaplaması ve bunu Invalidate öğesine geçirmesi gerekir. bir veya Invalidate bağımsız değişkeni olarak alan Rectangle aşırı yüklenmiş sürümleriRegion, özelliğini ClipRectangleoluşturmak PaintEventArgs 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 türün bir örneğini oluşturursanız, işiniz bittiğinde kaynakları boşaltmak için Dispose yöntemini çağırın.

Ayrıca bakınız

Özel denetimler