Pascal


Obsługa myszki w Pascalu - podstawy

Do operacji związanych z myszką służy przerwanie 33h. To właśnie z niego skorzystamy pisząc procedury do obsługi myszki. Procedury te będą działać zarówno w trybie tekstowym jak i graficznym, z tą różnicą, że w trybie graficznym pojawi się nam strzałka, a w trybie tekstowym prostokąt.

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:

Bit Informacja
0 Wciśnięto lewy przycisk myszy, jeśli bit jest równy 1.
1 Wciśnięto prawy przycisk myszy, jeśli bit jest równy 1.
2 Wciśnięto środkowy przycisk myszy, jeśli bit jest równy 1.

A więc, w zależności od zawartości rejestru BX możemy wyszczególnić różne kombinacje:

Bit Znaczenie
0 Nie naciśnięto żadnego przycisku.
1 Wciśnięto lewy przycisk.
2 Wciśnięto prawy przycisk.
3 Wciśnięto prawy i lewy przycisk.
4 Wciśnięto środkowy przycisk.
5 Wciśnięto środkowy i lewy przycisk.
6 Wciśnięto środkowy i prawy przycisk.
7 Wciśnięto środkowy, prawy i lewy przycisk.

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.

Dodał: ifrost​, www
Dział: Pascal


 

ComputerSun.pl na FaceBooku
Polecamy lekturę:

Windows 7 PL



X

Zapisz się na biuletyn serwisu ComputerSun.pl, aby otrzymać poradnik:

Zabezpieczanie sieci bezprzewodowych. Przydatne wskazówki jak chronić sieć domową przed intruzami

Imię:  
Email:
Tak, akceptuję Politykę Prywatności