Postupy: Vývoj jednoduchého ovládacího prvku Windows Forms
Tato část vás provede klíčovými kroky pro vytvoření vlastního ovládacího prvku Windows Forms. Jednoduchý ovládací prvek vyvinutý v tomto průvodci umožňuje změnit zarovnání jeho Text vlastnosti. Nevyvolává ani nezpracovává události.
Vytvoření jednoduchého vlastního ovládacího prvku
Definujte třídu, která je odvozena z System.Windows.Forms.Control.
Public Class FirstControl Inherits Control End Class
public class FirstControl:Control {}
Definujte vlastnosti. (Není nutné definovat vlastnosti, protože ovládací prvek dědí mnoho vlastností z třídy Control, ale většina vlastních ovládacích prvků obvykle definuje další vlastnosti.) Následující fragment kódu definuje vlastnost s názvem
TextAlignment
, kteráFirstControl
používá k formátování zobrazení vlastnosti Text zděděné z Control. Další informace o definování vlastností naleznete v tématu Přehled vlastností.// 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
Když nastavíte vlastnost, která změní vizuální zobrazení ovládacího prvku, musíte vyvolat Invalidate metodu překreslit ovládací prvek. Invalidate je definován v základní třídě Control.
Přepište chráněnou metodu OnPaint zděděnou z Control tak, aby poskytovala logiku vykreslování pro váš ovládací prvek. Pokud OnPaintnepřepíšete, komponenta se nebude moci sama nakreslit. V následujícím fragmentu kódu metoda OnPaint zobrazí vlastnost Text zděděnou z Control se zarovnáním určeným polem
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
Zadejte atributy pro svůj ovládací prvek. Atributy umožňují vizuálnímu návrháři zobrazit ovládací prvek a jeho vlastnosti a události odpovídajícím způsobem v době návrhu. Následující fragment kódu aplikuje atributy na
TextAlignment
vlastnost. V návrháři, jako je Visual Studio, atribut Category (zobrazený v fragmentu kódu) způsobí zobrazení vlastnosti v logické kategorii. Atribut Description způsobí zobrazení popisného řetězce v dolní části okna vlastnosti vlastnosti při výběru vlastnostiTextAlignment
. Další informace o atributech naleznete v tématu Design-Time Atributy součásti.[ Category("Alignment"), Description("Specifies the alignment of text.") ]
<Category("Alignment"), Description("Specifies the alignment of text.")> _ Public Property TextAlignment() As ContentAlignment
(volitelné) Poskytněte prostředky pro vaše ovládání. Prostředek, například rastrový obrázek, můžete pro svůj ovládací prvek poskytnout prostřednictvím možnosti kompilátoru (
/res
pro jazyk C#) k zabalením prostředků s vaším ovládacím prvkem. V době běhu lze prostředek načíst pomocí metod třídy ResourceManager. Další informace o vytváření a používání prostředků najdete v tématu Prostředky v desktopových aplikacích.Zkompilujte a nasaďte svou kontrolu. Ke kompilaci a nasazení
FirstControl,
proveďte následující kroky:Uložte kód v následující ukázce do zdrojového souboru (například FirstControl.cs nebo FirstControl.vb).
Zkompilujte zdrojový kód do sestavení a uložte ho do adresáře aplikace. Provedete to spuštěním následujícího příkazu z adresáře, který obsahuje zdrojový soubor.
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
Možnost kompilátoru
/t:library
říká kompilátoru, že sestavení, které vytváříte, je knihovna (a ne spustitelný soubor). Možnost/out
určuje cestu a název sestavení. Možnost/r
poskytuje název sestavení, na která odkazuje váš kód. V tomto příkladu vytvoříte privátní sestavení, které může používat pouze vaše aplikace. Proto ho musíte uložit do adresáře aplikace. Další informace o balení a nasazení ovládacího prvku pro distribuci naleznete v tématu Nasazení.
Následující ukázka ukazuje kód pro FirstControl
. Ovládací prvek je uzavřen v oboru názvů CustomWinControls
. Obor názvů poskytuje logické seskupení souvisejících typů. Ovládací prvek můžete vytvořit v novém nebo existujícím oboru názvů. V jazyce C# umožňuje deklarace using
(v jazyce Visual Basic Imports
) přístup k typům z oboru názvů bez použití plně kvalifikovaného názvu typu. V následujícím příkladu deklarace using
umožňuje kódu přistupovat ke třídě Control z System.Windows.Forms jako jednoduše Control místo použití plně kvalifikovaného názvu 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
Použití vlastního ovládacího prvku ve formuláři
Následující příklad ukazuje jednoduchý formulář, který používá FirstControl
. Vytvoří tři instance FirstControl
, každý s jinou hodnotou pro TextAlignment
vlastnost.
Kompilace a spuštění této ukázky
Uložte kód v následujícím příkladu do zdrojového souboru (SimpleForm.cs nebo SimpleForms.vb).
Zkompilujte zdrojový kód do spustitelného sestavení spuštěním následujícího příkazu z adresáře, který obsahuje zdrojový soubor.
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 je sestavení, které obsahuje třídu
FirstControl
. Toto sestavení musí být ve stejném adresáři jako zdrojový soubor formuláře, který k němu přistupuje (SimpleForm.cs nebo SimpleForms.vb).Spusťte SimpleForm.exe pomocí následujícího příkazu.
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
Viz také
.NET Desktop feedback