Nasıl yapılır: Basit Bir Windows Forms Denetimi Geliştirme

Bu bölümde, özel bir Windows Forms denetimi yazmanın temel adımları açıklanmıştır. Bu kılavuzda geliştirilen basit denetim, özelliğinin hizalamasının Text değiştirilmesini sağlar. Olayları tetiklemiyor veya işlemez.

Basit bir özel denetim oluşturmak için

  1. öğesinden System.Windows.Forms.Controltüretilen bir sınıf tanımlayın.

    Public Class FirstControl
       Inherits Control
    
    End Class
    
    public class FirstControl:Control {}
    
  2. Özellikleri tanımlayın. (Bir denetim sınıftan birçok özelliği devraldığından, ancak özel denetimlerin Control çoğu genellikle ek özellikleri tanımladığından özellikleri tanımlamanız gerekmez.) Aşağıdaki kod parçası, öğesinden Controldevralınan FirstControl özelliğin Text görüntüsünü biçimlendirmek için kullanan adlı TextAlignment bir özelliği tanımlar. Özellikleri tanımlama hakkında daha fazla bilgi için bkz . Özelliklere Genel Bakış.

    // 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
    

    Denetimin görsel görünümünü değiştiren bir özellik ayarladığınızda, denetimi yeniden çizmek için yöntemini çağırmanız Invalidate gerekir. Invalidate , temel sınıfında Controltanımlanır.

  3. Denetiminize işleme mantığı sağlamak için öğesinden devralınan Control korumalı OnPaint yöntemi geçersiz kılın. geçersiz kılmazsanız OnPaint, denetiminiz kendisini çizemez. Aşağıdaki kod parçasında OnPaint yöntemi, öğesinden Control devralınan Text özelliği alan tarafından alignmentValue belirtilen hizalamayla görüntüler.

    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. Denetiminiz için öznitelikler sağlayın. Öznitelikler, görsel tasarımcının denetiminizi ve tasarım zamanında özelliklerini ve olaylarını uygun şekilde görüntülemesini sağlar. Aşağıdaki kod parçası özelliğine TextAlignment öznitelikler uygular. Visual Studio gibi bir tasarımcıda özniteliği Category (kod parçasında gösterilir) özelliğin mantıksal bir kategori altında görüntülenmesine neden olur. özniteliği, Description özellik seçildiğinde Özellikler penceresinin alt kısmında açıklayıcı bir dize görüntülenmesine TextAlignment neden olur. Öznitelikler hakkında daha fazla bilgi için bkz . Bileşenler için Tasarım Zamanı Öznitelikleri.

    [
    Category("Alignment"),
    Description("Specifies the alignment of text.")
    ]
    
    <Category("Alignment"), Description("Specifies the alignment of text.")> _
    Public Property TextAlignment() As ContentAlignment
    
  5. (isteğe bağlı) Denetiminiz için kaynak sağlayın. Denetiminizle kaynakları paketlemek için bir derleyici seçeneği (/res C#için) kullanarak denetiminiz için bit eşlem gibi bir kaynak sağlayabilirsiniz. Çalışma zamanında, kaynak sınıfının yöntemleri ResourceManager kullanılarak alınabilir. Kaynakları oluşturma ve kullanma hakkında daha fazla bilgi için bkz . Masaüstü Uygulamalarında Kaynaklar.

  6. Denetiminizi derleyin ve dağıtın. Derlemek ve dağıtmak FirstControl, için aşağıdaki adımları yürütebilirsiniz:

    1. Aşağıdaki örnekteki kodu bir kaynak dosyaya (FirstControl.cs veya FirstControl.vb gibi) kaydedin.

    2. Kaynak kodu bir derlemede derleyin ve uygulamanızın dizinine kaydedin. Bunu yapmak için, kaynak dosyayı içeren dizinden aşağıdaki komutu yürütür.

      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
      

      Derleyici /t:library seçeneği, derleyiciye oluşturduğunuz derlemenin yürütülebilir bir kitaplık (yürütülebilir değil) olduğunu bildirir. /out seçeneği, derlemenin yolunu ve adını belirtir. seçeneği,/r kodunuz tarafından başvuruda bulunılan derlemelerin adını sağlar. Bu örnekte, yalnızca uygulamalarınızın kullanabileceği bir özel derleme oluşturursunuz. Bu nedenle, uygulamanızın dizinine kaydetmeniz gerekir. Dağıtım denetimi paketleme ve dağıtma hakkında daha fazla bilgi için bkz . Dağıtım.

Aşağıdaki örnekte için FirstControlkod gösterilmektedir. Denetim, ad alanında CustomWinControlsyer alır. Ad alanı, ilgili türlerden oluşan mantıksal bir gruplandırma sağlar. Denetiminizi yeni veya mevcut bir ad alanında oluşturabilirsiniz. C# dilinde bildirim using (Visual Basic'te Imports), türün tam adı kullanılmadan türlerin ad alanından erişilmesine izin verir. Aşağıdaki örnekte, bildirimi kodun using tam adı System.Windows.Forms.Controlkullanmak yerine sınıfına Control 'den System.Windows.FormsControl erişmesine izin verir.

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

Formda Özel Denetimi Kullanma

Aşağıdaki örnekte kullanan FirstControlbasit bir form gösterilmektedir. Her biri FirstControlözelliği için TextAlignment farklı bir değere sahip üç örneği oluşturur.

Bu örneği derlemek ve çalıştırmak için

  1. Aşağıdaki örnekteki kodu bir kaynak dosyaya (SimpleForm.cs veya SimpleForms.vb) kaydedin.

  2. Kaynak dosyayı içeren dizinden aşağıdaki komutu yürüterek kaynak kodu yürütülebilir bir derlemede derleyin.

    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, sınıfını FirstControliçeren derlemedir. Bu derleme, bu derlemeye erişen formun kaynak dosyasıyla aynı dizinde olmalıdır (SimpleForm.cs veya SimpleForms.vb).

  3. Aşağıdaki komutu kullanarak SimpleForm.exe dosyasını yürütür.

    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 

Ayrıca bkz.