HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Hangerőszabályzó kontrol készítése


Példaprogram letöltése

13557 bájt

Speciális alkalmazásokban nem biztos hogy elegendő, ha egy TrackBar kontrolt használunk az adott érték – legyen mondjuk hangerő – szabályozására, helyette talán valamivel szebb kontrolt szeretnénk. Miért is ne? Cikkünkben készítünk egy, a klasszikus hangerőszabályzók megjelenítését imitáló kontrolt, melyet elegendő az egérrel a megfelelő pozícióba állítanunk.

A kontrol egy kör alapú szabályzó, mely egy kis „gombbal” rendelkezik az egérrel történő megragadáshoz. Megadható, hogy mennyi legyen a maximum és a minimum érték, és hogy milyen lépésbeosztás érvényesüljön a skálán. És természetesen mindig lekérdezhető, hogy mennyi az aktuálisan jelzett érték.
A kontrol készítésének elve, hogy minden újrarajzoláskor egy Image objektumban tároljuk el a rajzolatot, majd ezt helyezzük fel a kontrol felületére.
A kontrol konstruktorában elvégezzük a szükséges inicializációt, vagyis meghatározzuk annak a két befoglaló téglalapnak a méreteit, melyek a szabályzót, valamint a szabályzó skálával kiegészített rajzolatát befogadják.
rect = new Rectangle((int)(size*0.10),(int)(size*0.10),(int)(size*0.80),(int)(size*0.80));
scaleRect = new Rectangle(2,2,size-4,size-4);
Többek közt létrehozzuk az osztályszinten globális Graphics objektumunkat a képből, mely majd tartalmazza a rajzolatot.
image = new Bitmap(Width,Height);
g = Graphics.FromImage(image);
A szabályzó felületének színezéséhez a LinearGradientBrush osztályt használjuk, hogy egy színátmenetes hátteret kapjunk.
A kontrol készítése során felhasználunk néhány saját segédfüggvényt, megkönnyítendő az egyes részek rajzolását, vagy a pozíciók meghatározását. Most ezeket ismertetjük.
A GetDarker és GetLighter metódusokat azért készítettük, hogy egy megadott színből kinyerjünk egy másik színt, mely egy megadott értékkel kisebb, vagy nagyobb. A metódusokban csak annyit teszünk, hogy a megadott szín RGB alkotóiból – amennyiben az adott szám kisebb, mint az összetevő értéke – kivonjuk a megadott számot, illetve – amennyiben a szám és az alkotó értékének összege kisebb, mint 255 – hozzáadjuk a számot az alkotóhoz.
Az IsGoodPoint metódussal határozzuk meg, hogy a megadott koordináta a megadott téglalap területén belül van-e vagy nincs. Ez szükséges annak eldöntésére, hogy a felhasználó a szabályzó területén kattintott-e, vagy sem.
private bool IsGoodPoint(Point p ,Rectangle r)
{
  bool f = false;
  if (p.X > r.X && p.X < r.X + r.Width && p.Y > r.Y && p.Y < r.Y + r.Height)
  {
    f = true;
  }
  return f;
}
A HandlePos metódusban meghatározzuk a kis gombocska pozícióját, melynek értéke függ a szabályzó befoglaló méreteitől.
A MarkPoint metódus segítségével rajzoljuk meg a skála egy-egy egyenesét úgy. hogy első paraméterben megadjuk az adott egyenes kezdő, a második paraméterben a végpontjának koordinátáját.
A ValueFromPos metódusban megvizsgáljuk, hogy a gomb adott pozíciója mely értéknek felel meg a szabályzón.
A rajzolás az OnPaint metódusban történik meg, melyet felülírtunk az osztályban.
Első lépésben a globális Graphics objektumunkkal – mely egy képre rajzol – kitöltjük a szabályzó befoglaló téglalapjába rajzolt kört a megadott színnel.
g.FillEllipse(areaBrush,rect);
Majd a kör vonalának színét feketére cseréljük.
g.DrawEllipse(new Pen(Color.Black),rect);
Meghatározzuk a kis gomb pozícióját, majd egy Rectangle objektumot hozunk létre számára.
Point aPoint = HandlePos();
Rectangle r1 = new Rectangle(aPoint.X-3,aPoint.Y-3,6,6);
Ezekkel az adatokkal kirajzoljuk a gomb íveit.
g.DrawArc(new Pen(Color.Black),r1,-45,180);
g.DrawArc(new Pen(Color.Black),r1,135,180);
A következő lépés a skála felrajzolása a képre. Itt a minimum és a maximum értékek jelentik a támpontot, és természetesen a Step property-ben megadott lépésbeosztás.
for (int i=Minimum;i<=Maximum;i+=Step)
{
  g.DrawLine(new Pen(Color.Black),MarkPoint(0,i),MarkPoint(5,i));
}
Végül a metódus paraméteréből nyert Graphics objektummal kirajzoljuk a képet a kontrol (0; 0) pozíciójába.
gr.DrawImage(image,0,0);
A metódusban többek közt kezeljük az egér három eseményét, az egér gombjának lenyomását, felengedését, és mozgatását. Az egérrel megragadott gomb mozog, és az egérgomb felengedésekor megvizsgáljuk annak pozícióját, majd kalkuláljuk a szabályzó Value property-jének értékét.
A kontrol osztályában létrehoztunk egy delegáltat az érték beállításakor bekövetkező esemény kezelésére.
public delegate void ValueChangedEventHandler(object Sender);
Továbbá egy esemény objektumot, melyet akkor példányosítunk, amikor a Value property kiszámolásra és megadásra kerül.
public event ValueChangedEventHandler ValueChanged;
Ekkor az OnValueChanged metódus hívódik meg.
A hívó alkalmazásban majd erre az eseményre írunk egy kezelőmetódust, melyben lekérdezzük a szabályzó konkrét értékét.
private void volumerControl1_ValueChanged(object sender)
{
  progressBar1.Value = volumerControl1.Value;
  label2.Text = "Aktuális érték: " + volumerControl1.Value;
}
A kezelőmetódusban egy ProgressBar kontrol értékét állítjuk be a Value property-vel, valamint egy Label kontrol Text property-nek adjuk értékül azt.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 485. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |