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 model Windows Forms. Jednoduchý ovládací prvek vyvinutý v tomto návodu umožňuje změnit zarovnání jeho Text vlastnosti. Nevyvolá ani nezpracuje události.
Vytvoření jednoduchého vlastního ovládacího prvku
Definujte třídu, která je odvozena od 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 Control třídy, ale většina vlastních ovládacích prvků obecně definuje další vlastnosti.) Následující fragment kódu definuje vlastnost s názvem, která
FirstControl
používá k formátování zobrazení Text vlastnosti zděděné z Control.TextAlignment
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 metodu Invalidate pro překreslení ovládacího prvku. Invalidate je definován v základní třídě Control.
Přepište chráněnou OnPaint metodu zděděnou z Control toho, aby poskytovala logiku vykreslování pro váš ovládací prvek. Pokud nepřepíšete OnPaint, ovládací prvek nebude schopen nakreslit sám sebe. V následujícím fragmentu kódu metoda OnPaint zobrazí Text vlastnost zděděnou z Control zarovnání určené 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 na
TextAlignment
vlastnost atributy. V návrháři, jako je Visual Studio, Category atribut (zobrazený v fragmentu kódu) způsobí, že vlastnost se zobrazí v logické kategorii. Atribut Description způsobí, že se popisný řetězec zobrazí v dolní části okna Vlastnosti přiTextAlignment
výběru vlastnosti. Další informace o atributech naleznete v tématu Atributy v době návrhu pro komponenty.[ 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 svůj ovládací prvek. Prostředek, jako je rastrový obrázek, můžete pro svůj ovládací prvek poskytnout pomocí možnosti kompilátoru (
/res
pro C#) k zabalení prostředků s vaším ovládacím prostředkem. V době běhu lze prostředek načíst pomocí metod ResourceManager třídy. 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 řízení. Pokud chcete zkompilovat a nasadit
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
/t:library
kompilátoru říká kompilátoru, že sestavení, které vytváříte, je knihovna (a ne spustitelný soubor). Možnost/out
určuje cestu a název sestavení. Tato/r
možnost 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# using
deklarace (v jazyce Visual Basic Imports
) umožňuje 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 using
deklarace umožňuje kód přistupovat ke třídě Control jako System.Windows.Forms 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
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro