Objektumok és osztályok Az objektumorientált programozás alapjai Rajzolás tollal, festés ecsettel A koordinátarendszer A vektorgrafikában az egyes grafikus elemeket (pontokat, szakaszokat, köröket, stb.) egy koordinátarendszerben helyezzük el. A Windows rendszerben minden objektumnak (űrlap, gomb, stb.) saját koordinátarendszere van. A koordinátarendszer origója az ablak bal felső sarka, az x tengely vízszintesen jobbra, az y tengely függőlegesen lefelé mutat. Ez természetesen következménye annak, hogy egy ablak átméretésekor az ablak bal felső sarka marad meg, a többi részét csökkenti vagy növeli a felhasználó. A koordinátarendszerben az egység a képpont, ebből következik, hogy a megrajzolható terület a képernyő felbontásától függ. Ezért ha olyan koordinátákat adunk meg, amelyek az adott felbontás mellett nincsenek a képernyőn, nem kapunk hibajelzést, csupán nem jelenik meg az ábra. Ha egy programot elindítunk, akkor a fő ablakának bal felső sarkát a képernyő koordinátarendszerében adjuk meg. Ha ez az ablak egy újabb objektumot nyit meg, akkor annak bal felső sarkát már a fő ablak koordinátarendszerében kell megadnunk stb., tehát minden objektumot a szülő objektumához viszonyítunk. Ez viszont azt is jelenti, hogy egy objektum koordinátái nem változnak, ha a szülő objektumot a felhasználó mozgatja. Ilyenkor csupán a szülő objektum bal felső sarkának koordinátái módosulnak az őt létrehozó objektumhoz képest. Graphics osztály használata Rajzoláshoz három objektum szükséges: egy toll egy ecset, amivel rajzolunk, egy objektum (vászon) amire rajzolunk és egy objektum ( kéz ), ami rajzol. A Windowsban e két utóbbi összetartozik: a Me űrlapra például a Me.CreateGraphics, a pb képdobozra pedig a pb.creategraphics objektum metódusaival rajzolhatunk. 1
Ezek a grafikus objektumok a Graphics osztály példányai. Különlegességük, hogy nem kell őket külön a New kulcsszóval példányosítani, a fenti hivatkozás esetén automatikusan létrejönnek. Ha az űrlapra a Me.CreateGraphics objektum metódusaival közvetlenül rajzolunk, meglehetősen hosszú programsorok keletkeznek. Ráadásul az objektum is minden hivatkozáskor újra és újra létrejön. Kevesebbet kell írnunk és az erőforrásokat is kevésbé terheljük, ha a grafikus objektumot egy alkalmas pillanatban pl. g néven eltároljuk. A deklarációs részben elhelyezett Dim utasítás nem hoz létre új objektumot, csupán jelzi, hogy lesz g néven egy grafikus objektum: Dim g As Grapgics Itt még nem célszerű a = Me.CreateGraphics utasítással a grafikus objektumot megadni, mert az űrlap csak a Load esemény hatására jön létre. Ekkor áll be pl. az űrlap kezdeti mérete is, tehát az ehhez tartozó eseménykezelő eljárásba célszerű tennünk az értékadást: A Pen osztály A tényleges ábra elkészítéséhez a g objektummal létrehozott kézbe még tennünk kell egy rajzoló vagy festő eszközt. Rajzoláshoz egy vagy több tollat (a Pen osztály objektumai), míg festéshez egy vagy több ecsetet (Brush osztály) használhatunk. A toll két legfontosabb paramétere a szín (Color) és a vastagsága (Width). A következő deklaráció egy új tollat hoz létre, melynek színe kék, vastagsága pedig 3 pixel. (A szín megadása kötelező, a vastagság elhagyható.): Dim toll As New Pen (Color.Blue, 3) A toll paramétereit a programunk során bármikor módosíthatjuk, így egyszerű ábra esetén elég egy tollat definiálni, melynek változtatjuk tulajdonságait: toll.color = Color.Red toll.width = 10 A fentiek helyett használhatjuk a Pens nevű osztály előre definiált 1 vastagságú tollait is. Ebben az esetben nem kell toll objektumot külön definiálni, hanem ahol egy kék tollra van szükségünk, ott elegendő beírni a toll helyett, hogy Pens.Blue. Az így kapott toll színét listából választhatjuk ki. Rajzolás tollal A tollal való rajzoláshoz a Graphics osztály Draw-val kezdődő metódusait kell meghívni. A metódus első paramétere minden esetben az a toll, amellyel a rajzolást végezzük. Ezek közül példaként nézzünk meg hármat: 2
Szakasz rajzolása a DrawLine(toll x1, y1, x2, y2) metódussal történik, ahol (x1, y1) a szakasz kezdőpontja, (x2, y2) pedig a szakasz végpontja. Ha a kezdőpont megegyezik a végponttal, akkor egy pontot kapunk. Téglalap rajzoláséhoz a DrawRectangle (toll, x, y, w, h) metódust használhatjuk, ahol (x, y) a téglalap bal felső csúcsa, a w a szélessége, h pedig a magassága. A w és h értéke negatív is lehet. Kör (és ellipszist) a DrawEllipse (toll, x, y, w, h) metódus meghívásával rajzolhatunk, itt a paraméterek a kört (ellipszist) tartalmazó téglalap adatai. Példa: A következő program az OK gomb hatására egy tiltótáblaszerű alakzatot rajzol: Dim toll As New Pen(Color.Red, 5) g.drawline(toll, 100, 100, 150, 150) g.drawellipse(toll, 100, 100, 50, 50) toll.color = Color.Black g.drawrectangle(toll, 80, 80, 90, 90) Point és a Rectangle osztály A Visual Basic hasznos absztrakciója a pont és a téglalap objektum. Egy pontot (Point osztály) a koordinátáival adhatunk meg. A téglalapokat (Rectangle osztály) pedig négy adattal: ezek a bal felső sarok X és Y koordinátái, továbbá a szélessége (width) és a magassága(height). Példa: Két pontot (p, q) és egy téglalapot (t) hozzunk létre és ezek segítségével rajzoljuk meg az előző ábrát. A t téglalap adatait utólag módosítjuk: Dim toll As New Pen(Color.Red, 5) Dim p, q As Point Dim t As New Rectangle(100, 100, 50, 50) p = New Point(100, 100) q = New Point(150, 150) g.drawline(toll, p, q) g.drawellipse(toll, t) toll.color = Color.Black t.x = 80 t.y = 80 t.width = 90 t.height = 90 g.drawrectangle(toll, t) 3
Ecset használata Kitöltött alakzatok készítéséhez az ecsetet ( Brush) kell használnunk, melyből többféle is létezik, a kitöltéstől függően. A legegyszerűbb ecset egy színnel tölti a területet, míg színátmenet készítéséhez vagy adott pixelgrafikus ábrával való mintázáshoz stb. különleges ecseteket kell készítenünk. Az ecsettel való festéshez a Graphics osztály Fill-el kezdődő metódusait használjuk, melynek első paramétere megegyezik a rajzolásnál használt neki megfelelő metódus adataival. Az egyszínű ecset a SolidBrush osztály tagja, létrehozásakor csupán a színét kell megadnunk. Példánk egy nagy piros foltot fest a képernyőre: Dim ecset1 As New SolidBrush(Color.Red) Dim t As New Rectangle(100, 100, 50, 50) g.fillellipse(ecset1, t) A legáltalánosabb esetben az ecset mintázatát (ahogy a festők esetében a festőhengerét) egy pixelgrafikus képben adhatjuk meg. A képet pl. a Paint segítségével készíthetjük el. Az ilyen ecset a TextureBrush osztály tagja: Dim ecset2 As New TextureBrush(Bitmap.FromFile( C:\ecsetem.bmp )) Dim t As New Rectangle(100, 100, 300, 300) g.fillrectangle(ecset2, t) Szöveg kiírása, Font osztály Szöveg kiírásához a Graphics osztály DrawString metódusát használjuk. A metódusnak 5 paramétere van: a kiírandó szöveg, a betű formai adatai (font), a festéshez használt ecset és a szöveg bal felső sarkának koordinátái. A fontot legegyszerűbben úgy adhatjuk meg, hogy egy másik objektum font tulajdonságára hivatkozunk. A következő sorban pl. a szöveg kiíratása a Button1 gomb betűkészletével történik: g.drawstring( Mi ez?, Button1.Font, Brushes.Black, 100, 100) 4
A fontot, mint objektumot természetesen magunk is definiálhatjuk. Ekkor a szövegszerkesztésben megismert három adatot, a típust, a méretet és a stílust kell megadnunk: Dim betű As New Font ( Arial, 30, FontStyle.Bold) g.drawstring( Mi ez?, betű, Brushes.Black, 100, 100) rajzolás festés alakzat DrawArc Ívet rajzol DrawBezier Bezier-görbét rajzol DrawClosedCurve FillClosedCurve Zárt görbét rajzol/tölt ki DrawCurve Görbét rajzol DrawEllipse FillEllipse Ellipszist rajzol/tölt ki DrawImage Képet rajzol DrawIcon Ikont rajzol DrawLine Vonalat húz DrawLines Vonalakat húz DrawPath FillPath Grafikus görbét rajzol/tölt ki DrawPie FillPie Körszeletet rajzol/tölt ki Feladatok: 1) Rajzoljuk meg az olimpiai ötkarikát! Az egyes színek sorrendje az első sorban kék, fekete, piros, a második sorban pedig rendre sárga, zöld. 2) Vonalkázzunk be átlósan egy négyzetet! 3) Rajzoljunk négyzethálót! 4) Rajzoljuk meg egy körsort! 5) Rajzoljuk meg a sakktáblát! 6) Rajzoljunk céltáblát! 5