Dr. Bit |
Programozzunk együtt!
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
2000. április 13., csütörtök 00:00
|
|
|