Hlavní navigace

SVGAlib: funkce pro používání myší

Jakub Matys

V dnešním dílu seriálu o knihovně SVGAlib si doděláme funkce pro používání myší.

void mouse_setscale(int s);

Tato funkce nastavuje poměr mezi pohybem fyzické myši a pohybem kurzoru na obrazovce. Budete-li tedy zvyšovat hodnotu parametru, bude kurzor myši stále „línější“. Pokud parametr nastavíte na zápornou hodnotu, bude se kurzor pohybovat v opačném směru než myš. Ve stávající verzi knihovny není možné nastavit rychlost kurzoru v rozmezí 0 až 1, což by umožňovalo efekt zrychlení kurzoru. Defaultně je rychlost nastavena na 1.

void mouse_setwrap(int state);

Funkce nastavuje reakci na to, když kurzor dosáhne okraje plochy. state by mělo nabývat hodnoty MOUSE_WRAP, MOUSE_NOWRAP, nebo bitového součtu hodnot MOUSE_WRAPX, MOUSE_WRAPY, MOUSE_WRAPZ, MOUSE_WRAPRX, MOUSE_WRAPRY nebo MOUSE_WRAPRZ.

void mouse_setxrange(int x1, int x2);
void mouse_setyrange(int y1, int y2);

Dvě výše definované funkce nastavují hranice kurzoru myši. x1, x2, y1 a y2 jsou uspořádané od leva(x1) a spodu(y1) obrazovky. Hodnoty vracené funkcemi mouse_getxa mouse_gety budou vždy mezi těmito hodnotami.

int mouse_update(void);

Čte události myši z bufferu zařízení a aktualizuje interní proměnné knihovny (uchovávají pozici myši, stav tlačítek atd.). Funkce vrací 0, pokud se neudály žádné události od poslední aktualizace, nebo vrací nenulovou hodnotu.

void mouse_waitforupdate(void);

Čte události myši jako výše popsaná funkce. Funkce se však nevrací, dokud nevznikne nějaký podnět myši.

int mouse_getx(void);
int mouse_gety(void);
int mouse_getbutton(void);

Tyto tři rutiny vrací aktuální pozici kurzoru a stav tlačítek. mouse_getbutton vrací integer, jeho hodnota může být bitovým násobkem hodnot MOUSE_LEFTBUTTON, MOUSE_MIDDLEBUTTON, MOUSE_RIGHTBUTTON, MOUSE_FOURTHBUTTON, MOUSE_FIFTHBUTTON, MOUSE_SIXTBUTTON nebo MOUSE_RESETBUTTON. Pokud funkce vrátí 0, žádné tlačítko nebylo stisknuto. Před voláním funkce musíte zajistit aktualizaci informací, a to voláním funkce mouse_update nebo mouse_waitforup­date.

void mouse_getposition_6d(int *x, int *y, int *z, int *rx, int *ry, int *rz);
void mouse_setposition_6d(int x, int y, int z, int rx, int ry, int rz, int dim_mask);
void mouse_setrange_6d(int x1, int x2, int y1, int y2, int z1, int z2, int rx1, int rx2, int ry1, int ry2, int rz1, int rz2, int dim_mask); 

Tyto funkce dělají ty samé akce jako mouse_getx, mouse_gety, mouse_setxrange, mouse_setyrange a mouse_setposition, ale pracují ve všech šesti dimenzích (x, y, z) a v rotacích kolem nich.

Pokud mouse_getposi­tion_6d vrátí některé hodnoty jakoNULLové, znamená to, že tyto dimenze nejsou použity.

mouse_setposi­tion_6d a mouse_setrange_6d používají také další argument – din mask, který by měl být logickým součtem hodnot MOUSE_XDIM, MOUSE_YDIM, MOUSE_ZDIM, MOUSE_RXDIM, MOUSE_RYDIM a MOUSE_RZDIM. Pro dimenze XY, XYZ a XYZrXrYrZ mohou být také použity konstanty 2DIM, 3DIM a 6DIM. Pozice nebo hranice kurzoru budou nastaveny pouze tehdy, pokud jsou zaneseny v dim_mask. 6d funkce mohou být tedy použity i pro „klasické“ myši.

typedef void (*__mouse_handler) (int button, int dx, int dy, int dz, int drx, int dry, int drz); /* definováno v vgamouse.h */
void mouse_seteventhandler(__mouse_handler handler);
void mouse_setdefaulthandler(void); 

1) mouse_update a mouse_waitforupdate budou volat tuto funkci pro každou změnu stavu myši. 2) nastavuje defaultní handler.

To by bylo pro dnešek vše. Příště se podíváme na používání klávesnice v raw módu.

Našli jste v článku chybu?

9. 10. 2004 17:57

PC John (neregistrovaný)

Já mám otázku ohledně myši. Mám pocit, že fyzické rozlišení myši je podstatně vyšší než opravdový posun kurzoru po obrazovce. Chtěl bych se proto zeptat, zda-li o tom někdo něco neví a jak bych mohl tuto přesnou pozici kurzoru získat.

Něco takového umí DirectInput od Microsoftu. Takže v nějaké hře, kde myší člověk mění směr pohledu uživatele, máme prostě vyšší přesnost.

John





Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: „Black Friday 2016“: závěrečné zhodnocení

„Black Friday 2016“: závěrečné zhodnocení

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

DigiZone.cz: Flix TV startuje i na Slovensku

Flix TV startuje i na Slovensku

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

Vitalia.cz: Co pomáhá dítěti při zácpě?

Co pomáhá dítěti při zácpě?

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?

Vitalia.cz: Když přijdete o oko, přijdete na rok o řidičák

Když přijdete o oko, přijdete na rok o řidičák

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

Podnikatel.cz: Snížení DPH na 15 % se netýká všech

Snížení DPH na 15 % se netýká všech

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Měšec.cz: mBank cenzuruje, zrušila mFórum

mBank cenzuruje, zrušila mFórum

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu