Windows Forms Denetimini İşleme

İşleme, kullanıcının ekranında görsel bir gösterim oluşturma işlemini ifade eder. Windows Forms, işleme için GDI (yeni Windows grafik kitaplığı) kullanır. GDI'ye erişim sağlayan yönetilen sınıflar ad alanında System.Drawing ve alt ad alanındadı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 İşlevleri

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 Framework'teki olaylar hakkında daha fazla bilgi için bkz . Olayları İşleme ve Oluşturma.

olayının Paint olay veri sınıfı, PaintEventArgsbir denetim çizmek için gereken verileri (grafik nesnesinin tutamacı ve çizecek bölgeyi temsil eden bir dikdörtgen nesnesi) tutar. Bu nesneler aşağıdaki kod parçasında kalın olarak gösterilir.

Public Class PaintEventArgs  
   Inherits EventArgs  
   Implements IDisposable  
  
   Public ReadOnly Property ClipRectangle() As System.Drawing.Rectangle  
      ...  
   End Property  
  
   Public ReadOnly Property Graphics() As System.Drawing.Graphics  
      ...  
   End Property  
   ' Other properties and methods.  
   ...  
End Class  
public class PaintEventArgs : EventArgs, IDisposable {  
public System.Drawing.Rectangle ClipRectangle {get;}  
public System.Drawing.Graphics Graphics {get;}  
// Other properties and methods.  
...  
}  

Graphics , bu konunun 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 konunun devamında geometri tartışmasında açıklandığı gibi denetimin özelliğini kullanarak ClipRectangle işlemini hesaplayabilirClipRectangle.

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

Protected Overridable Sub OnPaint(pe As PaintEventArgs)  
protected virtual void OnPaint(PaintEventArgs pe);  

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 boyayan denetimler temel sınıfın OnPaintöğesini çağırmamalıdır çünkü bu da titremeye neden olur. Olayı geçersiz kılma OnPaint örneği için bkz . Nasıl yapılır: İlerleme Durumunu Gösteren Bir Windows Forms Denetimi Oluşturma.

Dekont

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 Invalidateebağlı olarak bir denetim ekran alanının bir bölümünü veya tamamını yeniden çizer.

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

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

OnPaintBackground pencerenin arka planını (ve böylece şekli) boyar ve hızlı olacağı garanti edilirken OnPaint , ayrıntıları boyar ve tek tek boya istekleri yeniden çizilmesi gereken tüm alanları kapsayan 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 yok 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 çizmenin yanı sıra metin görüntüleme yöntemleri sağlar. Ad System.Drawing alanı ve alt ad alanları, şekiller (daireler, dikdörtgenler, yaylar ve diğerleri), renkler, yazı tipleri, fırçalar vb. gibi grafik öğelerini kapsülleyen sınıflar içerir. GDI hakkında daha fazla bilgi için bkz . Yönetilen Grafik Sınıflarını Kullanma. GDI'nin temelleri Nasıl yapılır: İlerlemeYi Gösteren Bir Windows Forms Denetimi Oluşturma bölümünde de açıklanmıştır.

Çizim Bölgesinin Geometrisi

Denetimin ClientRectangle özelliği, kullanıcının ekranında denetimin kullanabileceği dikdörtgen bölgeyi belirtirken ClipRectangle , özelliğinin özelliği PaintEventArgs aslında boyanmış olan alanı belirtir. (Boyama işleminin Paint bağımsız değişkeni olarak bir PaintEventArgs örneği alan olay yönteminde yapıldığını unutmayın). 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.

Aşağıdaki kod parçası, özel denetimin FlashTrackBar çizim yapmak için dikdörtgen alanı nasıl hesap dediğini gösterir. client değişkeni özelliğini belirtirClipRectangle. Tam bir örnek için bkz . Nasıl yapılır: İlerleme Durumunu Gösteren Bir Windows Forms Denetimi Oluşturma.

Rectangle invalid = new Rectangle(
    client.X + min,
    client.Y,
    max - min,
    client.Height);

Invalidate(invalid);
Dim invalid As Rectangle = New Rectangle( _
    client.X + lmin, _
    client.Y, _
    lmax - lmin, _
    client.Height)

Invalidate(invalid)

Serbest Grafik Kaynakları

Grafik nesneleri sistem kaynaklarını kullandıklarından pahalıdır. Bu tür nesneler sınıfın örneklerinin System.Drawing.Graphics yanı sıra , System.Drawing.Penve diğer grafik sınıflarını System.Drawing.Brushiç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. Arabirimini uygulayan IDisposable bir tür oluşturursanız, kaynakları boşaltmak için onunla işiniz bittiğinde yöntemini çağırın Dispose .

Aşağıdaki kod parçası, özel denetimin FlashTrackBar bir Brush kaynağı nasıl oluşturup serbest bıraktığı gösterir. Kaynak kodun tamamı için bkz . Nasıl yapılır: İlerleme Durumunu Gösteren Bir Windows Forms Denetimi Oluşturma.

private Brush baseBackground = null;
Private baseBackground As Brush
base.OnPaint(e);
if (baseBackground == null) {
    if (showGradient) {
        baseBackground = new LinearGradientBrush(new Point(0, 0),
                                                 new Point(ClientSize.Width, 0),
                                                 StartColor,
                                                 EndColor);
    }
    else if (BackgroundImage != null) {
        baseBackground = new TextureBrush(BackgroundImage);
    }
    else {
        baseBackground = new SolidBrush(BackColor);
    }
}
MyBase.OnPaint(e)

If (baseBackground Is Nothing) Then

    If (myShowGradient) Then
        baseBackground = New LinearGradientBrush(New Point(0, 0), _
                                                 New Point(ClientSize.Width, 0), _
                                                 StartColor, _
                                                 EndColor)
    ElseIf (BackgroundImage IsNot Nothing) Then
        baseBackground = New TextureBrush(BackgroundImage)
    Else
        baseBackground = New SolidBrush(BackColor)
    End If

End If
protected override void OnResize(EventArgs e) {
    base.OnResize(e);
    if (baseBackground != null) {
        baseBackground.Dispose();
        baseBackground = null;
    }
}
Protected Overrides Sub OnResize(ByVal e As EventArgs)
    MyBase.OnResize(e)
    If (baseBackground IsNot Nothing) Then
        baseBackground.Dispose()
        baseBackground = Nothing
    End If
End Sub

Ayrıca bkz.