Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
Definieer een klasse die is afgeleid van System.Windows.Forms.Control.
Public Class FirstControl Inherits Control End Class
public class FirstControl:Control {}
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
dieFirstControl
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.
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
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 eigenschapTextAlignment
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
(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.Compileer en zet uw controle in. Voer de volgende stappen uit om
FirstControl,
te compileren en te implementeren:Sla de code in het volgende voorbeeld op in een bronbestand (zoals FirstControl.cs of FirstControl.vb).
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 FirstControl
gemaakt, elk met een andere waarde voor de eigenschap TextAlignment
.
Dit voorbeeld compileren en uitvoeren
Sla de code in het volgende voorbeeld op in een bronbestand (SimpleForm.cs of SimpleForms.vb).
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
FirstControl
bevat. Deze assembly moet zich in dezelfde map bevinden als het bronbestand voor het formulier dat het opent (SimpleForm.cs of SimpleForms.vb).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
.NET Desktop feedback