info@tibysoft.hu Grafika 10. Rajzoló program A feladat: Készítsünk egy programot, melynek segítségével a felhasználó rajzolhat szakaszt, téglalapot és kört, két pont megadása alapján! Ezek legyenek: szakasz esetén a két végpont, táglalapnál a bal felső és a jobb alsó csúcs, körnél a középpont és egy kerületi pont. Legyen lehetőség a szabadkézi rajzolásra is! A program tartalmazzon lehetőségeket a vonalszín és a háttérszín beállítására is!   A feladat célja: Grafika alapjainak megismerése, használata. Új elemek: objektumok: Screen, TabStrip függvények: utasítások: események: metódusok: Line, Circle, Cls, PSet tulajdonságok: SelectedItem Hozzunk létre egy standard exe projektet és a kapott formot méretezzük át  8000x6000 twip szélességűre és magasságúra, valamint nevezzük át foablak-  ra. Állítsuk be, hogy ne legyen átméretezhető, a címsorába pötyögjük be,  hogy “Rajzoló program”. A mellékelt ikont is tegyük bele.  Lássuk mi kell a formra! Elsőként egy terület, ahol rajzolhatunk. Legyen ez  egy PictureBox, tabla néven. Alá egy keretet helyezünk, ebben lesz a  rajzeszközök vezérléstömbje, eszkoz néven, 0-tól 3-ig terjedő indexekkel.  Alatta lesz a három parancsgomb, ahogy a képen is látható.  A Beállítások feliratú gombra kattintva jutunk majd az opciok formra, hozzuk is  létre és mentsük el. Legyen 6000x4000 twip méretű, “Beállítások” felirattal és  a mellékelt ikonnal. Elsőként tegyünk fel rá egy TabStrip vezérlést (a Microsoft  Windows Common Controls 6.0 (SP6 csomagban találjuk) és rögtön lépjünk  be a tulajdonságaiba. Itt, a Tabs fülön szúrhatunk be egy újabb “lapot”. Az  egyes indexű felirata lesz a vonalszín, a kettesé a háttérszín.  Ezt követően tesszük fel a két fülhöz logikailag tartozó kereteket vonal, illetve  hatter néven. (A gyorsabb munka kedvéért először csak a vonal nevűt hozzuk  létre.) Tudnunk kell, hogy bár úgy tűnhet, hogy a frame-eket a TabStripre  tettük, valójában a formon lesznek. Valamint a TabStrip füleire kattintva a  program futása közben, a fülek váltása is csak látszólagos. Vagyis ahhoz, hogy a megfelelő keret legyen látható ilyenkor - nekünk kell megírni a  kódot. Szóval a vonal nevű keretbe rajzoljuk az első PictureBoxot. A neve legyen vszin. Ezt másolva alakítjuk ki a hatelemű vezérléstömböt, 0-  tól 5-ig terjedő indexekkel. Ezek után beállítjuk a háttérszíneket, ahogy a képen is látható.  Ha ezzel megvagyunk, kiválasztjuk a keretet és duplikáljuk, persze nem kell  vezérléstömb a keretből. Az új példánynak a hatter nevet adjuk. Persze a vszin nevű  elemek vezérléstöbje így tovább bővült 6-tól 11-ig terjedő indexekkel, ezeket át kell  neveznünk hszin-re és az indexeket is át kell írnunk 0-tól 5-ig. Ha ezzel megvagyunk,  jöhet a két parancsgomb.  Ezután még hozzunk létre egy modult, ebben fogjuk deklarálni a változóinkat, hiszen a  két form között fontos az adatcsere. Akkor következhet a kódolás. Elsőként jöjjenek a deklarációk a modulban. Végigondolva  a rajzolandó alakzatokat: a szakaszhoz és a téglalaphoz egyaránt két pontot kell  megadnunk a síkban, ez négy koordinátát jelent. A körhöz tudnunk kell a középpontját és  a sugarát, ez három változót takar. Mivel programunknak meg kell tudni különböztetni pl.  a szakasznál, hogy éppen a kezdő- vagy a végpontot adjuk-e meg, ehhez is kell egy  változó. Hogy melyik eszközzel kívánunk rajzolni, ahhoz sem árt egy. Végül a rajzolás és  a háttér színéhez két stringváltozót kell felvennünk. Vegyük észre, hogy vszine és hszine  - nem vszin és hszin a nevük, hiszen ezek már foglaltak!  Tehát: Public a1, a2, b1, b2, kx, ky, r, hanyadik, melyik As Integer  Public vszine, hszine As String  Akkor most kapcsoljuk össze a két formot, hogy váltogatni tudjunk köztük. Mivel a foablak állandóan látható lesz, valójában csak az opciok  megjelenítéséről és elrejtéséről kell gondoskodni:  Az opciok formon: Private Sub mehet_Click()  opciok.Hide  End Sub  A foablak formon: Private Sub beallitasok_Click()  opciok.Show End Sub  Akkor következzen a foablak Load() eseménykezelője. Talán feltűnt, hogy a formok létrehozása után nem állítottuk be, hogy középről  induljanak. Azért, mert ezt most a kódból fogjuk megtenni. Bár ezt a tanulók valamiért nagyon nehezen értik meg, de nagyon egyszerű a  helyzet: ha pl. a képernyő szélességéből kivonjuk a formunk szélességét és ezt a különbséget elfelezzük, megkapjuk, hol legyen a form bal  széle. Talán ez a magyarázó ábra segít:  Tehát a megoldás:  Private Sub Form_Load()  foablak.Left = (Screen.Width - foablak.Width) / 2  foablak.Top = (Screen.Height - foablak.Height) / 2  (részlet eleje) Ezt követően adjunk 0 kezdőértéket a melyik és a hanyadik változónknak. Hogy miért? A melyik,  amelyben a kiválasztott alakzat (eszkoz) indexét tároljuk, azért kap nullát, mert mi van, ha a  felhasználó nem kattintgat a rajzeszközökön, hanem rögtön elkezd rajzolni? Programunknak  akkor is tudnia kell, mit rajzoljon. Mivel a szakasz az alapértelmezett (annak a rádiógombja a  kiválasztott), ezért azt kell ilyenkor rajzolni, az pedig nullás indexű. A hanyadik pedig azért nulla,  mert induláskor az első kattintás következik.  Ezután pedig töltsük be az opciók formot a memóriába, hogy elérhessük a rajta lévő vezérlések  tulajdonságait:  melyik = 0: hanyadik = 0  Load opciok  For i = 0 To 5  opciok.vszin(i).MousePointer = 99  opciok.vszin(i).MouseIcon = LoadPicture(App.Path + "\handk.cur")  opciok.hszin(i).MousePointer = 99  opciok.hszin(i).MouseIcon = LoadPicture(App.Path + "\handk.cur")  Next i  End Sub  (részlet vége) Ahogy azt már az 5. leckében is tettük, a MouseIcon és a MousePointer tulajdonságok segítségével érjük el, hogy a színválasztó mezők kurzort  kapjanak.  Ha már úgyis előkerült, nézzük, mia a teendő, ha valamelyik eszközön kattintunk (szakasz, téglalap, stb. rádiógombok). Mivel vezérléstöbben  vannak, roppant egyszerű a dolog:  Private Sub eszkoz_Click(Index As Integer)  melyik = Index  End Sub  Azért kell megőriznünk az Index értékét, mert rajzoláskor tudnunk kell, mit is rajzoltassunk, ám a Click() eseményből kilépve az Index  megszűnik létezni.  A Törlés gomb lekezelése is roppant egyszerű, csak egy Cls metódus kell hozzá:  Private Sub torles_Click()  tabla.Cls  End Sub  Akkor jöjjön maga a rajzolás, a feladat legérdekesebb része. A szakasz, a téglalap és a kör rajzolását a MouseDown eseménykezelőben fogjuk  megoldani. (A szabadkézi rajzolás másként és máshol lesz.) A megoldás elve végtelenül egyszerű: a három választható alakzat miatt készítünk  egy háromágú elágazást. Mivel az első kattintáskor tárolni kell a pont két koordinátáját, míg a 2. kattintáskor tárolni majd rajzolni is kell, így  mindhárom ágba egy-egy klasszikus kétágú elágazást helyezünk. Ezekben az előbb említett tároláson és rajzoláson kívül a kattintások számát  nyilvántartó hanyadik nevű változó léptetéséről sem szabad elfelejtkeznünk.  Akkor lássuk a megoldást:  Private Sub tabla_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)  Select Case melyik  Case 0:  If hanyadik = 0 Then  a1 = X: a2 = Y  hanyadik = 1  Else  b1 = X: b2 = Y  tabla.Line (a1, a2)-(b1, b2), vszine  hanyadik = 0  End If  Case 1:  If hanyadik = 0 Then  a1 = X: a2 = Y  hanyadik = 1  Else  b1 = X: b2 = Y  tabla.Line (a1, a2)-(b1, b2), vszine, B  hanyadik = 0  End If  Case 2:  If hanyadik = 0 Then  kx = X: ky = Y  hanyadik = 1  Else  b1 = X: b2 = Y  r = Int(Sqr((b1 - kx) ^ 2 + (b2 - ky) ^ 2))  tabla.Circle (kx, ky), r, vszine  hanyadik = 0  End If  End Select  End Sub  Mint az látható, a MouseDown X és Y paraméterét kiolvasva szerezzük meg a bemenő adatainkat. Maga a tényleges rajzolás sem túl bonyolult.  Szakasz és téglalap esetén a tabla nevű PictureBox Line metódusát használjuk. Azért ennyire hasonlók, mert egy szakasz két végpontja  logikailag megfelel a téglalap átlójának. Az eltérés mindössze annyi, hogy téglalap esetén ezt egy B paraméterrel megtoldjuk.  A körnél kicsivel több munkánk volt, hiszen a középpont és a kerületi pont koordinátáinak meg szerzését követően azokból még ki kellett  számolni a kör sugarát az általános köregyenlet alapján (ld: koordinátageometria), arra is odafigyelve, hogy a Circle metódus (mint ahogy a  Line, de bármilyen más rajzolási metódus is) csak egész értékeket kaphat.  Végezetül látható, hogy első kattintáskor a nulla kezdőértékű hanyadik változónk egyre vált át - így jut be a következő kattintáskor az  elágazások 2. ágába a vezérlés, ahol a rajzolást követően természetesen újra a nulla értéket kapja meg.  Akkor jöhet a szabadkézi rajzolás, aminek a lényege, hogy a bal egérgombot nyomvatartva és az egeret mozgatva pontokat teszünk le, a PSet  metódus alkalmazásával:  Private Sub tabla_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)  If Button = 1 And melyik = 3 Then      tabla.PSet (X, Y), vszine  End If  End Sub  Hát ez nem volt túl bonyolult... Ha a kilépést is megírtuk - ahol mindkét formról gondoskodtunk, remélem -, ugorjunk neki az opciok form  kódolásának. Ígérem nem lesz se nehéz, se hosszú.  Elsőnek jöjjön a form Load() eseménykezelője. Itt - a foablakhoz hasonlóan - szintén gondoskodnunk kell a középen indulásról, valamint a  vszine és hszine változóink alapértékéről:  Private Sub Form_Load()  opciok.Left = (Screen.Width - opciok.Width) / 2  opciok.Top = (Screen.Height - opciok.Height) / 2  vszine = vbBlack  hszine = RGB(224, 223, 227)  End Sub  Hogy szemléletes legyen, váltva használtuk a gyárilag beépített színkonstanssal (vbBlack) és a 3. leckében megismert RGB függvénnyel való  színmegadást. Következzen most a színek módosítása:  Private Sub hszin_Click(Index As Integer)  hszine = hszin(Index).BackColor  End Sub  Private Sub vszin_Click(Index As Integer)  vszine = vszin(Index).BackColor  End Sub  Ugye, milyen jó dolog a vezérléstömb? Nézzük, hogyan oldjuk meg a vonalszín és a háttérszín keretének váltogatását a TabStripen kattintva:  Private Sub TabStrip1_Click()  If TabStrip1.SelectedItem.Index = 1 Then      vonal.Visible = True      hatter.Visible = False  Else      vonal.Visible = False      hatter.Visible = True  End If  End Sub  Mint látjuk, drámai egyszerűséggel a láthatóságot váltogatjuk egy elágazásban. Amikor a TabStripet elhelyeztük és még egy fület szúrtunk be,  megfigyelhettük, hogy a fülek (Tab) 1-től számozódnak (Index). Így az elágazás feltételében mindössze a kiválasztott Tab indexét kell figyelni.  Már csak két dolog maradt hátra: a Mehet és a Mégsem gombok kezelése. Mehet esetén át kell állítanunk a tabla háttérszínét. A vonalszínnel  nincs ilyen dolgunk, hiszen az a rajzoló utasításokban kerül felhasználásra. Mégsem esetén pedig visszaállítjuk az alapértelmezett vonal- és  háttérszínt. Végül: bármelyik gombot nyomtuk meg a kettőből, az opciok formot el kell rejtenünk.  Tehát: Private Sub mehet_Click()  foablak.tabla.BackColor = hszine  opciok.Hide  End Sub  Private Sub megsem_Click()  vszine = vbBlack  hszine = RGB(224, 223, 227)  opciok.Hide  End Sub  Nos, ennyi... Kellemes rajzolgatást!  forrásfile letöltése Leckék: 1 2 3 4 5 6 7 8 9 10