Практическое руководство. Разработка простого элемента управления форм 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;
Устанавливая свойство, изменяющее визуальное отображение элемента управления, необходимо вызвать 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); }
Укажите атрибуты для своего элемента управления. Атрибуты позволяют визуальному конструктору адекватно отображать ваш элемент управления, а также его свойства и события во время разработки. Код в следующем фрагменте применяет атрибуты к свойству
TextAlignment
. В конструкторе, например Visual Studio Category атрибут (показанный в фрагменте кода) вызывает отображение свойства для отображения логической категории. Description Атрибут приводит к строку описания, которое должно отображаться в нижней части свойства окно приTextAlignment
было выбрано свойство. Дополнительные сведения об атрибутах см. в разделе Атрибуты времени разработки для компонентов.[ Category("Alignment"), Description("Specifies the alignment of text.") ]
(Необязательно.) Предоставьте элементу управления ресурсы. Чтобы предоставить элементу управления ресурс, такой как растровое изображение, можно использовать параметр компилятора (
/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
определяет имена сборок, на которые ссылается код. В этом примере создается закрытая сборка, которую могут использовать только ваши приложения. Это значит, что сохранить ее в каталог приложения нельзя. Дополнительные сведения об упаковке и развертывании элемента управления, который нужно распределить, см. в разделе Развертывание.
В следующем примере показан код для 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);
}
}
}
Использование пользовательского элемента управления в форме
В следующем примере показана простая форма с использованием 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());
}
}
}