Rovat: Dr. Bit
2000. április 13., csütörtök 00:00
Programozzunk együtt! Az egér használata C++-ban és C-ben II.
Az egeret könnyedén lehet kezelni így. Az egérrel kapcsolatos funkciókat a 33-dik megszakítás meghívásával érheted el. Hogy hogyan? Ez nagyon egyszerû. Csak írd be az 'EGER' utasítást (miután persze bemásoltad a szükséges programsorokat! Lásd elõzõ cikk!) zárójel után az AX-et, ami az alfunkció sorozatszáma, majd utána következik a BX,CX,DX, amelyek a funkció paraméterei. Ezután a visszatérési értékeket megkapod rendre az AX,BX,CX,DX változókban. Ez lehet, hogy bonyolultan hangzik, de nem az. Most az elõzõ cikkben szereplõ példán mutatom be a használatát: A program elején volt egy 'EGER(0,0,0,0);' utasítás. Ez az egér iniciálása. Tehát: Bemenet: AX - 00h Visszatérés: AX - -1, ha az iniciálás sikeres, 0, ha sikertelen. BX - az egérgombok száma (Hány gombos az egér) Mikor lehet sikertelen az iniciálás? Ez elõfordulhat, ha például DOS alatt nincs betöltve az egérvezérlõ program. Ez egyszerûen ellenõrizhetõ egy if utasítással: if(!AX) { // A teendõk, ha az iniciálás sikertelen. } ((( Megjegyzés: 'if(!AX)' ugyanazt jelenti, mint az 'if(AX==0' feltétel. ))) Ha valamilyen paramétert nem kell megadni, akkor írj csak be nyugodtan 0-t! (Itt tehát az elsõ szám (a 0) a funkció száma, a többit azért hagytam meg 0-nak, mivel itt nem kellenek.) Tehát így hívod meg az egérkezelõt: EGER(AX,BX,CX,DX) Ha a Visszatérés-nél a 'NINCS VISSZATÉRÉSI ÉRTÉK' szerepel, akkor az azt jelenti, hogy nem változtatja meg a változók értékét. (Vagy a változók értékének megváltozása nem jelent semmit.) A FUNKCIÓKÓD TÁBLÁZAT: ====================== INT 33h Iniciálás: Bemenet: AX 0 Visszatérés: AX -1, ha az iniciálás sikeres, 0, ha sikertelen. BX az egérgombok száma (Hány gombos az egér) Az egérkurzor láthatóvá tétele: Bemenet: AX 1 Visszatérés: NINCS VISSZATÉRÉSI ÉRTÉK Az egérkurzor láthatatlanná tétele: Bemenet: AX 2 Visszatérés: NINCS VISSZATÉRÉSI ÉRTÉK Információ az egérkurzor helyérõl és a legyomott gombokról: Bemenet: AX 3 Visszatérés: BX 0 Nincsen lenyomott gomb 0. bit 1 Bal gomb lenyomva 1. bit 1 Jobb gomb lenyomva 2. bit 1 Középsõ gomb lenyomva CX 80 oszlopos képernyõn: CX 0 és 632 közötti érték CX/8 Oszlopszám(0-79) 40 oszlopos képernyõn: CX 0 és 624 közötti érték CX/16 Oszlopszám(0-39) DX DX 0 és 192 közötti érték DX/8 Sor száma(0-24) Az egérkurzor pozicionálása: Bemenet: AX 4 CX Oszloppozíció (0-624 vagy 632) DX Sorpozíció(0-192) Visszatérés: NINCS VISSZATÉRÉSI ÉRTÉK A gomb lenyomások száma: Bemenet: AX 5 BX 0,1,2 aszerint, hogy a BAL, JOBB, vagy KÖZÉPSÕ gombot akarod lekérdezni. Visszatérés: AX 0. bit 1 Bal gomb lenyomva 1. bit 1 Jobb gomb lenyomva 2. bit 1 Középsõ gomb lenyomva BX A lenyomások száma CX 80 oszlopos képernyõn: CX/8 Oszlopszám 40 oszlopos képernyõn: CX/16 Oszlopszám DX DX/8 Sor száma A gomb felengedések száma: Bemenet: AX 6 BX 0,1,2 aszerint, hogy a BAL, JOBB, vagy KÖZÉPSÕ gombot akarod lekérdezni. Visszatérés: AX 0. bit 1 Bal gomb lenyomva 1. bit 1 Jobb gomb lenyomva 2. bit 1 Középsõ gomb lenyomva BX A lenyomások száma CX 80 oszlopos képernyõn: CX/8 Oszlopszám 40 oszlopos képernyõn: CX/16 Oszlopszám DX DX/8 Sor száma Vízszintes mozgási tartomány megadása: (Csak a megadott két oszloppozíció között mozgatható az egérkurzor.) Bemenet: AX 7 CX A kezdõpozíció: 80 oszlopos képernyõn: Oszlopszám * 8 40 oszlopos képernyõn: Oszlopszám * 16 Grafikus képernyõn 0 és 624 vagy 632 közötti értéket adhatsz meg. DX A végpozíció: 80 oszlopos képernyõn: Oszlopszám * 8 40 oszlopos képernyõn: Oszlopszám * 16 Visszatérés: NINCS VISSZATÉRÉSI ÉRTÉK Függõleges mozgási tartomány megadása: (Az egérkurzor nem mozgatható a megadott sorokon kívülre. Bemenet: AX 8 CX A kívánt sor száma * 8, mint kezdõérték, szöveges képernyõn. A grafikus képernyõn tetszõleges értéket adhatsz meg. DX A kívánt sor száma * 8, mint végérték, szöveges képernyõn. A grafikus képernyõn tetszõleges értéket adhatsz meg. Visszatérés: NINCS VISSZATÉRÉSI ÉRTÉK Összes vízszintes és függõleges mozgás lekérdezése: Bemenet: AX 11 Visszatérés: CX 80 oszlopos képernyõn: CX/8 Összes vízszintes mozgás a sorban (Ha negatív, akkor több volt a BALRA mozgás, ha pozitív, akkor több volt a JOBBRA mozgás.) 40 oszlopos képernyõn: CX/8 Összes vízszintes mozgás a sorban (Ha negatív, akkor több volt a BALRA mozgás, ha pozitív, akkor több volt a JOBBRA mozgás.) DX DX/8 Összes függõleges mozgás. (Ha negatív, akkor több volt a FÖLFELÉ mozgás, ha pozitív, akkor több volt a LEFELÉ mozgás.) (A CX,DX -ben szereplõ érték "mickey" -ben értendõ, ami kb. 1/200 inch. Alapméretezésben 1 "mickey" egy képpontot jelent.) Képernyõlap megadása, amelyre az egérkurzor kerül: Bemenet: AX 29 BX A képernyõlap száma(Függ a video módtól.) Visszatérés: NINCS VISSZATÉRÉSI ÉRTÉK Melyik képernyõlapon van az egérkurzor: Bemenet: AX 30 Visszatérés: BX A képernyõlap száma Mint láthattad, elõfordultak bitek is a táblázatban. Ne rémülj meg tõlük! A használatuk nem nehéz. A következõ példaprogram bemutatja a használatukat. /* *** EGER2.C - Egy masodik egyszeru peldaprogram C -re. *** */ #include #include #include /* *** 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! */ clrscr(); EGER(0,0,0,0); if(!AX) { printf("nHiba: Nem talaltam egerdrivert!nAz eger nem inicialhato!n"); /* *** Nem talaltunk egertet. Kilepes *** */ return; } EGER(1,0,0,0); /* Legyen lathato az egerkurzor. */ printf("Egerhasznalat demo. A kilepeshez nyomj le egy billentyut!"); while (!kbhit()) /* Billentyulenyomasig ismetles. */ { EGER(3,0,0,0); /* Egerkurzor lekerdezese. */ gotoxy(1,2); clreol(); if(BX==1) { printf("Bal gomb lenyomva. BX ‚rt‚ke: %d",BX); delay(5); } if(BX==2) { printf("Jobb gomb lenyomva. BX ‚rt‚ke: %d",BX); delay(5); } if(BX==3) { printf("K”z‚ps‹ gomb lenyomva. BX ‚rt‚ke: %d",BX); delay(5); } } EGER(2,0,0,0); /* Ne legyen lathato az egerkurzor. */ return; } Nos hát ennyi volt. Természetesen van még több funkció is, de ezek
itt
a legfontosabbak.
|