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

  1. Definujte třídu, která je odvozena od System.Windows.Forms.Control.

    Public Class FirstControl
       Inherits Control
    
    End Class
    
    public class FirstControl:Control {}
    
  2. 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.

  3. 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
    
  4. 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ři TextAlignment 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
    
  5. (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.

  6. Zkompilujte a nasaďte řízení. Pokud chcete zkompilovat a nasadit FirstControl, , proveďte následující kroky:

    1. Uložte kód v následující ukázce do zdrojového souboru (například FirstControl.cs nebo FirstControl.vb).

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

  1. Uložte kód v následujícím příkladu do zdrojového souboru (SimpleForm.cs nebo SimpleForms.vb).

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

  3. 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é