Aracılığıyla paylaş


Basit bir özel denetim oluşturma

Bu makalede özel Windows Forms denetiminin nasıl oluşturulacağı öğretildi. Bu makalede geliştirilen basit denetim, denetime ait Text'yu kontrolün soluna, ortasına veya sağına yazdırır. Metnin hizalaması değiştirilebilir. Bu denetim, olayları tetiklemez veya işlemez.

Bu makalede şunları öğreneceksiniz:

  • Metnin yatay hizalama ayarını işlemek için bir özellik ve alan ekleyin.
  • Denetimi geçersiz kılma için kullanın OnTextChanged .
  • Kontrolün yüzeyine metin çizmek için OnPaint yöntemine kod ekleyin.

Özel denetim ekleme

İlk adım, projenize özel bir denetim eklemektir.

  1. Visual Studio'da Çözüm Gezgini penceresini bulun. Projeye sağ tıklayın veYeni Öğe Ekle'yi> seçin.

    Visual Studio'nun görüntüsü. Çözüm Gezgini penceresinde, bir menü gösterilen projeye sağ tıklandı. Menüde vurgulanan 'Ekle' menü öğesidir ve bu öğe bir alt menüyü gösteren genişletilmiştir. Alt menüde'Yeni Öğe' menü öğesi vurgulanır.

  2. Özel Denetim'i arayın ve seçin.

  3. Dosya adını FirstControl olarak ayarlayın ve Ekle'yi seçin.

  4. Denetimin Tasarım modu görünür durumdaysa kod görünümüne geçin. F7 tuşuna basın veya kod görünümüne geç bağlantısını seçin.

    Tavsiye

    Çözüm Gezgini penceresinde dosyaya sağ tıklayıp Kodu Görüntüle'yi de seçebilirsiniz.

Şimdi aşağıdaki kod parçacığına benzer şekilde görünen özel denetimin kaynak koduna bakıyor olmalısınız:

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

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

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

        'Add your custom paint code here
    End Sub

End Class

Özellik ekleme

adlı TextAlignmentdenetimde yeni bir özellik oluşturun. Bu özellik, denetimin üzerinde metnin boyandığı yeri ayarlar. sınıfıyla FirstControl aşağıdaki adımları gerçekleştirin:

  1. adlı bir alan ekleyin ve türünü _textAlignment olarak belirleyin.

    private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
    
    Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
    
  2. Alanı, TextAlignment adlı bir özellikte sarın. Özelliği ayarlarken, denetimin kendisini yeniden boyamaya zorlamak için Invalidate yöntemini çağırın.

    public HorizontalAlignment TextAlignment
    {
        get => _textAlignment;
        set
        {
            _textAlignment = value;
            Invalidate();
        }
    }
    
    Public Property TextAlignment As HorizontalAlignment
        Get
            Return _textAlignment
        End Get
    
        Set(value As HorizontalAlignment)
            _textAlignment = value
            Invalidate()
        End Set
    End Property
    
  3. Visual Studio'daki Özellikler penceresiyle tümleştirmek için özelliğine aşağıdaki öznitelikleri ekleyin.

    • Category—Özelliğine uygulanan kategori.

    • Description—Özelliğin açıklaması.

    • DefaultValue—Özelliği için varsayılan değerdir.

      Varsayılan değer, özelliğin tasarımcı tarafından sıfırlanması sağlar. Ayrıca, varsayılan değerler serileştirilmediğinden, özelliğin kod arkasına ne zaman serileştirileceğini belirlemeye de yardımcı olur.

    [System.ComponentModel.Category("Alignment"),
    System.ComponentModel.Description("Specifies the alignment of text."),
    System.ComponentModel.DefaultValue(HorizontalAlignment.Left)]
    public HorizontalAlignment TextAlignment
    
    <System.ComponentModel.Category("Alignment"),
    System.ComponentModel.Description("Specifies the alignment of text."),
    System.ComponentModel.DefaultValue(HorizontalAlignment.Left)>
    Public Property TextAlignment As HorizontalAlignment
    

Değiştirilen metni işleme

TextAlignment özelliği, denetimin kendisini yeniden boyaması için Invalidate çağırır. Denetim elemanının Text'si işlenirken doğru hizalamanın derhal kullanılması sağlanır. Ancak, Text özelliği değişse bile, Text çağrısı Invalidate yapılmadığından hiçbir şey güncelleştirilmez. Özellik, OnTextChanged yöntemini çağırır, ancak bu yöntemi sizin çağırarak Invalidate'i çağırabilir ve denetimi kendini yeniden boyamaya zorlayabilirsiniz.

sınıfıyla FirstControl aşağıdaki adımları gerçekleştirin:

  1. OnTextChanged yöntemini geçersiz kılın.
  2. base.OnTextChanged olayının, kontrol tüketicilerinin beklediği gibi tetiklenmesi için TextChanged çağrısını yapın.
  3. Invalidate yöntemini çağırarak yeniden boyamayı zorlayın.

Kodunuz aşağıdaki kod parçacığı gibi görünmelidir:

protected override void OnTextChanged(EventArgs e)
{
    base.OnTextChanged(e);
    Invalidate();
}
Protected Overrides Sub OnTextChanged(e As EventArgs)
    MyBase.OnTextChanged(e)
    Invalidate()
End Sub

Kontrolü boyama

Özel denetimin son bölümü boyamadır. sınıfıyla FirstControl aşağıdaki adımları gerçekleştirin:

  1. OnPaint Şablon tarafından oluşturulan yöntemi bulun. Eksikse temel sınıftan geçersiz kılın.

  2. adlı StringFormatyeni style bir değişken oluşturun.

    StringFormat style = new();
    
    Dim style As New StringFormat
    

    Türü System.Drawing.StringFormat metin düzeni bilgilerini kapsüller ve hizalamaya erişim sağlar.

  3. TextAlignment temelinde style.Alignment özelliğini uygun değere ayarlayın.

    style.Alignment = TextAlignment switch
    {
        // Map the HorizontalAlignment enum to the StringAlignment enum
        HorizontalAlignment.Left => StringAlignment.Near,
        HorizontalAlignment.Right => StringAlignment.Far,
        HorizontalAlignment.Center => StringAlignment.Center,
        
        // Default to Near alignment
        _ => StringAlignment.Near
    };
    
    'Map the HorizontalAlignment enum to the StringAlignment enum
    Select Case TextAlignment
        Case HorizontalAlignment.Left
            style.Alignment = StringAlignment.Near
        Case HorizontalAlignment.Right
            style.Alignment = StringAlignment.Far
        Case HorizontalAlignment.Center
            style.Alignment = StringAlignment.Center
    End Select
    
  4. Text özelliğini Graphics.DrawString ile çizin.

    // Create the brush and automatically dispose it.
    using SolidBrush foreBrush = new(ForeColor);
    
    // Call the DrawString method to write text.
    // Text, Font, and ClientRectangle are inherited properties.
    pe.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style);
    
    'Create the brush and automatically dispose it.
    Using foreBrush As New SolidBrush(ForeColor)
        'Call the DrawString method to write text.
        'Text, Font, and ClientRectangle are inherited properties.
        e.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style)
    End Using
    

    Önemli

    yöntemi, Graphics.DrawString metnin rengi için bir Brush kullanır. Brushes kullanımdan sonra atılmalıdır.

    Graphics.DrawString yöntemi metin, yazı tipi, renk ve biçimlendirme seçeneklerini kullanarak bir dize çizer.

  5. base.OnPaint arayarak Paint olayının tetiklendiğinden emin olun.

    base.OnPaint(pe);
    
    MyBase.OnPaint(e)
    
  6. Kod dosyasını kaydedin ve projeyi derleyin. Proje derlendiğinde Visual Studio, Visual Designer'ı açtığınızda araç kutusu penceresine özel denetimi ekler.

Kodunuz aşağıdaki kod parçacığı gibi görünmelidir:

public partial class FirstControl : Control
{
    private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;

    [System.ComponentModel.Category("Alignment"),
    System.ComponentModel.Description("Specifies the alignment of text."),
    System.ComponentModel.DefaultValue(HorizontalAlignment.Left)]
    public HorizontalAlignment TextAlignment
    {
        get => _textAlignment;
        set
        {
            _textAlignment = value;
            Invalidate();
        }
    }

    public FirstControl()
    {
        InitializeComponent();
    }

    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
        Invalidate();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        StringFormat style = new();

        style.Alignment = TextAlignment switch
        {
            // Map the HorizontalAlignment enum to the StringAlignment enum
            HorizontalAlignment.Left => StringAlignment.Near,
            HorizontalAlignment.Right => StringAlignment.Far,
            HorizontalAlignment.Center => StringAlignment.Center,
            
            // Default to Near alignment
            _ => StringAlignment.Near
        };

        // Create the brush and automatically dispose it.
        using SolidBrush foreBrush = new(ForeColor);

        // Call the DrawString method to write text.
        // Text, Font, and ClientRectangle are inherited properties.
        pe.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style);

        base.OnPaint(pe);
    }
}
Public Class FirstControl

    Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left

    <System.ComponentModel.Category("Alignment"),
    System.ComponentModel.Description("Specifies the alignment of text."),
    System.ComponentModel.DefaultValue(HorizontalAlignment.Left)>
    Public Property TextAlignment As HorizontalAlignment
        Get
            Return _textAlignment
        End Get

        Set(value As HorizontalAlignment)
            _textAlignment = value
            Invalidate()
        End Set
    End Property

    Protected Overrides Sub OnTextChanged(e As EventArgs)
        MyBase.OnTextChanged(e)
        Invalidate()
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Dim style As New StringFormat

        'Map the HorizontalAlignment enum to the StringAlignment enum
        Select Case TextAlignment
            Case HorizontalAlignment.Left
                style.Alignment = StringAlignment.Near
            Case HorizontalAlignment.Right
                style.Alignment = StringAlignment.Far
            Case HorizontalAlignment.Center
                style.Alignment = StringAlignment.Center
        End Select

        'Create the brush and automatically dispose it.
        Using foreBrush As New SolidBrush(ForeColor)
            'Call the DrawString method to write text.
            'Text, Font, and ClientRectangle are inherited properties.
            e.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style)
        End Using
        MyBase.OnPaint(e)
    End Sub

End Class