Bagikan melalui


Cara: Mengembangkan Kontrol Formulir Windows Sederhana

Bagian ini memandikan Anda melalui langkah-langkah utama untuk menulis kontrol Formulir Windows kustom. Kontrol sederhana yang dikembangkan dalam panduan ini memungkinkan penyelarasan propertinya Text diubah. Ini tidak menaikkan atau menangani peristiwa.

Untuk membuat kontrol kustom sederhana

  1. Tentukan kelas yang berasal dari System.Windows.Forms.Control.

    Public Class FirstControl
       Inherits Control
    
    End Class
    
    public class FirstControl:Control {}
    
  2. Tentukan properti. (Anda tidak diharuskan untuk menentukan properti, karena kontrol mewarisi banyak properti dari Control kelas, tetapi sebagian besar kontrol kustom umumnya menentukan properti tambahan.) Fragmen kode berikut mendefinisikan properti bernama TextAlignment yang FirstControl menggunakan untuk memformat tampilan properti yang Text diwarisi dari Control. Untuk informasi selengkapnya tentang menentukan properti, lihat Gambaran Umum Properti.

    // ContentAlignment is an enumeration defined in the System.Drawing
    // namespace that specifies the alignment of content on a drawing
    // surface.
    private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;
    
    ' ContentAlignment is an enumeration defined in the System.Drawing
    ' namespace that specifies the alignment of content on a drawing 
    ' surface.
    Private alignmentValue As ContentAlignment = ContentAlignment.MiddleLeft
    
    <Category("Alignment"), Description("Specifies the alignment of text.")> _
    Public Property TextAlignment() As ContentAlignment
       
       Get
          Return alignmentValue
       End Get
       Set
          alignmentValue = value
          
          ' The Invalidate method invokes the OnPaint method described 
          ' in step 3.
          Invalidate()
       End Set
    End Property
    

    Saat Anda mengatur properti yang mengubah tampilan visual kontrol, Anda harus memanggil Invalidate metode untuk menggambar ulang kontrol. Invalidate didefinisikan dalam kelas Controldasar .

  3. Ambil alih metode yang dilindungi OnPaint yang diwariskan dari Control untuk memberikan logika penyajian ke kontrol Anda. Jika Anda tidak mengambil OnPaintalih , kontrol Anda tidak akan dapat menggambar dirinya sendiri. Dalam fragmen kode berikut, OnPaint metode menampilkan properti yang Text diwarisi Control dengan perataan yang ditentukan oleh alignmentValue bidang .

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        StringFormat style = new StringFormat();
        style.Alignment = StringAlignment.Near;
        switch (alignmentValue)
        {
            case ContentAlignment.MiddleLeft:
                style.Alignment = StringAlignment.Near;
                break;
            case ContentAlignment.MiddleRight:
                style.Alignment = StringAlignment.Far;
                break;
            case ContentAlignment.MiddleCenter:
                style.Alignment = StringAlignment.Center;
                break;
        }
    
        // Call the DrawString method of the System.Drawing class to write
        // text. Text and ClientRectangle are properties inherited from
        // Control.
        e.Graphics.DrawString(
            Text,
            Font,
            new SolidBrush(ForeColor),
            ClientRectangle, style);
    }
    
    Protected Overrides Sub OnPaint(e As PaintEventArgs)
    
       MyBase.OnPaint(e)
       Dim style As New StringFormat()
       style.Alignment = StringAlignment.Near
       Select Case alignmentValue
          Case ContentAlignment.MiddleLeft
             style.Alignment = StringAlignment.Near
          Case ContentAlignment.MiddleRight
             style.Alignment = StringAlignment.Far
          Case ContentAlignment.MiddleCenter
             style.Alignment = StringAlignment.Center
       End Select
       
       ' Call the DrawString method of the System.Drawing class to write   
       ' text. Text and ClientRectangle are properties inherited from
       ' Control.
       e.Graphics.DrawString( _
           me.Text, _
           me.Font, _
           New SolidBrush(ForeColor), _
           RectangleF.op_Implicit(ClientRectangle), _
           style)
    
    End Sub
    
  4. Berikan atribut untuk kontrol Anda. Atribut memungkinkan perancang visual untuk menampilkan kontrol Anda serta properti dan peristiwanya dengan tepat pada waktu desain. Fragmen kode berikut menerapkan atribut ke TextAlignment properti . Di perancang seperti Visual Studio, Category atribut (ditampilkan dalam fragmen kode) menyebabkan properti ditampilkan di bawah kategori logis. Atribut Description menyebabkan string deskriptif ditampilkan di bagian bawah jendela Properti saat TextAlignment properti dipilih. Untuk informasi selengkapnya tentang atribut, lihat Atribut Design-Time untuk Komponen.

    [
    Category("Alignment"),
    Description("Specifies the alignment of text.")
    ]
    
    <Category("Alignment"), Description("Specifies the alignment of text.")> _
    Public Property TextAlignment() As ContentAlignment
    
  5. (opsional) Berikan sumber daya untuk kontrol Anda. Anda dapat menyediakan sumber daya, seperti bitmap, untuk kontrol Anda dengan menggunakan opsi pengkompilasi (/res untuk C#) untuk mengemas sumber daya dengan kontrol Anda. Pada run time, sumber daya dapat diambil menggunakan metode ResourceManager kelas . Untuk informasi selengkapnya tentang membuat dan menggunakan sumber daya, lihat Sumber Daya di Aplikasi Desktop.

  6. Kompilasi dan sebarkan kontrol Anda. Untuk mengkompilasi dan menyebarkan FirstControl, jalankan langkah-langkah berikut:

    1. Simpan kode dalam sampel berikut ke file sumber (seperti FirstControl.cs atau FirstControl.vb).

    2. Kompilasi kode sumber ke dalam rakitan dan simpan di direktori aplikasi Anda. Untuk mencapai hal ini, jalankan perintah berikut dari direktori yang berisi file sumber.

      vbc -t:library -out:[path to your application's directory]/CustomWinControls.dll -r:System.dll -r:System.Windows.Forms.dll -r:System.Drawing.dll FirstControl.vb
      
      csc -t:library -out:[path to your application's directory]/CustomWinControls.dll -r:System.dll -r:System.Windows.Forms.dll -r:System.Drawing.dll FirstControl.cs
      

      Opsi /t:library kompilator memberi tahu pengkompilasi bahwa rakitan yang Anda buat adalah pustaka (dan bukan dapat dieksekusi). Opsi /out menentukan jalur dan nama rakitan. Opsi ini/r menyediakan nama rakitan yang dirujuk oleh kode Anda. Dalam contoh ini, Anda membuat rakitan privat yang hanya dapat digunakan aplikasi Anda. Oleh karena itu, Anda harus menyimpannya di direktori aplikasi Anda. Untuk informasi selengkapnya tentang pengemasan dan penyebaran kontrol untuk distribusi, lihat Penyebaran.

Sampel berikut menunjukkan kode untuk FirstControl. Kontrol diapit di namespace CustomWinControls. Namespace menyediakan pengelompokan logis jenis terkait. Anda dapat membuat kontrol di namespace baru atau yang sudah ada. Dalam C#, using deklarasi (di Visual Basic, Imports) memungkinkan jenis diakses dari namespace tanpa menggunakan nama jenis yang sepenuhnya memenuhi syarat. Dalam contoh berikut, using deklarasi memungkinkan kode untuk mengakses kelas Control dari System.Windows.Forms sebagai sederhana Control alih-alih harus menggunakan nama System.Windows.Forms.Controlyang sepenuhnya memenuhi syarat .

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace CustomWinControls
{
    public class FirstControl : Control
    {

        public FirstControl()
        {
        }

        // ContentAlignment is an enumeration defined in the System.Drawing
        // namespace that specifies the alignment of content on a drawing
        // surface.
        private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;

        [
        Category("Alignment"),
        Description("Specifies the alignment of text.")
        ]
        public ContentAlignment TextAlignment
        {

            get
            {
                return alignmentValue;
            }
            set
            {
                alignmentValue = value;

                // The Invalidate method invokes the OnPaint method described
                // in step 3.
                Invalidate();
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            StringFormat style = new StringFormat();
            style.Alignment = StringAlignment.Near;
            switch (alignmentValue)
            {
                case ContentAlignment.MiddleLeft:
                    style.Alignment = StringAlignment.Near;
                    break;
                case ContentAlignment.MiddleRight:
                    style.Alignment = StringAlignment.Far;
                    break;
                case ContentAlignment.MiddleCenter:
                    style.Alignment = StringAlignment.Center;
                    break;
            }

            // Call the DrawString method of the System.Drawing class to write
            // text. Text and ClientRectangle are properties inherited from
            // Control.
            e.Graphics.DrawString(
                Text,
                Font,
                new SolidBrush(ForeColor),
                ClientRectangle, style);
        }
    }
}
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms


Public Class FirstControl
   Inherits Control

   Public Sub New()
   End Sub 
   
   
   ' ContentAlignment is an enumeration defined in the System.Drawing
   ' namespace that specifies the alignment of content on a drawing 
   ' surface.
   Private alignmentValue As ContentAlignment = ContentAlignment.MiddleLeft
   
   <Category("Alignment"), Description("Specifies the alignment of text.")> _
   Public Property TextAlignment() As ContentAlignment
      
      Get
         Return alignmentValue
      End Get
      Set
         alignmentValue = value
         
         ' The Invalidate method invokes the OnPaint method described 
         ' in step 3.
         Invalidate()
      End Set
   End Property
   
   
   Protected Overrides Sub OnPaint(e As PaintEventArgs)

      MyBase.OnPaint(e)
      Dim style As New StringFormat()
      style.Alignment = StringAlignment.Near
      Select Case alignmentValue
         Case ContentAlignment.MiddleLeft
            style.Alignment = StringAlignment.Near
         Case ContentAlignment.MiddleRight
            style.Alignment = StringAlignment.Far
         Case ContentAlignment.MiddleCenter
            style.Alignment = StringAlignment.Center
      End Select
      
      ' Call the DrawString method of the System.Drawing class to write   
      ' text. Text and ClientRectangle are properties inherited from
      ' Control.
      e.Graphics.DrawString( _
          me.Text, _
          me.Font, _
          New SolidBrush(ForeColor), _
          RectangleF.op_Implicit(ClientRectangle), _
          style)

   End Sub

End Class

Menggunakan Kontrol Kustom pada Formulir

Contoh berikut menunjukkan formulir sederhana yang menggunakan FirstControl. Ini membuat tiga instans FirstControl, masing-masing dengan nilai yang berbeda untuk TextAlignment properti .

Untuk mengkompilasi dan menjalankan sampel ini

  1. Simpan kode dalam contoh berikut ke file sumber (SimpleForm.cs atau SimpleForms.vb).

  2. Kompilasi kode sumber ke dalam rakitan yang dapat dieksekusi dengan menjalankan perintah berikut dari direktori yang berisi file sumber.

    vbc -r:CustomWinControls.dll -r:System.dll -r:System.Windows.Forms.dll -r:System.Drawing.dll SimpleForm.vb
    
    csc -r:CustomWinControls.dll -r:System.dll -r:System.Windows.Forms.dll -r:System.Drawing.dll SimpleForm.cs
    

    CustomWinControls.dll adalah rakitan yang berisi kelas FirstControl. Rakitan ini harus berada di direktori yang sama dengan file sumber untuk formulir yang mengaksesnya (SimpleForm.cs atau SimpleForms.vb).

  3. Jalankan SimpleForm.exe menggunakan perintah berikut.

    SimpleForm
    
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace CustomWinControls
{

    public class SimpleForm : System.Windows.Forms.Form
    {
        private FirstControl firstControl1;

        private System.ComponentModel.Container components = null;

        public SimpleForm()
        {
            InitializeComponent();
        }

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        private void InitializeComponent()
        {
            this.firstControl1 = new FirstControl();
            this.SuspendLayout();

            //
            // firstControl1
            //
            this.firstControl1.BackColor = System.Drawing.SystemColors.ControlDark;
            this.firstControl1.Location = new System.Drawing.Point(96, 104);
            this.firstControl1.Name = "firstControl1";
            this.firstControl1.Size = new System.Drawing.Size(75, 16);
            this.firstControl1.TabIndex = 0;
            this.firstControl1.Text = "Hello World";
            this.firstControl1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;

            //
            // SimpleForm
            //
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.firstControl1);
            this.Name = "SimpleForm";
            this.Text = "SimpleForm";
            this.ResumeLayout(false);
        }

        [STAThread]
        static void Main()
        {
            Application.Run(new SimpleForm());
        }
    }
}
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms




Public Class SimpleForm
   Inherits System.Windows.Forms.Form

   Private firstControl1 As FirstControl
   
   Private components As System.ComponentModel.Container = Nothing
   
   
   Public Sub New()
      InitializeComponent()
   End Sub 
   
   

   
   
   Private Sub InitializeComponent()
      Me.firstControl1 = New FirstControl()
      Me.SuspendLayout()
      
      ' 
      ' firstControl1
      ' 
      Me.firstControl1.BackColor = System.Drawing.SystemColors.ControlDark
      Me.firstControl1.Location = New System.Drawing.Point(96, 104)
      Me.firstControl1.Name = "firstControl1"
      Me.firstControl1.Size = New System.Drawing.Size(75, 16)
      Me.firstControl1.TabIndex = 0
      Me.firstControl1.Text = "Hello World"
      Me.firstControl1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter
      
      ' 
      ' SimpleForm
      ' 
      Me.ClientSize = New System.Drawing.Size(292, 266)
      Me.Controls.Add(firstControl1)
      Me.Name = "SimpleForm"
      Me.Text = "SimpleForm"
      Me.ResumeLayout(False)
   End Sub 
    
   
   <STAThread()>  _
   Shared Sub Main()
      Application.Run(New SimpleForm())
   End Sub 
End Class 

Baca juga