Freigeben über


Entwickeln eines einfachen Windows Forms-Steuerelements

In diesem Abschnitt werden die wesentlichen Schritte beim Erstellen benutzerdefinierter Windows Forms-Steuerelemente behandelt. In dieser exemplarischen Vorgehensweise wird ein einfaches Steuerelement entwickelt, das die Änderung der Ausrichtung seiner Text-Eigenschaft zulässt. Es dient nicht zum Behandeln oder Auslösen von Ereignissen.

So erstellen Sie ein einfaches benutzerdefiniertes Steuerelement

  1. Definieren Sie eine Klasse, die von System.Windows.Forms.Control abgeleitet ist.

    Public Class FirstControl
       Inherits Control
       ...
    End Class
    [C#]
    public class FirstControl:Control{...}
    
  2. Definieren Sie Eigenschaften. (Die Definition von Eigenschaften ist nicht zwingend erforderlich, da ein Steuerelement viele Eigenschaften von der Control-Klasse erbt. Jedoch definieren im Allgemeinen die meisten benutzerdefinierten Steuerelemente zusätzliche Eigenschaften.) Im folgenden Codefragment wird eine Eigenschaft namens TextAlignment definiert. Sie wird von FirstControl dazu verwendet, die Anzeige der Text-Eigenschaft zu formatieren, die von Control geerbt wurde. Weitere Informationen über das Definieren von Eigenschaften finden Sie unter Übersicht über Eigenschaften.

    ' ContentAlignment is an enumeration defined in the System.Drawing
    ' namespace that specifies the alignment of content on a drawing 
    ' surface.
    Private alignment As ContentAlignment = ContentAlignment.MiddleLeft
    
    Public Property TextAlignment() As ContentAlignment
      Get
         Return alignment
      End Get
      Set
         alignment = value
         ' The Invalidate method invokes the OnPaint method described 
         ' in step 3.
         Invalidate()
      End Set
    End Property
    [C#]
    // ContentAlignment is an enumeration defined in the System.Drawing
    // namespace that specifies the alignment of content on a drawing 
    // surface.
    private ContentAlignment alignment = ContentAlignment.MiddleLeft;
    
    public ContentAlignment TextAlignment {
       get {
          return alignment;
       }
       set {
          alignment = value;
          // The Invalidate method invokes the OnPaint method described 
          // in step 3.
          Invalidate(); 
       }
    }
    

    Wenn Sie eine Eigenschaft festlegen, durch die die visuelle Darstellung eines Steuerelements geändert wird, müssen Sie die Invalidate-Methode aufrufen, um das Steuerelement neu zu zeichnen. Invalidate wird in der Basisklasse Control definiert.

  3. Überschreiben Sie die geschützte, von Control vererbte OnPaint-Methode, um dem Steuerelement Wiedergabelogik zur Verfügung zu stellen. Wenn Sie OnPaint nicht überschreiben, wird das Steuerelement nicht in die Lage versetzt, sich selbst zu zeichnen. Im folgenden Codefragment zeigt die OnPaint-Methode die Text-Eigenschaft an, die von Control mit einer Standardausrichtung geerbt wird.

    Public Class FirstControl
       Inherits Control
    
       Public Sub New()
          ...
       End Sub
    
       Protected Overrides Sub OnPaint(e As PaintEventArgs)
          MyBase.OnPaint(e)
          e.Graphics.DrawString(Text, Font, New SolidBrush(ForeColor), RectangleF.op_Implicit(ClientRectangle), style)
       End Sub
    End Class
    [C#]
    public class FirstControl : Control{
       public FirstControl() {...}
       protected override void OnPaint(PaintEventArgs e) {
          base.OnPaint(e);
          e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle, style);
       } 
    }
    

    Durch den oben angegebenen Code wird Text mit Standardausrichtung angezeigt. Das Codebeispiel am Ende dieses Themas veranschaulicht, wie die Ausrichtung von Text gemäß der TextAlignment-Eigenschaft geändert wird, die in diesem Abschnitt bereits in Schritt 2 definiert wurde.

  4. Stellen Sie Attribute für das Steuerelement bereit. Durch Attribute kann das Steuerelement samt seiner Eigenschaften und Ereignisse zur Entwurfszeit in einem visuellen Designer entsprechend angezeigt werden. Im folgenden Codefragment werden Attribute auf die TextAlignment-Eigenschaft angewendet. Das Category-Attribut (das im Codefragment gezeigt wird) führt in einem Designer wie Microsoft Visual Studio .NET dazu, dass die Eigenschaft in einer logischen Kategorie angezeigt wird. Das Description-Attribut bewirkt bei Auswahl der TextAlignment-Eigenschaft, dass eine beschreibende Zeichenfolge am unteren Rand des Eigenschaftenfensters angezeigt wird. Weitere Informationen über Attribute finden Sie unter Entwurfszeitattribute für Komponenten.

    <Category("Alignment"), _
    Description("Specifies the alignment of text.")> _  
    Public Property TextAlignment() As ContentAlignment
       ...
    End Class
    [C#]
    [
    Category("Alignment"),
    Description("Specifies the alignment of text.")
    ]
    public ContentAlignment TextAlignment {...}
    
  5. (Optional) Stellen Sie Ressourcen für das Steuerelement bereit. Sie können dem Steuerelement eine Ressource (z. B. eine Bitmap) zur Verfügung stellen, indem Sie eine Compileroption (/res für C#) zum Verpacken von Ressourcen mit dem Steuerelement verwenden. Durch Verwendung der Methoden der System.Resources.ResourceManager-Klasse kann die Ressource zur Laufzeit abgerufen werden. Weitere Informationen über das Erstellen und Verwenden von Ressourcen finden Sie im Schnelleinstieg .NET-Beispiele - Verfahren: Ressourcen.

  6. Kompilieren Sie das Steuerelement, und geben Sie es weiter. Zum Kompilieren und zur Weitergabe von FirstControl führen Sie folgende Schritte aus:

    1. Speichern Sie den Code im folgenden Beispiel als Quelldatei (z. B. als FirstControl.cs oder FirstControl.vb).

    2. Kompilieren Sie den Quellcode in eine Assembly, und speichern Sie diese im Anwendungsverzeichnis. Führen Sie dazu den folgenden Befehl im Verzeichnis aus, das die Quelldatei enthält.

      vbc /t:library /out:[Pfad des Anwendungsverzeichnisses]/CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll FirstControl.vb

      csc /t:library /out:[Pfad des Anwendungsverzeichnisses]/CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll FirstControl.cs

      Durch die Compileroption /t:library wird dem Compiler mitgeteilt, dass es sich bei der von Ihnen erstellten Assembly um eine Bibliothek und nicht um eine ausführbare Datei handelt. Durch die Option /out werden Pfad und Name der Assembly festgelegt. Die Option /r stellt den Namen der Assemblies bereit, auf die der Code verweist. In diesem Beispiel erstellen Sie eine private Assembly, die ausschließlich Ihre Anwendung verwenden kann. Daher müssen Sie sie in Ihrem Anwendungsverzeichnis speichern. Weitere Informationen über das Verpacken und die Weitergabe eines Steuerelements zur Verteilung finden Sie unter Bereitstellen von .NET Framework-Anwendungen.

Im Folgenden wird der Code für FirstControl gezeigt. Das Steuerelement ist im Namespace CustomWinControls eingeschlossen. Ein Namespace stellt eine logische Gruppe verwandter Typen bereit. Sie können ein Steuerelement in einem neuen oder vorhandenen Namespace erstellen. Using-Deklarationen (Imports in Visual Basic) ermöglichen in C# den Zugriff auf Typen über einen Namespace ohne Verwendung des vollständigen Typnamens. Im folgenden Beispiel ermöglicht die using-Deklaration, dass Code einfach mit Control von System.Windows.Forms aus auf die Klasse Control zugreifen kann, ohne den vollständigen Namen System.Windows.Forms.Control verwenden zu müssen.

Option Explicit
Option Strict

Imports System
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Drawing

Namespace CustomWinControls
   Public Class FirstControl
      Inherits Control
      Private alignment As ContentAlignment = ContentAlignment.MiddleLeft

      <Category("Alignment"), _
      Description("Specifies the alignment of text.")> _
      Public Property TextAlignment() As ContentAlignment
         Get
            Return alignment
         End Get
         Set
            alignment = value
            ' The Invalidate method invokes the OnPaint method.
            Invalidate()
         End Set
      End Property
      
      ' OnPaint aligns text, as specified by the 
      ' TextAlignment property, by passing a parameter
      ' to the DrawString method of the System.Drawing.Graphics object.
      Protected Overrides Sub OnPaint(e As PaintEventArgs)
         MyBase.OnPaint(e)
         Dim style As New StringFormat()
         style.Alignment = StringAlignment.Near
         Select Case alignment
            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(Text, Font, New SolidBrush(ForeColor), RectangleF.op_Implicit(ClientRectangle), style)
      End Sub
   End Class
End Namespace
[C#]
namespace CustomWinControls {
   using System;
   using System.ComponentModel;
   using System.Windows.Forms;
   using System.Drawing;
   public class FirstControl : Control {
      private ContentAlignment alignment = ContentAlignment.MiddleLeft;
      
      [
       Category("Alignment"),
       Description("Specifies the alignment of text.")
      ]
      public ContentAlignment TextAlignment {
         get {
            return alignment;
         }
         set {
            alignment = value;
            // The Invalidate method invokes the OnPaint method.
            Invalidate();
         }
      }

      // OnPaint aligns text, as specified by the 
      // TextAlignment property, by passing a parameter
      // to the DrawString method of the System.Drawing.Graphics object.
      protected override void OnPaint(PaintEventArgs e) {
         base.OnPaint(e);
         StringFormat style = new StringFormat();
         style.Alignment = StringAlignment.Near;
         switch (alignment) {
            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);
      }
   }
}

Verwenden des benutzerdefinierten Steuerelements in einem Formular

Im folgenden Beispiel wird ein einfaches Formular gezeigt, das FirstControl verwendet. Es werden drei Instanzen von FirstControl mit unterschiedlichen Werten für die TextAlignment-Eigenschaft erstellt.

So kompilieren Sie dieses Beispiel und führen es aus

  1. Speichern Sie den Code im folgenden Beispiel als Quelldatei (SimpleForm.cs oder SimpleForms.vb).

  2. Kompilieren Sie den Quellcode in eine ausführbare Assembly. Führen Sie dazu den folgenden Befehl in dem Verzeichnis aus, das die Quelldatei enthält.

    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 ist die Assembly, in der die Klasse FirstControl enthalten ist. Diese Assembly muss sich im selben Verzeichnis befinden wie die Quelldatei des Formulars, das auf sie zugreift (SimpleForm.cs oder SimpleForms.vb).

  3. Führen Sie SimpleForm.exe mit folgendem Befehl aus.

    SimpleForm

Option Explicit
Option Strict

Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports CustomWinControls

Class SimpleForm
   Inherits Form
   Private leftControl As FirstControl
   Private centerControl As FirstControl
   Private rightControl As FirstControl
   
   Protected Overloads Overrides Sub Dispose(disposing as Boolean)
      MyBase.Dispose(disposing)
   End Sub
   
   
   Public Sub New()
      leftControl = New FirstControl()
      With leftControl
         .Text = "Left"
         .Location = New Point(50, 50)
         .Size = New Size(50, 50)
      End With
      Controls.Add(leftControl)
      
      centerControl = New FirstControl()
      With centerControl
         .TextAlignment = ContentAlignment.MiddleCenter
         .Text = "Center"
         .Location = New Point(125, 50)
         .Size = New Size(50, 50)
      End With
      Controls.Add(centerControl)
      
      rightControl = New FirstControl()
      With rightControl
         .TextAlignment = ContentAlignment.MiddleRight
         .Text = "Right"
         .Location = New Point(200, 50)
         .Size = New Size(50, 50)
      End With
      Controls.Add(rightControl)
   End Sub

   <STAThread()> _
   Public Shared Sub Main()
      Dim myForm As New SimpleForm()
      myForm.Text = "Uses FirstControl"
      myForm.Size = New Size(400, 150)
      Application.Run(myForm)
   End Sub
End Class
[C#]
using System;
using System.Windows.Forms;
using System.Drawing;
using CustomWinControls;

class SimpleForm : Form {
   private FirstControl left;
   private FirstControl center;
   private FirstControl right;
   
   protected override void Dispose(bool disposing) {
      base.Dispose(disposing);
   }

   public SimpleForm() : base() {
      left = new FirstControl();
      left.Text = "Left";
      left.Location = new Point(50, 50);
      left.Size = new Size(50, 50);
      Controls.Add(left);
      
      center = new FirstControl();
      center.TextAlignment = ContentAlignment.MiddleCenter;
      center.Text = "Center";
      center.Location = new Point(125, 50);
      center.Size = new Size(50, 50);
      Controls.Add(center);
      
      right = new FirstControl();
      right.TextAlignment = ContentAlignment.MiddleRight;
      right.Text = "Right";
      right.Location = new Point(200, 50);
      right.Size = new Size(50, 50);
      Controls.Add(right);
   }
   
   [STAThread]
   public static void Main(string[] args) {
      Form form = new SimpleForm();
      form.Text = "Uses FirstControl";
      form.Size = new Size(400, 150);
      Application.Run(form);
   }
}

Siehe auch

Eigenschaften von Windows Forms-Steuerelementen | Ereignisse in Windows Forms-Steuerelementen