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ą

  1. Zdefiniuj klasę pochodzącą z klasy System.Windows.Forms.Control.

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

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

  6. Skompiluj i wdróż kontrolkę. Aby skompilować i wdrożyć FirstControl, , wykonaj następujące kroki:

    1. Zapisz kod w poniższym przykładzie w pliku źródłowym (na przykład FirstControl.cs lub FirstControl.vb).

    2. 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) Importsumoż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 FirstControlklasy , z których każda ma inną wartość dla TextAlignment właściwości.

Aby skompilować i uruchomić ten przykład

  1. Zapisz kod w poniższym przykładzie w pliku źródłowym (SimpleForm.cs lub SimpleForms.vb).

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

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