Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 Invalidatee
megadott 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
.NET Desktop feedback