Delen via


Procedure: Een eenvoudig Besturingselement voor Windows-formulieren ontwikkelen

In deze sectie wordt u begeleid bij de belangrijkste stappen voor het ontwerpen van een aangepast Besturingselement voor Windows Forms. Met de eenvoudige controle die in deze doorloop is ontwikkeld, kan de uitlijning van de eigenschap Text worden gewijzigd. Er worden geen gebeurtenissen veroorzaakt of afgehandeld.

Om een eenvoudig aangepast besturingselement te maken

  1. Definieer een klasse die is afgeleid van System.Windows.Forms.Control.

    Public Class FirstControl
       Inherits Control
    
    End Class
    
    public class FirstControl:Control {}
    
  2. Eigenschappen definiëren. (U hoeft geen eigenschappen te definiëren, omdat een besturingselement veel eigenschappen over neemt van de Control-klasse, maar de meeste aangepaste besturingselementen definiëren doorgaans extra eigenschappen.) Het volgende codefragment definieert een eigenschap met de naam TextAlignment die FirstControl gebruikt om de weergave van de Text eigenschap die is overgenomen van Controlop te maken. Zie Eigenschappenoverzichtvoor meer informatie over het definiëren van eigenschappen.

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

    Wanneer u een eigenschap instelt waarmee de visuele weergave van het besturingselement wordt gewijzigd, moet u de methode Invalidate aanroepen om het besturingselement opnieuw te tekenen. Invalidate wordt gedefinieerd in de basisklasse Control.

  3. Overschrijf de beveiligde OnPaint methode die is overgenomen van Control om renderinglogica te bieden aan uw besturingselement. Als u OnPaintniet overschrijft, kan uw besturingselement niet zelf tekenen. In het volgende codefragment geeft de OnPaint methode de eigenschap Text overgenomen van Control weer met de uitlijning die is opgegeven door het alignmentValue veld.

    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. Geef attributen op voor uw bedieningselement. Met kenmerken kan een visuele ontwerper uw besturingselement en de bijbehorende eigenschappen en gebeurtenissen op de juiste manier weergeven tijdens het ontwerp. Het volgende codefragment past kenmerken toe op de eigenschap TextAlignment. In een ontwerper zoals Visual Studio zorgt het Category kenmerk (weergegeven in het codefragment) ervoor dat de eigenschap wordt weergegeven onder een logische categorie. Het kenmerk Description zorgt ervoor dat een beschrijvende tekenreeks onder aan het venster Eigenschappen wordt weergegeven wanneer de eigenschap TextAlignment is geselecteerd. Zie Design-Time Kenmerken voor onderdelenvoor meer informatie over kenmerken.

    [
    Category("Alignment"),
    Description("Specifies the alignment of text.")
    ]
    
    <Category("Alignment"), Description("Specifies the alignment of text.")> _
    Public Property TextAlignment() As ContentAlignment
    
  5. (optioneel) Geef resources op voor uw beheer. U kunt een resource, zoals een bitmap, voor uw besturingselement opgeven met behulp van een compileroptie (/res voor C#) om resources te verpakken met uw besturingselement. Tijdens runtime kan de resource worden opgehaald met behulp van de methoden van de ResourceManager-klasse. Zie de Resources in Desktop Appsvoor meer informatie over het maken en gebruiken van resources.

  6. Compileer en zet uw controle in. Voer de volgende stappen uit om FirstControl, te compileren en te implementeren:

    1. Sla de code in het volgende voorbeeld op in een bronbestand (zoals FirstControl.cs of FirstControl.vb).

    2. Compileer de broncode in een assembly en sla deze op in de map van uw toepassing. Voer hiervoor de volgende opdracht uit vanuit de map die het bronbestand bevat.

      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
      

      De optie /t:library compiler vertelt de compiler dat de assembly die u maakt een bibliotheek is (en geen uitvoerbaar bestand). Met de optie /out geeft u het pad en de naam van de assembly op. De optie/r bevat de naam van de assembly's waarnaar wordt verwezen door uw code. In dit voorbeeld maakt u een persoonlijke assembly die alleen door uw toepassingen kan worden gebruikt. Daarom moet u deze opslaan in de map van uw toepassing. Zie Deploymentvoor meer informatie over het verpakken en implementeren van een besturingselement voor distributie.

In het volgende voorbeeld ziet u de code voor FirstControl. Het besturingselement bevindt zich in de naamruimte CustomWinControls. Een naamruimte biedt een logische groepering van gerelateerde typen. U kunt uw besturingselement maken in een nieuwe of bestaande naamruimte. In C# kunt u met de declaratie using (in Visual Basic, Imports) toegang krijgen tot typen vanuit een naamruimte zonder de volledig gekwalificeerde naam van het type te gebruiken. In het volgende voorbeeld maakt de using-declaratie het mogelijk om toegang te krijgen tot de klasse Control uit System.Windows.Forms, als Control in plaats van de volledig gekwalificeerde naam System.Windows.Forms.Controlte gebruiken.

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

Het gebruik van het aangepaste controle-element op een formulier

In het volgende voorbeeld ziet u een eenvoudig formulier dat gebruikmaakt van FirstControl. Er worden drie exemplaren van FirstControlgemaakt, elk met een andere waarde voor de eigenschap TextAlignment.

Dit voorbeeld compileren en uitvoeren

  1. Sla de code in het volgende voorbeeld op in een bronbestand (SimpleForm.cs of SimpleForms.vb).

  2. Compileer de broncode in een uitvoerbare assembly door de volgende opdracht uit te voeren vanuit de map die het bronbestand bevat.

    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 is de assembly die de klasse FirstControlbevat. Deze assembly moet zich in dezelfde map bevinden als het bronbestand voor het formulier dat het opent (SimpleForm.cs of SimpleForms.vb).

  3. Voer SimpleForm.exe uit met behulp van de volgende opdracht.

    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 

Zie ook