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