Mi az az egyéni vezérlő?

Ez a cikk bemutatja az egyéni vezérlőket, és ismerteti, hogyan különböznek a felhasználói vezérlőktől. Az egyéni vezérlők nem biztosítanak vizuális tervezési felületet, és a felhasználó által megadott kódra támaszkodnak a rajzoláshoz. Ez a kialakítás eltér a felhasználói vezérlőktől, amelyek vizuális tervezési felületet biztosítanak több vezérlő egyetlen újrafelhasználható egységbe való csoportosításához.

Egyéni vezérlőket akkor használjon, ha egy meglévő vezérlő vagy felhasználói vezérlő nem közelíti meg a szükséges felhasználói felületet vagy interaktivitást. A teljes megvalósításhoz több erőfeszítést igényelnek. A Windows Forms továbbra is biztosítja a billentyűzet- és egérkezelést, de minden egyes viselkedést végre kell hajtania. Az egyéni vezérlők nem tartalmaznak tervezőfelületet, mert az összes rajz a OnPaint metódus kódjában történik. A nemvizuális tervezési felületen továbbra is hozzáadhat összetevőket, például egy Timer.

Alaposztály

Egyéni vezérlő létrehozásakor válasszon két alaposztály közül:

  • System.Windows.Forms.Control

    Ez az alaposztály ugyanaz, amelyet más Windows Forms-vezérlők is használnak. Közvetlenül szabályozhatja a vezérlő bemenetét és kimenetét.

  • System.Windows.Forms.ScrollableControl

    Ezt az alaposztályt egyes Windows Forms-vezérlők használják. Kiterjeszti a Control azáltal, hogy hozzáadja a tartalom görgetésének képességét.

Ha nem szeretné görgetni az egyéni vezérlő tartalmát, használja Control alaposztályként.

Örökölt képességek

Mivel az egyéni vezérlők alaposztálya az Control, automatikusan örökli az összes vezérlő által megosztott Windows Forms-funkciókat. Az alábbiakban bemutatunk néhányat az egyéni vezérlők által nyújtott lehetőségek közül:

  • Billentyűzet- és egérbemenet.
  • Elrendezési viselkedések, például rögzítés és dokkolás.
  • A lapozás támogatása.
  • Minimális és maximális méretkorlátozások.

Festmény

A festés a vezérlő megjelenésének rajzolását jelenti. Ezt a feladatot a OnPaint metódus felülírásával hajthatja végre. A vezérlők festésének módjáról további információt a Vezérlők festése és rajzolás című témakörben talál.

Ha egyéni vezérlőt hoz létre a Visual Studio-sablonok használatával, automatikusan felülbírálja a metódust OnPaint . Azért teszi ezt a sablon, mert Önnek meg kell írnia a vezérlő rajzolásához szükséges kódot. Íme egy példa a sablon által generált adatokra:

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

Az OnPaint metódussal egyéni vezérlőt festhet. Ez a metódus egyetlen argumentumot, egy objektumot PaintEventArgs használ, amely biztosítja a vezérlő megjelenítéséhez szükséges összes információt és funkciót. PaintEventArgs két tulajdonságot kínál, amelyeket a vezérlő megjelenítéséhez használunk:

  • PaintEventArgs.ClipRectangle— A vezérlő azon részét jelöli, amelyet újra kell rajzolni. Ez a rész lehet a teljes vezérlő, vagy csak egy része.

  • Graphics— A vezérlő grafikus felületét jelöli. Számos grafikus orientált objektumot és metódust biztosít, amelyek lehetővé teszik a vezérlő rajzolásához szükséges funkciókat.

A OnPaint metódust akkor hívják meg, ha a vezérlőt a képernyőn rajzolják vagy frissítik, és az PaintEventArgs.ClipRectangle objektum azt a téglalapot jelöli, amelyben a festés történik. Ha a teljes vezérlőt frissíteni kell, PaintEventArgs.ClipRectangle a teljes vezérlő méretét jelöli. Ha a vezérlőnek csak egy részét kell frissíteni, csak azt a régiót jelöli, amelyet újra kell helyezni. Ilyen eset lehet például, ha egy vezérlőt részben eltakar egy másik vezérlő a felhasználói felületen, és amikor a másik vezérlőt elmozdítják, az alatta lévő vezérlő újonnan láthatóvá vált részét újra kell rajzolni.

A vezérlő metódusában szereplő OnPaint kód a vezérlő első rajzolásakor és az érvénytelenítéskor fut. Annak érdekében, hogy a vezérlő minden átméretezésekor újra legyen rajzolva, adja hozzá a következő sort a vezérlő konstruktorához:

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

példa

Az alábbi kódrészlet egy egyéni vezérlő, amely több színes téglalapot jelenít meg a vezérlő széle körül.

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

Az előző kód létrehoz egy vezérlőt, amely a következő képhez hasonlóan néz ki:

A Visual Studióban renderelt egyéni vezérlő. A vezérlőelem egy üres mező, amely különböző színekkel határos. Minden színt egyetlen képpont alkot.

Háttér

Figyelje meg, hogy a vezérlő háttere a színnel SystemColors.Control van festve, annak ellenére, hogy a OnPaint kód nem törli vagy nem tölti ki a vezérlőt színnel. A OnPaintBackground(PaintEventArgs) metódus a hívás OnPaintelőtt megfesti a hátteret. OnPaintBackground felülírása a vezérlő hátterének rajzolásához. Ennek a módszernek az alapértelmezett implementációja a BackColor és BackgroundImage tulajdonságok által beállított színt és képet rajzolja meg.