Практическое руководство. Разработка простого элемента управления Windows Forms
В этом разделе описаны основные шаги по созданию пользовательского элемента управления Windows Forms. Простой элемент управления, разработанный в этом пошаговом руководстве, дает возможность изменить свойство Text. Он не вызывает или обрабатывает события.
Создание простого пользовательского элемента управления
Определите класс, производный от System.Windows.Forms.Control.
Public Class FirstControl Inherits Control End Class
public class FirstControl:Control {}
Определите свойства. (В определении свойств нет необходимости, поскольку элемент управления наследует множество свойств из класса Control, но большинство пользовательских элементов управления обычно задаёт дополнительные свойства.) Следующий фрагмент кода определяет свойство с именем
TextAlignment
, котороеFirstControl
использует для форматирования отображения свойства Text, унаследованного от Control. Дополнительную информацию об определении свойств можно найти в разделе "Обзор свойств" .// 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
При задании свойства, которое изменяет визуальное отображение элемента управления, необходимо вызвать метод Invalidate для перерисовки элемента управления. Invalidate определяется в базовом классе Control.
Переопределите защищенный метод OnPaint, унаследованный от Control, чтобы обеспечить логику отрисовки в элементе управления. Если вы не переопределяете OnPaint, элемент управления не сможет нарисовать себя. В следующем фрагменте кода метод OnPaint отображает свойство Text, унаследованное от Control с выравниванием, указанным полем
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
Укажите атрибуты для элемента управления. Атрибуты позволяют визуальному конструктору отображать элемент управления и его свойства и события соответствующим образом во время разработки. Следующий фрагмент кода применяет атрибуты к свойству
TextAlignment
. В конструкторе, например Visual Studio, атрибут Category (показанный в фрагменте кода) приводит к отображению свойства под логической категорией. Атрибут Description приводит к отображению описательной строки в нижней части окна свойств при выборе свойстваTextAlignment
. Дополнительные сведения об атрибутах см. в разделе Design-Time Атрибуты для компонентов.[ Category("Alignment"), Description("Specifies the alignment of text.") ]
<Category("Alignment"), Description("Specifies the alignment of text.")> _ Public Property TextAlignment() As ContentAlignment
(необязательно) Укажите ресурсы для вашего управления. Вы можете предоставить ресурс, например растровое изображение, для элемента управления, используя параметр компилятора (
/res
для C#), чтобы упаковать ресурсы вместе с вашим элементом управления. Во время выполнения ресурс можно получить с помощью методов класса ResourceManager. Для получения более подробной информации о создании и использовании ресурсов см. раздел Ресурсы в приложениях для рабочего стола.Скомпилируйте и разверните элемент управления. Чтобы скомпилировать и развернуть
FirstControl,
выполните следующие действия:Сохраните код в следующем примере в исходный файл (например, FirstControl.cs или FirstControl.vb).
Скомпилируйте исходный код в сборку и сохраните его в каталоге приложения. Для этого выполните следующую команду из каталога, содержащего исходный файл.
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
Параметр компилятора
/t:library
сообщает компилятору, что сборка, которую вы создаете, является библиотекой (а не исполняемым файлом). Параметр/out
указывает путь и имя сборки. Параметр/r
предоставляет имя сборок, на которые ссылается код. В этом примере создается частная сборка, которую могут использовать только ваши приложения. Поэтому его необходимо сохранить в каталоге приложения. См. Deploymentдля получения дополнительной информации об упаковке и развертывании компонента для распространения.
В следующем примере показан код для FirstControl
. Элемент управления заключен в пространство имен CustomWinControls
. Пространство имен предоставляет логическую группировку связанных типов. Вы можете создать элемент управления в новом или существующем пространстве имен. В C#объявление using
(в Visual Basic Imports
) позволяет получать доступ к типам из пространства имен без использования полного имени типа. В следующем примере объявление using
позволяет коду получать доступ к классу Control из System.Windows.Forms, как просто Control вместо использования полного имени 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
Использование пользовательского элемента управления на форме
В следующем примере показана простая форма, использующая FirstControl
. Он создает три экземпляра FirstControl
, каждый из которых имеет другое значение для свойства TextAlignment
.
Компиляция и запуск этого примера
Сохраните код в следующем примере в исходный файл (SimpleForm.cs или SimpleForms.vb).
Скомпилируйте исходный код в исполняемую сборку, выполнив следующую команду из каталога, содержащего исходный файл.
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 — это сборка, содержащая класс
FirstControl
. Эта сборка должна находиться в том же каталоге, что и исходный файл для формы, которая обращается к ней (SimpleForm.cs или SimpleForms.vb).Выполните SimpleForm.exe с помощью следующей команды.
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
См. также
- свойства в элементах управления Windows Forms
- события в элементах управления Windows Forms
.NET Desktop feedback