Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penggambaran kustom pada kontrol adalah salah satu dari banyak tugas rumit yang dipermudah oleh Windows Forms. Saat menulis kontrol kustom, Anda memiliki banyak opsi yang tersedia untuk menangani tampilan grafis kontrol Anda. Jika Anda menulis kontrol kustom, yaitu kontrol yang mewarisi dari Control, Anda menggunakan kode untuk merender representasi grafisnya.
Jika Anda membuat kontrol komposit, yaitu kontrol yang mewarisi dari UserControl atau salah satu kontrol Windows Forms yang ada, Anda dapat mengganti representasi grafis standar dan menyediakan kode grafis Anda sendiri.
Jika Anda ingin menyediakan rendering kustom untuk kontrol yang ada tanpa membuat kontrol baru, tangani Paint event yang memungkinkan Anda menggambar di atas kontrol.
Elemen berikut terlibat dalam penyajian kontrol:
- Fungsionalitas gambar yang disediakan oleh kelas dasar System.Windows.Forms.Control.
- Elemen penting dari pustaka grafis GDI.
- Geometri wilayah gambar.
- Prosedur untuk membebaskan sumber daya grafis.
Gambar disediakan oleh sistem kontrol
Kelas dasar Control menyediakan fungsionalitas menggambar melalui peristiwanya Paint . Kontrol memicu peristiwa Paint setiap kali dibutuhkan untuk memperbarui tampilannya dan setelah proses penggambaran selesai. Untuk informasi selengkapnya tentang peristiwa di .NET, lihat Menangani dan meningkatkan peristiwa.
Kelas data peristiwa untuk Paint peristiwa, PaintEventArgs, menyimpan data yang diperlukan untuk menggambar kontrol - pegangan ke objek grafis dan persegi panjang yang mewakili wilayah yang akan digambar.
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 adalah kelas terkelola yang merangkum fungsi menggambar, sebagaimana dijelaskan dalam pembahasan GDI di bagian selanjutnya dari artikel ini. ClipRectangle adalah suatu instans dari struktur Rectangle dan menentukan area yang tersedia di mana kontrol dapat menggambarkan. Pengembang kontrol dapat menghitung ClipRectangle menggunakan properti dari ClipRectangle kontrol, seperti yang dijelaskan dalam diskusi geometri nanti dalam artikel ini.
OnPaint
Kontrol harus menyediakan logika penyajian dengan mengesampingkan metode OnPaint yang diwarisinya dari Control. OnPaint mendapatkan akses ke objek grafis dan persegi panjang untuk menggambar melalui properti Graphics dan ClipRectangle dari instans PaintEventArgs.
Kode berikut menggunakan System.Drawing
namespace layanan:
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
Metode OnPaint kelas dasar Control tidak menerapkan fungsionalitas menggambar apa pun tetapi hanya memanggil delegasi acara yang terdaftar pada acara Paint. Ketika Anda mengganti OnPaint, Anda biasanya harus memanggil metode dari kelas dasar OnPaint agar delegasi terdaftar dapat menerima kejadian Paint tersebut. Namun, kontrol yang melukis seluruh permukaannya sebaiknya tidak memanggil OnPaint kelas dasar, karena hal ini dapat menyebabkan tampilan mengalami kelap-kelip.
Nota
Jangan memanggil OnPaint langsung dari kontrol Anda; sebaliknya, panggil metode Invalidate (diwarisi dari Control) atau beberapa metode lain yang memanggil Invalidate. Metode Invalidate selanjutnya memanggil OnPaint. Metode Invalidate ini kelebihan beban, dan, tergantung pada argumen yang disediakan untuk Invalidatee
, menggambar ulang beberapa atau semua area layarnya.
Kode dalam metode OnPaint kontrol Anda akan dijalankan ketika kontrol pertama kali digambar, dan setiap kali di-refresh. Untuk memastikan bahwa kontrol Anda digambar ulang setiap kali diubah ukurannya, tambahkan baris berikut ke konstruktor kontrol Anda:
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.ResizeRedraw, True)
OnPaintBackground (Mewarnai Latar Belakang)
Kelas dasar Control mendefinisikan metode lain yang berguna untuk menggambar, OnPaintBackground metode .
protected virtual void OnPaintBackground(PaintEventArgs e);
Protected Overridable Sub OnPaintBackground(e As PaintEventArgs)
OnPaintBackground melukis latar belakang (dan dengan cara itu, bentuk) jendela dan dijamin cepat, sementara OnPaint melukis detailnya dan mungkin lebih lambat karena permintaan cat individu digabungkan menjadi satu Paint peristiwa yang mencakup semua area yang harus digambar ulang. Anda mungkin ingin memanggil OnPaintBackground jika, misalnya, Anda ingin menggambar latar belakang berwarna gradien untuk kontrol Anda.
Meskipun OnPaintBackground memiliki nomenklatur seperti peristiwa dan mengambil argumen yang sama dengan OnPaint
metode , OnPaintBackground
bukan metode peristiwa yang benar. Tidak ada PaintBackground
event dan OnPaintBackground
tidak memanggil delegasi event. Saat mengganti implementasi metode OnPaintBackground
, kelas turunan tidak wajib memanggil metode OnPaintBackground
dari kelas induk.
Dasar-Dasar GDI+
Kelas ini Graphics menyediakan metode untuk menggambar berbagai bentuk seperti lingkaran, segitiga, busur, dan elipsis, dan metode untuk menampilkan teks. Namespace System.Drawing berisi namespace layanan dan kelas yang merangkum elemen grafis seperti bentuk (lingkaran, persegi panjang, busur, dan lainnya), warna, font, kuas, dan sebagainya.
Geometri Wilayah Gambar
Properti ClientRectangle kontrol menentukan wilayah persegi panjang yang tersedia untuk kontrol pada layar pengguna, sementara ClipRectangle properti PaintEventArgs menentukan area yang dicat. Kontrol mungkin hanya perlu menggambar sebagian area yang tersedia, seperti ketika ada bagian kecil dari tampilan kontrol yang berubah. Dalam situasi tersebut, pengembang kontrol harus menghitung persegi panjang aktual untuk menggambar dan meneruskan itu ke Invalidate. Versi Invalidate yang kelebihan beban, yang menggunakan Rectangle atau Region sebagai argumen, memanfaatkan argumen tersebut untuk menghasilkan properti ClipRectangle dari PaintEventArgs.
Membebaskan Sumber Daya Grafis
Objek grafis mahal karena menggunakan sumber daya sistem. Objek tersebut termasuk instans System.Drawing.Graphics kelas dan instans System.Drawing.Brush, , System.Drawing.Pendan kelas grafis lainnya. Penting bagi Anda untuk membuat sumber daya grafis hanya ketika Anda membutuhkannya dan merilisnya segera setelah Anda selesai menggunakannya. Jika Anda membuat instans IDisposable jenis yang mengimplementasikan antarmuka, panggil metodenya Dispose ketika Anda selesai dengannya untuk membebaskan sumber daya.
Lihat juga
.NET Desktop feedback