Aracılığıyla paylaş


Özel denetim nedir?

Bu makalede özel denetimler tanıtılmaktadır ve bunların kullanıcı denetimlerinden ne kadar farklı olduğu açıklanmaktadır. Özel denetimler görsel bir tasarım yüzeyi sunmaz ve kullanıcı tarafından sağlanan kodu kullanarak kendilerini çizer. Bu, birden çok denetimi tek bir yeniden kullanılabilir ünitede gruplandırmak için görsel tasarım yüzeyi sağlayan kullanıcı denetimlerinden farklıdır.

Özel denetimler, mevcut bir denetim veya kullanıcı denetimi, ihtiyacınız olan kullanıcı arabirimini veya etkileşimi sağlamaya yakın olmadığında kullanılır. Tam olarak uygulamak için sizin için daha fazla çaba gerektirir. Klavye ve fare işlemleri hala Windows Forms tarafından sağlanır, ancak bazı davranışları uygulamak sizin sorumluluğunuzdadır. Özel denetimle sağlanan bir tasarım yüzeyi yoktur, çünkü tüm çizim yöntemindeki OnPaint kod aracılığıyla yapılır. gibi Timerbileşenler, görsel olmayan tasarım yüzeyi aracılığıyla eklenebilir.

Temel sınıf

Özel denetim oluştururken aralarından seçim yapabileceğiniz iki temel sınıf vardır:

  • System.Windows.Forms.Control

    Bu, diğer Windows Forms denetimleri tarafından kullanılan temel sınıfla aynıdır. Kontrolün giriş ve çıkışını doğrudan kontrol edersiniz.

  • System.Windows.Forms.ScrollableControl

    Bazı Windows Forms denetimleri bu temel sınıfı kullanır. Bu sınıf, içeriği kaydırma özelliğini ekleyerek genişletir Control .

Özel denetimin içeriğini kaydırmanız gerekmediği sürece temel sınıfınız olarak kullanın Control .

Devralınan özellikler

Özel denetimin temel sınıfı olduğundan Control, tüm denetimler tarafından paylaşılan Windows Forms işlevselliğini otomatik olarak devralırsınız. Özel denetimle elde ettiğiniz özelliklerden birkaçı şunlardır:

  • Klavye ve fare girişi.
  • Tutturma ve yerleştirme gibi düzen davranışları.
  • Sekme kullanımı için destek.
  • Minimum ve maksimum boyut kısıtlamaları.

Resim

Denetimin görselini çizmek olan boyama, OnPaint yöntemini geçersiz kılarak gerçekleştirilir. Daha fazla bilgi almak için denetimlerin boyama işlemleri hakkında bakınız: Denetimlerde boyama ve çizim.

Visual Studio şablonlarını kullanarak özel denetim oluşturduğunuzda, OnPaint yöntemi sizin için otomatik olarak geçersiz kılınabilir. Denetiminizi çizmek için kodu yazmanız gerektiğinden şablon bunu yapar. Şablonun ne oluşturduğuna ilişkin bir örnek aşağıda verilmiştir:

public partial class CustomControl1 : Control
{
    public CustomControl1()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
    }
}
Public Class CustomControl1

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)

        'Add your custom paint code here
    End Sub

End Class

OnPaint yöntemiyle özel bir denetim boyanır. Bu yöntemin tek bağımsız değişkeni, denetiminizi işlemek için gereken tüm bilgileri ve işlevleri sağlayan bir PaintEventArgs nesnedir. PaintEventArgs denetiminizi işlemek için kullanılan iki özellik sağlar:

  • PaintEventArgs.ClipRectangle—Denetimin yeniden çizilmesi gereken bölümünü temsil eder. Bu, denetimin tamamı veya denetimin bir parçası olabilir.

  • Graphics—Denetiminizin grafik yüzeyini temsil eder. Denetiminizi çizmek için gerekli işlevselliği sağlayan grafik odaklı çeşitli nesneler ve yöntemler sağlar.

Denetim ekranda her çizildiğinde veya yenilendiğinde OnPaint yöntemi çağrılır ve PaintEventArgs.ClipRectangle nesnesi, boyamanın gerçekleştiği dikdörtgeni temsil eder. Denetimin tamamının yenilenmesi gerekiyorsa, PaintEventArgs.ClipRectangle denetimin tamamının boyutunu temsil eder. Denetimin yalnızca bir bölümünün yenilenmesi gerekiyorsa, yalnızca yeniden çizilmesi gereken bölgeyi temsil eder. Bu tür bir durum, bir denetimin kullanıcı arabirimindeki başka bir denetim tarafından kısmen gizlenmesi ve o diğer denetimin taşınması sonucunda, alttaki denetimin yeniden açığa çıkan kısmının yeniden çizilmesi gerektiği bir durum olabilir.

Denetimdeki OnPaint yönteminde bulunan kod, denetim ilk çizildiğinde ve geçersiz hale getirildiğinde çalışır. Denetiminizin yeniden boyutlandırıldığı her seferde yeniden çizildiğinden emin olmak için, denetiminizin oluşturucusunun içine aşağıdaki satırı ekleyin:

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

Örnek

Aşağıdaki kod parçacığı, kontrolün kenarında birden çok renkli dikdörtgen çizen özel bir kontroldür.

protected override void OnPaint(PaintEventArgs pe)
{
    Rectangle rect = this.ClientRectangle;

    // Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
    // Otherwise, it kind of overlaps the outside edge.
    rect.Width -= 1;
    rect.Height -= 1;

    Pen[] colorPens = new Pen[] { Pens.Blue, Pens.BlueViolet,
                                  Pens.AliceBlue, Pens.CornflowerBlue,
                                  Pens.Cyan, Pens.DarkCyan };

    foreach (Pen pen in colorPens)
    {
        pe.Graphics.DrawRectangle(pen, rect);
        rect.Inflate(-1, -1);
    }

    // Raise the Paint event so users can custom paint if they want.
    base.OnPaint(pe);
}
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

    Dim rect As Rectangle = Me.ClientRectangle

    'Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
    'Otherwise, it kind of overlaps the outside edge.
    rect.Width -= 1
    rect.Height -= 1

    Dim colorPens As Pen() = {Pens.Blue, Pens.BlueViolet,
                                Pens.AliceBlue, Pens.CornflowerBlue,
                                Pens.Cyan, Pens.DarkCyan}

    For Each curPen As Pen In colorPens

        e.Graphics.DrawRectangle(curPen, rect)
        rect.Inflate(-1, -1)

    Next

    'Raise the Paint event so users can custom paint if they want.
    MyBase.OnPaint(e)

End Sub

Önceki kod aşağıdaki görüntüye benzer bir denetim oluşturur:

Visual Studio'da işlenen özel denetim. Denetim, kenarlıkları farklı renklerde olan boş bir kutudur. Her renk tek bir pikselle ayarlanır.

Arka plan

Kontrolün arka planının `SystemColors.Control` rengi ile boyandığını, ancak `OnPaint` kodunun kontrolü temizlemediğini veya bir renk ile doldurmadığını fark edin. Aslında arka plan, OnPaintBackground(PaintEventArgs) çağrılmadan önce OnPaint yöntemi tarafından boyanır. Denetiminizin arka planını çizmeyi işlemek için geçersiz kılın OnPaintBackground . Bu yöntemin varsayılan uygulaması, BackColor ve BackgroundImage özellikleri tarafından sırasıyla ayarlanan rengi ve görüntüyü çizmektir.