Bagikan melalui


Apa itu kontrol kustom?

Artikel ini memperkenalkan Anda ke kontrol kustom dan menjelaskan perbedaannya dengan kontrol pengguna. Kontrol kustom tidak menyediakan permukaan desain visual dan mengandalkan kode yang disediakan pengguna untuk menggambar diri mereka sendiri. Desain ini berbeda dari kontrol pengguna, yang menyediakan permukaan desain visual untuk mengelompokkan beberapa kontrol ke dalam satu unit yang dapat digunakan kembali.

Gunakan kontrol kustom saat kontrol atau kontrol pengguna yang ada tidak mendekati untuk menyediakan UI atau interaktivitas yang Anda butuhkan. Mereka membutuhkan lebih banyak upaya untuk mengimplementasikan sepenuhnya. Windows Forms masih menyediakan penanganan keyboard dan mouse, tetapi Anda perlu menerapkan perilaku tertentu. Kontrol kustom tidak menyertakan permukaan desain karena semua gambar dilakukan melalui kode dalam OnPaint metode . Anda masih dapat menambahkan komponen, seperti Timer, melalui permukaan desain nonvisual.

Kelas dasar

Saat membuat kontrol kustom, pilih dari dua kelas dasar:

  • System.Windows.Forms.Control

    Kelas dasar ini sama dengan yang digunakan oleh kontrol Windows Forms lainnya. Anda langsung mengontrol input dan output kontrol.

  • System.Windows.Forms.ScrollableControl

    Kelas dasar ini digunakan oleh beberapa kontrol Windows Forms. Control diperluas dengan menambahkan kemampuan untuk menggulir konten.

Kecuali Anda memerlukan pengguliran konten kontrol kustom, gunakan Control sebagai kelas dasar Anda.

Kemampuan yang diwariskan

Karena kelas dasar kontrol kustom adalah Control, Anda secara otomatis mewarisi fungsionalitas Windows Forms yang dibagikan oleh semua kontrol. Berikut adalah beberapa kemampuan yang Anda dapatkan dengan kontrol kustom:

  • Input dari keyboard dan mouse.
  • Perilaku tata letak, seperti penambatan dan pemautan.
  • Dukungan untuk tab.
  • Batasan ukuran minimum dan maksimum.

Lukisan

Lukisan berarti menggambar visual kontrol. Anda menyelesaikan tugas ini dengan meng-override metode OnPaint. Untuk informasi selengkapnya tentang bagaimana kontrol melakukan pengecatan, lihat Melukis dan menggambar pada kontrol.

Saat Anda membuat kontrol kustom dengan menggunakan templat Visual Studio, Anda secara otomatis mengambil alih metode tersebut OnPaint . Templat melakukan ini karena Anda perlu menulis kode yang menggambar kontrol Anda. Berikut adalah contoh apa yang dihasilkan templat:

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

Anda melukis kontrol kustom dengan menggunakan metode OnPaint. Metode ini menerima satu argumen, objek PaintEventArgs, yang menyediakan semua informasi dan fungsionalitas yang Anda butuhkan untuk merender kontrol Anda. PaintEventArgs menyediakan dua properti yang Anda gunakan dalam merender kontrol Anda:

  • PaintEventArgs.ClipRectangle—Mewakili bagian dari kontrol yang perlu digambar ulang. Bagian ini bisa menjadi seluruh kontrol atau hanya bagian darinya.

  • Graphics—Mewakili permukaan grafis kontrol Anda. Ini menyediakan beberapa objek dan metode berorientasi grafis yang memberi Anda fungsionalitas yang diperlukan untuk menggambar kontrol Anda.

Metode OnPaint ini dipanggil setiap kali kontrol ditampilkan atau disegarkan di layar, dan objek PaintEventArgs.ClipRectangle mewakili persegi panjang tempat proses menggambar berlangsung. Jika seluruh kontrol perlu dimuat ulang, PaintEventArgs.ClipRectangle mewakili ukuran seluruh kontrol. Jika hanya sebagian dari kontrol yang perlu diperbarui, itu hanya menunjukkan area yang perlu digambar ulang. Contoh kasus seperti itu adalah ketika kontrol sebagian dikaburkan oleh kontrol lain di antarmuka pengguna, dan kontrol lain itu dipindahkan, bagian yang baru terekspos dari kontrol di bawahnya harus digambar ulang.

Kode dalam metode OnPaint kontrol dijalankan ketika kontrol pertama kali ditampilkan dan setiap kali dibatalkan validasinya. Untuk memastikan kontrol Anda digambar ulang setiap kali ukurannya diubah, tambahkan baris berikut ke dalam konstruktor kontrol Anda:

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

Contoh

Cuplikan kode berikut adalah kontrol kustom yang merender beberapa persegi panjang berwarna di sekitar bagian tepi kontrol tersebut.

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

Kode sebelumnya membuat kontrol yang terlihat seperti gambar berikut:

Kontrol kustom seperti yang dirender di Visual Studio. Kontrol adalah kotak kosong dengan warna berbeda yang berbatasan dengannya. Setiap warna disetel oleh satu piksel.

Latar Belakang

Perhatikan bahwa latar belakang kontrol dicat dengan SystemColors.Control warna, meskipun kode tersebut OnPaint tidak membersihkan atau mengisi kontrol dengan warna. Metode OnPaintBackground(PaintEventArgs) melukis latar belakang sebelum memanggil OnPaint. Ganti OnPaintBackground untuk menggambar latar belakang kontrol Anda. Implementasi default dari metode ini menggambar warna dan gambar yang masing-masing ditetapkan oleh properti BackColor dan BackgroundImage.