Porady: opracowywanie prostego formantu formularzy systemu Windows
W tej sekcji przedstawiono kluczowe kroki tworzenia niestandardowej kontrolki Formularze systemu Windows. Prosta kontrolka opracowana w tym przewodniku umożliwia zmianę wyrównania jej Text właściwości. Nie zgłasza ani nie obsługuje zdarzeń.
Aby utworzyć prostą kontrolkę niestandardową
Zdefiniuj klasę pochodzącą z klasy System.Windows.Forms.Control.
Public Class FirstControl Inherits Control End Class
public class FirstControl:Control {}
Zdefiniuj właściwości. (Nie musisz definiować właściwości, ponieważ kontrolka dziedziczy wiele właściwości z Control klasy, ale większość kontrolek niestandardowych zazwyczaj definiuje dodatkowe właściwości). Poniższy fragment kodu definiuje właściwość o nazwie
TextAlignment
, któraFirstControl
używa do formatowania wyświetlania właściwości dziedziczonej Text z Controlklasy . Aby uzyskać więcej informacji na temat definiowania właściwości, zobacz Omówienie właściwości.// 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
Po ustawieniu właściwości, która zmienia wyświetlanie wizualizacji kontrolki, należy wywołać metodę , aby ponownie wyrysować Invalidate kontrolkę. Invalidate element jest zdefiniowany w klasie Controlbazowej .
Zastąpij metodę chronioną OnPaint dziedziczona z Control , aby zapewnić logikę renderowania do kontrolki. Jeśli nie OnPaintzastąpisz kontrolki , kontrolka nie będzie mogła rysować się. W poniższym fragmentze OnPaint kodu metoda wyświetla Text właściwość dziedziczona z Control wyrównaniem określonym przez
alignmentValue
pole.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
Podaj atrybuty kontrolki. Atrybuty umożliwiają projektantowi wizualnemu wyświetlanie kontrolki i jej właściwości i zdarzeń odpowiednio w czasie projektowania. Poniższy fragment kodu stosuje atrybuty do
TextAlignment
właściwości . W projektancie, takim jak Visual Studio, Category atrybut (pokazany w fragmentcie kodu) powoduje wyświetlanie właściwości w kategorii logicznej. Atrybut Description powoduje wyświetlenie ciągu opisowego w dolnej części okna Właściwości po wybraniuTextAlignment
właściwości. Aby uzyskać więcej informacji na temat atrybutów, zobacz Atrybuty czasu projektowania dla składników.[ Category("Alignment"), Description("Specifies the alignment of text.") ]
<Category("Alignment"), Description("Specifies the alignment of text.")> _ Public Property TextAlignment() As ContentAlignment
(opcjonalnie) Podaj zasoby dla kontrolki. Możesz podać zasób, taki jak mapa bitowa, dla kontrolki przy użyciu opcji kompilatora (
/res
dla języka C#) w celu spakowania zasobów za pomocą kontrolki. W czasie wykonywania zasób można pobrać przy użyciu metod ResourceManager klasy . Aby uzyskać więcej informacji na temat tworzenia i używania zasobów, zobacz Zasoby w aplikacjach klasycznych.Skompiluj i wdróż kontrolkę. Aby skompilować i wdrożyć
FirstControl,
, wykonaj następujące kroki:Zapisz kod w poniższym przykładzie w pliku źródłowym (na przykład FirstControl.cs lub FirstControl.vb).
Skompiluj kod źródłowy do zestawu i zapisz go w katalogu aplikacji. W tym celu wykonaj następujące polecenie z katalogu zawierającego plik źródłowy.
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
Opcja
/t:library
kompilatora informuje kompilator, że tworzony zestaw jest biblioteką (a nie plikiem wykonywalnym). Opcja/out
określa ścieżkę i nazwę zestawu. Opcja/r
zawiera nazwę zestawów, do których odwołuje się kod. W tym przykładzie utworzysz zestaw prywatny, którego mogą używać tylko aplikacje. W związku z tym musisz zapisać go w katalogu aplikacji. Aby uzyskać więcej informacji na temat pakowania i wdrażania kontrolki dystrybucji, zobacz Wdrażanie.
Poniższy przykład przedstawia kod dla elementu FirstControl
. Kontrolka jest ujęta w przestrzeń nazw CustomWinControls
. Przestrzeń nazw zapewnia logiczne grupowanie powiązanych typów. Kontrolkę można utworzyć w nowej lub istniejącej przestrzeni nazw. W języku C# using
deklaracja (w Visual Basic) Imports
umożliwia uzyskiwanie dostępu do typów z przestrzeni nazw bez używania w pełni kwalifikowanej nazwy typu. W poniższym przykładzie using
deklaracja umożliwia kodowi uzyskiwanie dostępu do klasy Control z System.Windows.Forms klasy jako po prostu Control zamiast używania w pełni kwalifikowanej nazwy 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
Używanie kontrolki niestandardowej w formularzu
W poniższym przykładzie przedstawiono prosty formularz, który używa elementu FirstControl
. Tworzy trzy wystąpienia FirstControl
klasy , z których każda ma inną wartość dla TextAlignment
właściwości.
Aby skompilować i uruchomić ten przykład
Zapisz kod w poniższym przykładzie w pliku źródłowym (SimpleForm.cs lub SimpleForms.vb).
Skompiluj kod źródłowy do zestawu wykonywalnego, wykonując następujące polecenie z katalogu zawierającego plik źródłowy.
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 to zestaw zawierający klasę
FirstControl
. Ten zestaw musi znajdować się w tym samym katalogu co plik źródłowy formularza, który uzyskuje do niego dostęp (SimpleForm.cs lub SimpleForms.vb).Wykonaj polecenie SimpleForm.exe przy użyciu następującego polecenia.
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
Zobacz też
.NET Desktop feedback