CyberPress.Sopron

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

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 egér használata C++-ban és C-ben II.
avagy hogyan fogjuk munkára a "cincogót" DOS alatt?
Ott hagytuk abba, hogy megírtad az elsõ egérkezelõ programodat.
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   /* printf() */
#include /* int86() */
#include   /* getch() */
/* *** 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.
Ezzel befejeztem az alapvetõ egérkezelésrõl szóló részt, a következõ alkalommal a
grafikus módban való egérkezelést mutatom be.

PET

PET