Megosztás a következőn keresztül:


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 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álunk, 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 windowsos űrlapok továbbra is biztosítják a billentyűzet- és egérkezelést, de a működést önre bízjuk. Nincs egyéni vezérlővel ellátott tervezőfelület, mert az összes rajz a OnPaint metódus kódjával történik. Az olyan összetevők, mint például a Timer, továbbra is hozzáadhatók a nem vizuális tervezési felületen keresztül.

Alaposztály

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

  • System.Windows.Forms.Control

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

  • System.Windows.Forms.ScrollableControl

    Egyes Windows Forms-vezérlők ezt az alaposztályt használják. Ez az osztály a tartalom görgetésének lehetőségével bővül Control .

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, amely a vezérlő vizualizációjának rajzolását jelenti, a OnPaint függvény felülírásával valósítható meg. 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-sablonokkal, a OnPaint metódus automatikusan felül lesz bírálva. A sablon ezt azért teszi, mert meg kell írnia a kódot a vezérlő rajzolásához. Í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

A OnPaint metódussal festjük az egyéni vezérlőt. A metódus egyetlen argumentuma egy PaintEventArgs objektum, amely a vezérlő megjelenítéséhez szükséges összes információt és funkciót biztosítja. PaintEventArgs két tulajdonságot biztosít, amelyek a vezérlő renderelésére szolgálnak:

  • PaintEventArgs.ClipRectangle— A vezérlő azon részét jelöli, amelyet újra kell rajzolni. Ez lehet a vezérlő egésze vagy annak 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 biztosítják 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 hátteret valójában a OnPaintBackground(PaintEventArgs) metódus festi, mielőtt meghívnák a OnPaint-et. OnPaintBackground felülírása a vezérlő hátterének rajzolásához. Ennek a módszernek az alapértelmezett implementációja az, hogy megrajzolja a BackColor tulajdonság által beállított színt és a BackgroundImage tulajdonság által beállított képet.