Show / Hide Table of Contents

Практическое руководство. Разработка простого элемента управления форм Windows Forms

В этом разделе рассматриваются основные этапы создания пользовательского элемента управления Windows Forms. Простой элемент управления, разработанный в этом пошаговом руководстве, позволяет изменять выравнивание его Text значение изменяемого свойства. Он не вызывает и не обрабатывает события.

Создание простого пользовательского элемента управления

  1. Определите класс, производный от класса System.Windows.Forms.Control.

    Public Class FirstControl  
       Inherits Control  
    
    End Class  
    
    public class FirstControl:Control {}  
    
  2. Определите свойства. (Не является обязательным для определения свойств, так как элемент управления наследует многие свойства из 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.

  3. Переопределите защищенный 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);
    
    } 
    
  4. Укажите атрибуты для своего элемента управления. Атрибуты позволяют визуальному конструктору адекватно отображать ваш элемент управления, а также его свойства и события во время разработки. Код в следующем фрагменте применяет атрибуты к свойству TextAlignment. В конструкторе, например Visual Studio Category атрибут (показанный в фрагменте кода) вызывает отображение свойства для отображения логической категории. Description Атрибут приводит к строку описания, которое должно отображаться в нижней части свойства окно при TextAlignment было выбрано свойство. Дополнительные сведения об атрибутах см. в разделе Атрибуты времени разработки для компонентов.

    [
    Category("Alignment"),
    Description("Specifies the alignment of text.")
    ]
    
  5. (Необязательно.) Предоставьте элементу управления ресурсы. Чтобы предоставить элементу управления ресурс, такой как растровое изображение, можно использовать параметр компилятора (/res для C#), позволяющий упаковать ресурсы с элементом управления. Во время выполнения ресурс можно получить с помощью методов класса ResourceManager класса. Более подробную информацию о создании и использовании ресурсов см. в разделе Ресурсы в приложениях для настольных систем.

  6. Скомпилируйте и разверните элемент управления. Чтобы скомпилировать и развернуть FirstControl,, выполните следующие действия.

    1. Сохраните код из представленного ниже примера в исходный файл (например, FirstControl.cs или FirstControl.vb).

    2. Скомпилируйте исходный код в сборку и сохраните его в каталог приложения. Для этого выполните следующую команду из каталога, содержащего исходный файл.

      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.

Компиляция и выполнение примера

  1. Сохраните код в следующем примере в исходный файл (SimpleForm.cs или SimpleForms.vb).

  2. Скомпилируйте исходный код в исполняемую сборку, выполнив следующую команду из каталога, содержащего исходный файл.

    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).

  3. Выполните файла 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());
        }


    }
}

См. также

  • Свойства элементов управления Windows Forms
  • События элементов управления Windows Forms
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX