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

bu bölümde, özel bir Windows Forms denetimi yazmak için temel adımlarda izlenecek yol gösterilmektedir. Bu izlenecek yolda geliştirilen basit denetim, özelliğinin hizalanmasına izin verir Text . Olayları oluşturmaz veya işlemez.

Basit bir özel denetim oluşturmak için

  1. Öğesinden türetilen bir sınıf tanımlayın System.Windows.Forms.Control .

    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 devralamadığı Control , ancak çoğu özel denetim genellikle ek özellikler tanımlayacağından, özellikleri tanımlamanız gerekmez.) Aşağıdaki kod parçası, TextAlignmentFirstControl öğesinden devralınan özelliğin görüntülenmesini biçimlendirmek için kullanılan adlı bir özelliği tanımlar TextControl . Ö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üntüsünü değiştiren bir özelliği ayarladığınızda, Invalidate denetimi yeniden çizmek için yöntemini çağırmanız gerekir. Invalidate , temel sınıfta tanımlanmıştır Control .

  3. OnPaintControl Denetiminizin işleme mantığını sağlamak için öğesinden devralınan korunan yöntemi geçersiz kılın. Geçersiz kıldıysanız OnPaint , denetiminiz kendisini çizmeyecektir. Aşağıdaki kod parçasında OnPaint yöntemi, TextControl alanı tarafından belirtilen hizalamayla devralınan özelliği görüntüler alignmentValue .

    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. Denetiminizin özniteliklerini sağlayın. Öznitelikler görsel tasarımcı 'nın, tasarım zamanında denetiminizi ve özelliklerini ve olaylarını uygun şekilde görüntülemesini sağlar. Aşağıdaki kod parçası, özelliğine öznitelikleri uygular TextAlignment . Visual Studio gibi bir tasarımcıda, Category özniteliği (kod parçasında gösterilen) özelliğin mantıksal bir kategori altında görüntülenmesine neden olur. DescriptionÖznitelik, özellik seçildiğinde Description penceresinin alt kısmında açıklayıcı bir dizenin görüntülenmesine neden olur TextAlignment . Ö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. seçim Denetiminizin kaynaklarını sağlayın. Denetim için bir derleyici seçeneği ( /res C# için) kullanarak, kaynakları denetilemenize paketleyerek, bir bit eşlem gibi bir kaynak sağlayabilirsiniz. Çalışma zamanında, kaynak, sınıfının yöntemleri kullanılarak alınabilir ResourceManager . Kaynakları oluşturma ve kullanma hakkında daha fazla bilgi için, bkz. Masaüstü uygulamalarındaki kaynaklar.

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

    1. Aşağıdaki örnekteki kodu bir kaynak dosyasına kaydedin (örneğin, FirstControl. cs veya FirstControl. vb).

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

      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
      

      /t:libraryDerleyici seçeneği derleyiciye oluşturmakta olduğunuz derlemenin bir kitaplık (yürütülebilir değil) olduğunu söyler. /outSeçeneği, derlemenin yolunu ve adını belirtir. /rSeçeneği, kodunuzun başvurduğu derlemelerin adını sağlar. Bu örnekte, yalnızca uygulamalarınızın kullanabileceği özel bir derleme oluşturursunuz. Bu nedenle, uygulamayı uygulamanızın dizinine kaydetmelisiniz. Dağıtım için bir denetim paketleme ve dağıtma hakkında daha fazla bilgi için bkz. dağıtım.

Aşağıdaki örnek, için kodu gösterir FirstControl . Denetim ad alanına alınmıştır CustomWinControls . Bir ad alanı ilgili türlerin mantıksal bir gruplandırmasını sağlar. Denetiminizi yeni veya mevcut bir ad alanında oluşturabilirsiniz. C# ' de, using bildirime (Visual Basic içinde Imports ), türün tam adı kullanılmadan, türlere bir ad alanından erişilmesine izin verir. Aşağıdaki örnekte, using bildirimi kodun, ControlSystem.Windows.FormsControl tam olarak nitelenmiş adı kullanmak yerine sınıfına erişimine izin verir System.Windows.Forms.Control .

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

Bir form üzerinde özel denetimi kullanma

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

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

  1. Aşağıdaki örnekteki kodu bir kaynak dosyasına (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ı içeren derlemedir FirstControl . Bu derleme, kendisine erişen form için kaynak dosyayla aynı dizinde olmalıdır (SimpleForm. cs veya SimpleForms. vb).

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

    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.