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
Definieren Sie eine Klasse, die von System.Windows.Forms.Control abgeleitet ist.
Public Class FirstControl Inherits Control ... End Class [C#] public class FirstControl:Control{...}
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 vonFirstControl
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.
Ü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.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 derTextAlignment
-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 {...}
(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.
Kompilieren Sie das Steuerelement, und geben Sie es weiter. Zum Kompilieren und zur Weitergabe von
FirstControl
führen Sie folgende Schritte aus:Speichern Sie den Code im folgenden Beispiel als Quelldatei (z. B. als FirstControl.cs oder FirstControl.vb).
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
Speichern Sie den Code im folgenden Beispiel als Quelldatei (SimpleForm.cs oder SimpleForms.vb).
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).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