CyberPress.Sopron

(http://www.cyberpress.hu/)

Rovat: Dr. Bit

2000. április 13., csütörtök 00:00


Programozzunk együtt!

Rajzolás az egérrel

Rajzolás az egérrel
Miután megismerkedtél az egérkezeléssel, már könnyedén megérted a következõ példaprogramot. A program folyamatosan lekérdezi az egér pozícióját és, ha lenyomták a bal gombot, akkor oda kirak egy fehér színû kört. Azonban az egérkurzornak van egy hátránya: ha egy területre úgy rajzolsz, hogy ott van, akkor ott az eredeti képernyõtartalom marad meg: itt például a kör körülbeül egynegyede hiányoznia fog a fekete háttér miatt. Hogyan lehet ezt megoldani? Nem is olyan nehéz: Ha a felhasználó lenyomta a bal gombot, akkor nem csak rögtön kirakjuk a kört, hanem elõtte a kurzort áthelyezzü a képernyõ más részébe, majd kirajzoljuk a kört, és végül visszahelyezzük a kurzort. Az átpozícionálás akkor a legjobb, ha olyan helyet adsz meg, amely semmiképpen nem lehet látható: például lekérdezed a maximális X pozíciót, és hozzáadsz 50-et. A maximális képernyõpozíciót a 'getmaxx()' függvénnyel kérdezheted le. Én most az egyszerûség kedvéért az x=1, y=1 pozícióra helyeztem át. Az áthelyezés elõtt azonban érdemes egy-egy változóba elmenteni a CX és DX értékét(X és Y pozíció), mivel lehetséges, hogy az ehérkezelõ megszakítás módósítja õket, így rossz helyre raknánk vissza a kurzor, ami, ha nem is tragédia, de azért hosszú távon elég idegesítõ. A kört most nem 'circle()' utasítással rajzoltattam kim - mivel így nem adható meg kitöltési minta - hanem egy 'sector()' utasítással, ami így használva ugyanúgy kört eredményez. Most nézd át a példaprogramot, így jobban megérted majd az elméletet:
/* *** EGER4.C - Egy egyszeru grafikus peldaprogram C -re. *** */ /* *** A programmal egyszeru rajzokat keszithetsz egerrel. *** */ #include /* printf() */ #include /* int86() */ #include /* getch() */ #include /* grafikai rutinok */ /* *** Az altalunk irt egervezerlo. *** */ #define EGER(k,l,m,n); inregs.x.ax=k; inregs.x.bx=l; inregs.x.cx=m; inregs.x.dx=n; int86(0x33,&inregs,&outregs); AX=outregs.x.ax; BX=outregs.x.bx; CX=outregs.x.cx; DX=outregs.x.dx; /* *** MAIN *** */ void main(void) { union REGS inregs, outregs; /* Az eger hasznalatahoz KELL! */ int AX,BX,CX,DX; /* Az eger hasznalatahoz KELL! */ int oldx,oldy; EGER(0,0,0,0); /* Inici ljuk az egeret. */ if(!AX) { printf("nHiba: Nem talaltam egerdrivert!nAz eger nem inicialhato!n"); /* *** Nem talaltunk egeret. Kilepes *** */ return; } int gdriver = VGA, gmode=VGAHI, errorcode; initgraph(&gdriver, &gmode, ""); /* Inici ljuk a grafukus rendszert. */ errorcode = graphresult(); if (errorcode != grOk) /* Hiba eset‚n kilepunk. */ { printf("Grafikus hiba: %sn", grapherrormsg(errorcode)); return; } EGER(1,0,0,0); /* Legyen lathato az egerkurzor. */ outtextxy(3,5,"Egerhasznalat demo. A kilepeshez kattints a JOBB egergombbal!"); while (BX!=2) /* A jobb gombal valo kattintasig ismetles. */ { EGER(3,0,0,0); /* Egerkurzor lekerdezese. */ if(BX==1) { setcolor(WHITE); setfillstyle(SOLID_FILL,WHITE); oldx=CX; /* Mentjuk az eger X poziciojat. */ oldy=DX; /* Mentjuk az eger Y poziciojat. */ EGER(4,0,1,1); /* Az egerkurzor athelyezese. */ sector(oldx,oldy,0,360,5,5); /* A kor kirajzolasa. */ EGER(4,0,oldx,oldy); /* Az egerkurzor visszahelyezes */ } } EGER(2,0,0,0); /* Ne legyen lathato az egerkurzor. */ closegraph(); /* A grafikus rendszer lezarasa. */ return; } /* Peldaprogram vege. */
Hogy mi az értelme ennek? Gondolj bele, például írsz egy programot, aminek grafikus felülete van. Sokkal egyszerûbb megrajzolni az egérrel a hátterét, ezt elmenteni, és végül a programba egy saját rutinnal behívni, és kirajzolni. Egy olyan programrészt, ami ugyanezt eredményezné, csak kemény munkával lehetne megalkotni. Hát mostanra ennyit! A következõ alkalommal a grafikus képernyõ elmentésével fogok foglalkozni. PET