info@tibysoft.huGrafika10. Rajzoló programA 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, TabStripfüggvények: utasítások: események: metódusok: Line, Circle, Cls, PSettulajdonságok: SelectedItemHozzunk létre egy standard exe projektet és a kapott formot méretezzük át8000x6000 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 ezegy PictureBox, tabla néven. Alá egy keretet helyezünk, ebben lesz arajzeszkö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 islétre és mentsük el. Legyen 6000x4000 twip méretű, “Beállítások” felirattal ésa mellékelt ikonnal. Elsőként tegyünk fel rá egy TabStrip vezérlést (a MicrosoftWindows Common Controls 6.0 (SP6 csomagban találjuk) és rögtön lépjünkbe a tulajdonságaiba. Itt, a Tabs fülön szúrhatunk be egy újabb “lapot”. Azegyes 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, illetvehatter néven. (A gyorsabb munka kedvéért először csak a vonal nevűt hozzuklétre.) Tudnunk kell, hogy bár úgy tűnhet, hogy a frame-eket a TabStripretettük, valójában a formon lesznek. Valamint a TabStrip füleire kattintva aprogram 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 akó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 kellvezé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 kellneveznü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 aké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égigondolvaa rajzolandó alakzatokat: a szakaszhoz és a téglalaphoz egyaránt két pontot kellmegadnunk a síkban, ez négy koordinátát jelent. A körhöz tudnunk kell a középpontját ésa 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 egyváltozó. Hogy melyik eszközzel kívánunk rajzolni, ahhoz sem árt egy. Végül a rajzolás ésa 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 IntegerPublic vszine, hszine As StringAkkor 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 opciokmegjelenítéséről és elrejtéséről kell gondoskodni:Az opciok formon:Private Sub mehet_Click()opciok.HideEnd SubA foablak formon:Private Sub beallitasok_Click()opciok.ShowEnd SubAkkor 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őlinduljanak. 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ű ahelyzet: 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 balszé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) / 2foablak.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 afelhasználó nem kattintgat a rajzeszközökön, hanem rögtön elkezd rajzolni? Programunknakakkor is tudnia kell, mit rajzoljon. Mivel a szakasz az alapértelmezett (annak a rádiógombja akivá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ésektulajdonságait:melyik = 0: hanyadik = 0Load opciokFor i = 0 To 5opciok.vszin(i).MousePointer = 99opciok.vszin(i).MouseIcon = LoadPicture(App.Path + "\handk.cur")opciok.hszin(i).MousePointer = 99opciok.hszin(i).MouseIcon = LoadPicture(App.Path + "\handk.cur")Next iEnd 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 kurzortkapjanak.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öbbenvannak, roppant egyszerű a dolog:Private Sub eszkoz_Click(Index As Integer)melyik = IndexEnd SubAzé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 Indexmegszű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.ClsEnd SubAkkor 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 fogjukmegoldani. (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ünkegy 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, ígymindhá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átnyilvá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 melyikCase 0:If hanyadik = 0 Thena1 = X: a2 = Yhanyadik = 1Elseb1 = X: b2 = Ytabla.Line (a1, a2)-(b1, b2), vszinehanyadik = 0End IfCase 1:If hanyadik = 0 Thena1 = X: a2 = Yhanyadik = 1Elseb1 = X: b2 = Ytabla.Line (a1, a2)-(b1, b2), vszine, Bhanyadik = 0End IfCase 2:If hanyadik = 0 Thenkx = X: ky = Yhanyadik = 1Elseb1 = X: b2 = Yr = Int(Sqr((b1 - kx) ^ 2 + (b2 - ky) ^ 2))tabla.Circle (kx, ky), r, vszinehanyadik = 0End IfEnd SelectEnd SubMint 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égpontjalogikailag 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 kellettszá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 aLine, 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 azelá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 PSetmetó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), vszineEnd IfEnd SubHá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 formkó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 avszine és hszine változóink alapértékéről:Private Sub Form_Load()opciok.Left = (Screen.Width - opciok.Width) / 2opciok.Top = (Screen.Height - opciok.Height) / 2vszine = vbBlackhszine = RGB(224, 223, 227)End SubHogy 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).BackColorEnd SubPrivate Sub vszin_Click(Index As Integer)vszine = vszin(Index).BackColorEnd SubUgye, 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 = FalseElse vonal.Visible = False hatter.Visible = TrueEnd IfEnd SubMint 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ínnelnincs 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- éshá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 = hszineopciok.HideEnd SubPrivate Sub megsem_Click()vszine = vbBlackhszine = RGB(224, 223, 227)opciok.HideEnd SubNos, ennyi... Kellemes rajzolgatást!forrásfile letöltéseLeckék: 123456789 10