1. Jak sprawić, aby kursor pojawił się na ekranie?
Aby uaktywnić kursor wystarczy do rejestru AX wstawić wartość 1 i wywołać przerwanie 33h.
Procedure ShowCursor; Assembler;
Asm
mov ax, 0001h
int 33h
End;
|
2. Jak schować kursor?
Jeśli chcemy, aby kursor znów był niewidoczny postępujemy podobnie jak przy poprzedniej procedurze, z tą różnicą, że zamiast 1 do AX wstawiamy 2.
Procedure HideCursor; Assembler;
Asm
mov ax, 0002h
int 33h
End;
|
3. Jak sprawdzić pozycje kursora i czy naciśnięty został jakiś przycisk?
Do odczytania statusu kursora (pozycja i przyciski) wstawiamy do AX wartość 3. Po wywołaniu przerwania w rejestrach BX, CX i DX zostaną zwrócone wartości, które informują nas o statusie:
BX - jakie przyciski zostały naciśnięte,
CX - pozycja kursora w poziomie (współrzędna X),
DX - pozycja kursora w poziomie (współrzędna Y).
Procedure GetStatus(Var X, Y, ButtonStatus :Integer);
Var
Temp1, Temp2, Temp3 :Word;
Begin
Asm
mov ax, 0003h
int 33h
mov Temp1, bx
mov Temp2, cx
mov Temp3, dx
End;
ButtonStatus := Temp1;
X := Temp2;
Y := Temp3;
End;
|
Należy jeszcze wspomnieć o wartości zwracanej przez BX, jest nią liczba, której poszczególne bity oznaczają czy został naciśnięty jakiś przycisk:
A więc, w zależności od zawartości rejestru BX możemy wyszczególnić różne kombinacje:
Niestety, jeśli chodzi o środkowy przycisk to nie zawsze przerwanie wykrywa jego naciśnięcie, jest to zależne od myszki.
4. Jak ograniczyć pole, po jakim porusza się kursor?
Ograniczając pole poruszania się myszki nie definiujemy od razu jednego obszaru, musimy podać osobno ograniczenie w pionie i poziomie. Oto procedury to realizujące:
W poziomie
Procedure DefineHorRange(Min, Max :Integer); Assembler;
Asm
mov ax, 0007h
mov cx, Min
mov dx, Max
int 33h
End;
|
W pionie
Procedure DefineVerRange(Min, Max :Integer); Assembler;
Asm
mov ax, 0008h
mov cx, Min
mov dx, Max
int 33h;
End;
|
Gdzie Min i Max to dolna i górna granica ograniczenia.
Teraz możemy napisać jedną procedurę do definiowania od razu całego obszaru:
Procedure MouseZone(X1, Y1, X2, Y2 :Integer);
Begin
DefineHorRange(X1,X2);
DefineVerRange(Y1,Y2);
End;
|
5. Jak sprawdzić czy kursor znajduje się w jakimś polu?
Tu przyda się nam wcześniej napisana funkcja do sprawdzania pozycji (i statusu myszki) - GetStatus. Pobieramy współrzędne kursora i porównujemy je ze współrzędnymi narożnych punktów naszego obszaru:
Function MouseIn(X1, Y1, X2, Y2 :Integer) :Boolean;
Var
MouseStatus, PosX, PosY :Integer;
Begin
GetStatus(PosX,PosY,MouseStatus);
If (PosX >= X1) And (PosX <= X2) And
(PosY >= Y1) And (PosY <= Y2) Then MouseIn := True
Else MouseIn := False;
End;
|
Funkcja zwróci wartość True jeśli kursor znajduje się w zadanym obszarze, w przeciwnym razie zwróci False.
6. Jak sprawdzić/zmienić wrażliwość myszki?
Na koniec sprawdzimy / ustawimy wrażliwość myszki. Im wrażliwość będzie większa tym przy mniejszym poruszeniu myszki kursor przebędzie większą drogę na ekranie. Ustawiamy wrażliwość w pionie (Vertical, zmienna Ver) i w poziomie (Horizontal, zmienna Hor).
Domyślne wartości to: Pion (Vertical) 16 pikseli Poziom (Horizontal) 8 pikseli.
Ustawianie wrażliwości myszki
Procedure SetSensivity(Hor, Ver :Integer); Assembler;
Asm
mov ax, 001Ah
mov bx, Hor
mov cx, Ver
mov dx, 0
int 33h
End;
|
Odczytywanie wrażliwości myszki
Procedure GetSensivity(Var Hor, Ver :Integer);
Var
Temp1, Temp2 :Word;
Begin
Asm
mov ax, 001Bh
int 33h
mov Temp1, bx
mov Temp2, cx
End;
Hor := Temp1;
Ver := Temp2;
End;
|
7. Jak ustawić kursor na określonej pozycji?
I tu znowu posłużymy się assemblerem, wszystko, co musimy zrobić to przekazać do rejestru współrzędne i wywołać przerwanie:
Procedure SetPosition(X, Y :Integer); Assembler;
Asm
mov ax, 0004h
mov cx, x
mov dx, y
int 33h
End;
|
8. Uwagi końcowe i porady.
Należy zauważyć, że wartości współrzędnych podajemy w pikselach, także w trybie tekstowym! Aby przekonwertować numer piksela w trybie tekstowym na pozycje znaku należy podzielić współrzędną przez 8! Wygląda to mniej więcej tak, że w trybie tekstowym pole w lewym, górnym rogu ma współrzędne 0x0, pole obok niego 8x0 itd.
Jeśli obsługujemy kursor w trybie graficznym musimy pamiętać o tym, aby schować kursor za każdym razem, gdy chcemy narysować coś, co będzie się znajdować pod nim. W przeciwnym razie dookoła kursora powstanie niepokolorowane pole.
HideCursor;
... (* procedury rysujące coś na ekranie *)
ShowCursor;
|
Takie schowanie i pokazanie kursora nie trwa długo i jest prawie niezauważalne, więc nie daje efektu jakby kursor na chwilę zniknął. Oczywiście, jeśli procedury rysujące nie będą za bardzo zajmować procesora, nie spowolnią programu na dłużej.
Przerwanie 33h oferuje także kilka innych możliwości, ale te tutaj zaprezentowane w zupełności powinny wystarczyć. Dołączam moduł Mouse.tpu (jeśli korzystasz z Turbo Pascala skopiuj go do katalogu UNITS, np. C:\TP7\UNITS) wraz ze źródłem zawierającym wszystkie opisane tu funkcje i procedury oraz program Demo.pas - krótką prezentacje.