A mellékelt alkalmazás mappájának PPLibrary alkönyvtárában találjuk meg a fejlesztett kontrol forrásállományait, melyek közül a PPControl.cs tartalmazza a kontrol osztályának deklarációját. A kontrol kódját lefordítva állíthatjuk elő a szükséges assembly-t, melyet felhasználhatunk a kontrol ToolBox-n való regisztrálásához. A kontrolt regisztrálva, az tetszőlegesen felhasználható bármely Windows-os alkalmazásban.
A megjelenítés érdekében néhány öröklött property-t felüldefiniáltunk, másokat elrejtettünk, vagyis nem jelennek meg a Propeties dialógusablakban szerkesztési időben.
A kontrol osztályát a Control osztályból származtatjuk, és létrehozunk néhány új property-t a kontrol kerettípusának tárolására, a minimum, és maximum érték tárolására, valamint a folyamatindikátor pillanatnyi értékét tükröző érték tárolására:
private BorderStyle border = BorderStyle.FixedSingle;
private int v = 0;
private int min = 0;
private int max = 100;
A kontrol konstruktorában megadjuk a megjelenésre vonatkozó adatokat:
public PPControl()
{
SetStyle(ControlStyles.ResizeRedraw
| ControlStyles.Opaque | ControlStyles.AllPaintingInWmPaint
| ControlStyles.UserPaint | ControlStyles.DoubleBuffer,
true);
TabStop = false;
}
A kontrol OnPaint metódusa az, mely gondoskodik a százalékos érték megjelenítéséről, így lássuk most annak deklarációját. Először lekérdezzük az elérhető Graphics objektumot a metódus paraméteréből:
protected override void OnPaint(PaintEventArgs pe)
{
Graphics g = pe.Graphics;
Meghatározzuk, hogy a Paint esemény lezajlásának pillanatában mekkora az aktuális, megjelenítendő százalékos érték:
int range = Maximum - Minimum;
int pos = range == 0 ? 0 : (Value - Minimum);
if (range == 0) range = 1;
int percent = (pos * 100) / range;
Létrehozzuk a kirajzolandó szöveges információt formázó objektumot, valamint a rajzolóeszközök objektumait:
StringFormat sf = new StringFormat();
Brush fg = new SolidBrush(ForeColor);
Brush bg = new SolidBrush(BackColor);
Meghatározzuk a megjelenítendő karakterláncot, valamint annak helyzetét megadjuk a formázó objektumnak:
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
string s = string.Format("{0}%", percent);
Lekérdezzük a kontrol kliensterületét:
Rectangle r = ClientRectangle;
Megrajzoljuk azt a kontrolterületet, mely a már eltelt időt jelzi valamilyen kiválasztott színnel:
r.Width = (r.Width * pos) / range;
g.SetClip(r);
g.FillRectangle(fg, r);
g.DrawString(s, Font, bg, ClientRectangle, sf);
Majd azt a területet, mely még színezetlen:
r.X = r.Width;
r.Width = ClientRectangle.Width - r.X;
g.SetClip(r);
g.FillRectangle(bg, r);
g.DrawString(s, Font, fg, ClientRectangle, sf);
...
A választott BorderStyle property-nek megfelelően beállítjuk a kontrol keretét, majd meghívjuk az ősosztály Paint metódusát:
switch (BorderStyle)
{
case BorderStyle.FixedSingle:
ControlPaint.DrawBorder(g, ClientRectangle, SystemColors.ControlDarkDark,
ButtonBorderStyle.Solid);
break;
case BorderStyle.Fixed3D:
ControlPaint.DrawBorder3D(g, ClientRectangle, Border3DStyle.Sunken);
break;
}
base.OnPaint(pe);
}
A kód tartalmaz még néhány deklarációt, melyekkel elrejtjük a Text és BackgroungImage propety-k beállítási lehetőségét a Properties ablakból.
A forráskód utolsó szegmensében („Megváltozott tartalmú property-k” régió) még felülírunk néhány property-t, ezek a TabStop, ForeColor, és BackColor. Ezzel a kontrol kész.
A mellékelt példában egy TrackBar kontrollal együtt helyeztük el a kontrolunkat az alkalmazás Form-ján. A TrackBar kontrol Value értékének megváltozásához kötődő esemény bekövetkezésekor állítjuk a kontrolunk Value értékét is, így tesztelhető a megfelelő érték megjelenítése.