Sdílet prostřednictvím


Co je vlastní ovládací prvek?

Tento článek vás seznámí s vlastními ovládacími prvky a popisuje, jak se liší od uživatelských ovládacích prvků. Vlastní ovládací prvky neposkytují plochu vizuálního návrhu a spoléhají na uživatelem zadaný kód k vykreslení. Tento návrh se liší od uživatelských ovládacích prvků, které poskytují vizuální návrhovou plochu pro seskupení více ovládacích prvků do jedné opakovaně použitelné jednotky.

Vlastní ovládací prvky použijte, pokud se stávající ovládací prvek nebo uživatelský ovládací prvek nepřiblíží poskytnutí uživatelského rozhraní nebo interaktivity, které potřebujete. K plnému implementaci vyžadují na vaší straně větší úsilí. Windows Forms stále poskytuje zpracování klávesnice a myši, ale potřebujete implementovat jakékoli konkrétní chování. Vlastní ovládací prvek neobsahuje návrhovou plochu, protože všechna kresba se provádí prostřednictvím kódu v OnPaint metodě. Ještě stále můžete přidat komponenty, jako je například Timer, prostřednictvím nevizuální návrhové plochy.

Základní třída

Při vytváření vlastního ovládacího prvku vyberte ze dvou základních tříd:

  • System.Windows.Forms.Control

    Tato základní třída je stejná jako u jiných ovládacích prvků Windows Forms. Přímo řídíte vstup a výstup ovládacího prvku.

  • System.Windows.Forms.ScrollableControl

    Tato základní třída je používána některými ovládacími prvky Windows Forms. Control se rozšiřuje o schopnost posouvat obsah.

Pokud nevyžadujete posouvání obsahu vlastního ovládacího prvku, použijte Control jako základní třídu.

Zděděné funkce

Vzhledem k tomu, že základní třída vlastního ovládacího prvku je Control, automaticky dědíte funkce Modelu Windows Forms sdílené všemi ovládacími prvky. Tady je několik možností, které získáte pomocí vlastního ovládacího prvku:

  • Zadávání pomocí klávesnice a myši
  • Chování rozložení, jako je ukotvení a připojení.
  • Podpora přepínání mezi záložkami
  • Minimální a maximální omezení velikosti.

Malba

Malování znamená kreslení vizuálu ovládacího prvku. Tuto úlohu provedete přepsáním metody OnPaint. Další informace o tom, jak ovládací prvky vykreslují, naleznete v tématu Malování a kreslení na ovládacích prvcích.

Když vytvoříte vlastní ovládací prvek pomocí šablon sady Visual Studio, automaticky přepíšete metodu OnPaint . Šablona to dělá, protože potřebujete napsat kód, který vykreslí váš ovládací prvek. Tady je příklad toho, co šablona vygeneruje:

public partial class CustomControl1 : Control
{
    public CustomControl1()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
    }
}
Public Class CustomControl1

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)

        'Add your custom paint code here
    End Sub

End Class

Vlastní ovládací prvek můžete nakreslit pomocí OnPaint metody. Tato metoda přebírá jeden argument, PaintEventArgs objekt, který poskytuje všechny informace a funkce, které potřebujete k vykreslení ovládacího prvku. PaintEventArgs poskytuje dvě vlastnosti, které použijete při vykreslování ovládacího prvku:

  • PaintEventArgs.ClipRectangle– Představuje část ovládacího prvku, který je potřeba překreslit. Tato část může být celý ovládací prvek nebo jenom část.

  • Graphics– Představuje grafický povrch vašeho ovládacího prvku. Poskytuje několik grafických objektů a metod, které poskytují funkce potřebné k vykreslení ovládacího prvku.

Metoda OnPaint se volá vždy, když je ovládací prvek vykreslen nebo aktualizován na obrazovce, a PaintEventArgs.ClipRectangle objekt představuje obdélník, ve kterém probíhá vykreslování. Pokud je potřeba aktualizovat celý ovládací prvek, PaintEventArgs.ClipRectangle představuje velikost celého ovládacího prvku. Pokud je potřeba aktualizovat pouze část ovládacího prvku, představuje pouze oblast, kterou je potřeba překreslit. Příkladem takového případu by bylo, když je ovládací prvek částečně zakrytý jiným ovládacím prvkem v uživatelském rozhraní a tento ovládací prvek je přesunut pryč, nově odkrytá část ovládacího prvku musí být překreslena.

Kód v OnPaint metodě ovládacího prvku se spustí při prvním vykreslení ovládacího prvku a kdykoli je neplatný. Pokud chcete zajistit, aby byl ovládací prvek při každé změně velikosti překreslen, přidejte do konstruktoru ovládacího prvku následující řádek:

SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.ResizeRedraw, True)

Příklad

Následující fragment kódu je vlastní ovládací prvek, který vykresluje několik barevných obdélníků kolem okraje ovládacího prvku.

protected override void OnPaint(PaintEventArgs pe)
{
    Rectangle rect = this.ClientRectangle;

    // Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
    // Otherwise, it kind of overlaps the outside edge.
    rect.Width -= 1;
    rect.Height -= 1;

    Pen[] colorPens = new Pen[] { Pens.Blue, Pens.BlueViolet,
                                  Pens.AliceBlue, Pens.CornflowerBlue,
                                  Pens.Cyan, Pens.DarkCyan };

    foreach (Pen pen in colorPens)
    {
        pe.Graphics.DrawRectangle(pen, rect);
        rect.Inflate(-1, -1);
    }

    // Raise the Paint event so users can custom paint if they want.
    base.OnPaint(pe);
}
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

    Dim rect As Rectangle = Me.ClientRectangle

    'Bring the width/height in by 1 pixel so the rectangle is drawn inside the control.
    'Otherwise, it kind of overlaps the outside edge.
    rect.Width -= 1
    rect.Height -= 1

    Dim colorPens As Pen() = {Pens.Blue, Pens.BlueViolet,
                                Pens.AliceBlue, Pens.CornflowerBlue,
                                Pens.Cyan, Pens.DarkCyan}

    For Each curPen As Pen In colorPens

        e.Graphics.DrawRectangle(curPen, rect)
        rect.Inflate(-1, -1)

    Next

    'Raise the Paint event so users can custom paint if they want.
    MyBase.OnPaint(e)

End Sub

Předchozí kód vytvoří ovládací prvek, který vypadá jako na následujícím obrázku:

Vlastní ovládací prvek vykreslený v aplikaci Visual Studio. Ovládací prvek je prázdná plocha s různými barvami na okrajích. Každá barva je posunutá dovnitř o jeden pixel.

Pozadí

Všimněte si, že pozadí ovládacího prvku je vykresleno SystemColors.Control barvou, i když OnPaint kód nečisví nebo vyplní ovládací prvek barvou. Metoda OnPaintBackground(PaintEventArgs) před voláním OnPaintmaluje pozadí . Přepište OnPaintBackground, abyste mohli kreslit pozadí ovládacího prvku. Výchozí implementace této metody vykreslí barvu a obrázek určený vlastnostmi BackColor a BackgroundImage.