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í. To se liší od uživatelských ovládacích prvků, které poskytují návrhovou plochu vizuálu pro seskupení více ovládacích prvků do jedné opakovaně použitelné jednotky.

Vlastní ovládací prvky se používají, když se stávající ovládací prvek nebo uživatelský ovládací prvek nepřiblíží poskytnutí uživatelského rozhraní nebo interaktivity, které požadujete. K plnému implementaci vyžadují na vaší straně větší úsilí. Zpracování klávesnice a myši je i nadále poskytováno službou Windows Forms, ale implementace chování je ponechána na vás. Návrhová plocha není poskytnuta s vlastním ovládacím prvkem, protože veškeré kreslení se provádí v kódu v metodě OnPaint. Komponenty, jako například Timer, lze stále přidávat prostřednictvím návrhové plochy, která není viditelná.

Základní třída

Při vytváření vlastního ovládacího prvku si můžete vybrat ze dvou základních tříd:

  • System.Windows.Forms.Control

    Toto je stejná základní třída používaná jinými ovládacími prvky Windows Forms. Přímo řídíte vstup a výstup ovládacího prvku.

  • System.Windows.Forms.ScrollableControl

    Některé ovládací prvky Modelu Windows Forms používají tuto základní třídu. Tato třída se rozšiřuje Control přidáním možnosti posouvání obsahu.

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

Vykreslení, což znamená vykreslit vizuál ovládacího prvku, se provádí 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, OnPaint metoda se automaticky přepíše za vás. Šablona to dělá, protože je potřeba napsat kód pro vykreslení ovládacího prvku. 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

Ovládací prvek upravený na míru je vykreslen metodou OnPaint . Jediným argumentem PaintEventArgs této metody je objekt, který poskytuje všechny informace a funkce potřebné k vykreslení ovládacího prvku. PaintEventArgs poskytuje dvě vlastnosti, které se používají při vykreslování ovládacího prvku:

  • PaintEventArgs.ClipRectangle– Představuje část ovládacího prvku, který je potřeba překreslit. Může to být celý ovládací prvek nebo jeho čá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. Pozadí je ve skutečnosti vykresleno metodou OnPaintBackground(PaintEventArgs) před OnPaint zavoláním. Přepište OnPaintBackground, abyste mohli kreslit pozadí ovládacího prvku. Výchozí implementací této metody je nakreslení barvy a obrázku, které jsou nastaveny vlastnostmi BackColor a BackgroundImage.