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


Vezérlők festése és rajzolás

A vezérlők egyéni festése a Windows Forms által megkönnyített bonyolult feladatok egyike. Egyéni vezérlők létrehozásakor számos lehetőség áll rendelkezésre a vezérlő grafikus megjelenésének kezelésére. Ha egyéni vezérlőt készít, vagyis egy olyan vezérlőt, amelyből Controlöröklődik, akkor kóddal grafikusan ábrázolja annak megjelenését.

Ha összetett vezérlőt hoz létre, amely vagy a UserControl típusból, vagy a meglévő Windows Forms-vezérlők egyikéből öröklődik, akkor felülbírálhatja a szabványos grafikus megjelenítést, és saját grafikus kódot adhat meg.

Ha új vezérlőelem létrehozása nélkül szeretne egyéni renderelést biztosítani egy meglévő vezérlőhöz, kezelje az Paint eseményt, amely lehetővé teszi a vezérlőelemek húzását.

A vezérlő renderelésében a következő elemek vesznek részt:

  • Az alaposztály System.Windows.Forms.Controláltal biztosított rajzfunkció.
  • A GDI grafikus kódtár alapvető elemei.
  • A rajzterület geometriája.
  • A grafikus erőforrások felszabadításának eljárása.

A vezérlés által biztosított rajz

Az alaposztály Control a Paint eseményen keresztül nyújt rajzfunkciót. A vezérlők akkor aktiválják az Paint eseményt, amikor frissítenie kell a kijelzőjét, és elvégezte a rajzát. A .NET-eseményekről további információt az Események kezelése és emelése című témakörben talál.

A Paint esemény eseményadat-osztálya ( PaintEventArgs) a vezérlőelemek rajzolásához szükséges adatokat tartalmazza – egy grafikus objektum fogópontját és egy téglalapot, amely a rajzolandó régiót jelöli.

public class PaintEventArgs : EventArgs, IDisposable
{

    public System.Drawing.Rectangle ClipRectangle {get;}
    public System.Drawing.Graphics Graphics {get;}

    // Other properties and methods.
}
Public Class PaintEventArgs
    Inherits EventArgs
    Implements IDisposable

    Public ReadOnly Property ClipRectangle As System.Drawing.Rectangle
    Public ReadOnly Property Graphics As System.Drawing.Graphics

    ' Other properties and methods.
End Class

Graphics egy olyan felügyelt osztály, amely magában foglalja a rajz funkcióit, ahogy azt a GDI későbbi, ebben a cikkben ismertetett vita is ismerteti. A ClipRectangle a Rectangle struktúra egy példánya, és meghatározza azt a rendelkezésre álló területet, amelyen egy vezérlő rajzolhat. A vezérlőfejlesztők egy vezérlő ClipRectangle tulajdonságával kiszámíthatják a ClipRectangle, ahogy azt a jelen cikk későbbi, geometriáról szóló vitájában is ismertetjük.

OnPaint

A vezérlőknek renderelési logikát kell biztosítaniuk az OnPaint metódus felülírásával, amelyet az Controlörököl. OnPaint hozzáfér egy grafikus objektumhoz és egy téglalaphoz a neki átadott Graphics példány ClipRectangle és PaintEventArgs tulajdonságain keresztül.

A következő kód a System.Drawing névteret használja:

protected override void OnPaint(PaintEventArgs e)
{
    // Call the OnPaint method of the base class.
    base.OnPaint(e);

    // Declare and instantiate a new pen that will be disposed of at the end of the method.
    using var myPen = new Pen(Color.Aqua);

    // Create a rectangle that represents the size of the control, minus 1 pixel.
    var area = new Rectangle(new Point(0, 0), new Size(this.Size.Width - 1, this.Size.Height - 1));

    // Draw an aqua rectangle in the rectangle represented by the control.
    e.Graphics.DrawRectangle(myPen, area);
}
Protected Overrides Sub OnPaint(e As PaintEventArgs)
    MyBase.OnPaint(e)

    ' Declare and instantiate a drawing pen.
    Using myPen = New System.Drawing.Pen(Color.Aqua)

        ' Create a rectangle that represents the size of the control, minus 1 pixel.
        Dim area = New Rectangle(New Point(0, 0), New Size(Me.Size.Width - 1, Me.Size.Height - 1))

        ' Draw an aqua rectangle in the rectangle represented by the control.
        e.Graphics.DrawRectangle(myPen, area)

    End Using
End Sub

Az alap OnPaint osztály Control metódusa nem valósít meg rajzfunkciókat, csupán meghívja a Paint eseményhez regisztrált eseménydelegáltakat. A OnPaintfelülírásakor általában az alaposztály OnPaint metódusát kell meghívnia, hogy a regisztrált delegáltak megkapják a Paint eseményt. Azonban azok a vezérlők, amelyek a teljes felületüket megfestik, ne hívják meg az alaposztály OnPaint-t, mivel ez villódzást idézhet elő.

Megjegyzés:

Ne hívja meg közvetlenül az Ön vezérléséből a OnPaint-t; ehelyett hívja meg a Invalidate metódust (amely a Control-től örökölt), vagy egy másik metódust, amely a Invalidate-at hívja meg. A Invalidate metódus viszont meghívja OnPaint. A Invalidate metódus túlterhelt, és a Invalidateemegadott argumentumoktól függően újrarajzozza a képernyőterület egy részét vagy egészét.

A vezérlő OnPaint metódusában szereplő kód a vezérlő első megrajzolásakor és frissítésekor lesz végrehajtva. Annak érdekében, hogy a vezérlő elem minden átméretezésekor újra meg legyen rajzolva, adja hozzá a következő sort a vezérlő konstruktorához:

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

OnPaintBackground

Az alap Control osztály egy másik, a rajzhoz hasznos metódust, a OnPaintBackground metódust definiálja.

protected virtual void OnPaintBackground(PaintEventArgs e);
Protected Overridable Sub OnPaintBackground(e As PaintEventArgs)

OnPaintBackground festi az ablak hátterét (és így az alakját), és garantáltan gyors, míg OnPaint festi a részleteket, és lassabb lehet, mert az egyes festékkérelmek egyetlen Paint eseménybe vannak kombinálva, amely minden újrarajzolt területet lefed. Előfordulhat, hogy meghívhatja a OnPaintBackground függvényt, amennyiben például színátmenetes hátteret szeretne rajzolni a vezérlőelemhez.

Bár OnPaintBackground egy eseményszerű nómenklatúrával rendelkezik, és ugyanazt az argumentumot használja, mint a OnPaint metódus, OnPaintBackground nem valódi eseménymetódus. Nincs PaintBackground esemény, és OnPaintBackground nem hív meg eseménydelegáltakat. A OnPaintBackground metódus felülírásakor nem szükséges származtatott osztályt használnia az alaposztály OnPaintBackground metódusának meghívásához.

GDI+ alapismeretek

A Graphics osztály különböző alakzatok, például körök, háromszögek, ívek és három pont rajzolására, valamint szöveg megjelenítésére szolgáló módszereket biztosít. A System.Drawing névtér olyan névtereket és osztályokat tartalmaz, amelyek grafikus elemeket, például alakzatokat (köröket, téglalapokat, íveket és egyéb elemeket), színeket, betűtípusokat, ecseteket stb. foglalnak magában.

A rajzterület geometriája

A vezérlőelem ClientRectangle tulajdonsága a felhasználó képernyőjén a vezérlőelem számára elérhető téglalap alakú régiót adja meg, míg a ClipRectanglePaintEventArgs tulajdonsága a festett területet határozza meg. Előfordulhat, hogy egy vezérlőnek csak a rendelkezésre álló terület egy részét kell festenie, ahogyan az is, ha a vezérlő kijelzőjének egy kis része megváltozik. Ilyen helyzetekben a vezérlőfejlesztőnek ki kell számítania a tényleges téglalapot, amelybe rajzol, és azt átadja Invalidate-nek. A Invalidate túlterhelt verziói, amelyek argumentumként Rectangle-et vagy Region-t vesznek fel, ezt az argumentumot használják a ClipRectanglePaintEventArgs tulajdonságának létrehozásához.

Grafikus erőforrások felszabadítása

A grafikus objektumok költségesek, mert rendszererőforrásokat használnak. Az ilyen objektumok közé tartoznak a System.Drawing.Graphics osztály példányai, valamint a System.Drawing.Brush, System.Drawing.Penés egyéb grafikus osztályok példányai. Fontos, hogy csak akkor hozzon létre grafikus erőforrást, ha szüksége van rá, és a használat befejezése után azonnal engedje fel. Ha olyan típusú példányt hoz létre, amely implementálja a IDisposable felületet, hívja meg a Dispose metódust, miután végzett vele az erőforrások felszabadításához.

Lásd még

Egyéni vezérlők