Tải bản đầy đủ (.doc) (8 trang)

Chuột trong lập trình Pascal

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (128.65 KB, 8 trang )

Điều khiển chuột trong chương trình
Đinh Mạnh Đạt
Từ khi máy tính cá nhân Macintosh của Apple ra đời với giao diệnngười dùng đồ hoạ (hay
GUI - Graphics User Interface, bắt nguồn từ Trung tâmnghiên cứu PARC của Xerox), giao
tiếp người máy đã trở nên thuân tiện hơn nhờcon chuột (Mouse) và hệ thống cửa sổ
(Window) - chính Windows, Linux ngày naylà một kế tục hoàn hảo của Macintosh ngày
đó. Điều đó cũng có nghĩa rằng ngoàicác ngôn ngữ lập trình kiểu 'GUI' như Visual Basic,
Visual C++,Delphi,... các ngôn ngữ lập trình cổ điển khác đều không hỗ trợ sẵn Mouse.
Tuynhiên không có điều gì ngăn cản bạn đưa chuột vào các ứng dụng viết bằng
TurboPascal, Turbo C,... điều đó là hoàn toàn làm được và nó sẽ cho ứng dụng của
bạnthêm nhiều 'giá trị'. Bài viết này sẽ giúp bạn điều khiển chuột trongchương trình Turbo
Pascal (Turbo C tương tự) và thậm chí thay đổi hình dạng củanó theo ý bạn.
Để điều khiểnchuột bạn sử dụng ngắt 33hex (Turbo Pascal kí hiệu là $33) với nhiều phục
vụcon (kích hoạt, hiện, ẩn, lấy trạng thái...). Đưa số hiệu của phục vụ con vàothanh ghi AX
rồi gọi ngắt 33hex (các ngắt khác thường đưa số hiệu phục vụ convào thanh ghi AH). Dưới
đây là một số số hiệu phục vụ con được quy ước sẵn:
0: kích hoạt (khởi tạo) chuột
1: hiện con trỏ chuột
2: ẩn con trỏ chuột
3: lấy trạng thái chuột
4: di chuyển con trỏ chuột
7/8: qui định phạm vi di chuyển ngang/dọc của con trỏchuột
1F: huỷ kích hoạt chuột
Để gọi ngắt bạncó thể chèn mã hợp ngữ (Turbo Pascal 6.0 trở lên) hay dùng thủ tục gọi
ngắt cósẵn trong Unit DOS. Ví dụ:
Procedure InitMouse; Assembler;
Asm
mov ah, $00;int $33
End;
hay:
Procedure InitMouse;


Var R: Registers;
Begin
R.ax:= 0;Intr(R, $33);
End;
Theo tôi nêndùng cách 1, không phải khai báo thêm biến, không phải uses DOS và sinh ít
mã.
Thủ tục trên sẽkích hoạt chuột, chỉ sau khi làm công việc này mới có thể dùng các phục vụ
khácvề chuột. Lưu ý rằng việc kích hoạt chỉ thành công khi đã có trình điều khiểnchuột
(bạn đã chạy mouse.com, mouse.exe hay chạy chuột bởi Windows). Nếu muốnchỉ cần cắm
chuột vào cổng mà bạn đã điều khiển được nó bạn cần phải tự viếttrình điều khiển chuột
và tôi không thể trình bày với các bạn trong bài viếtnày. Sau khi kích hoạt chuột, nếu
AX=0 là thành công, AX=-1 là chưa có trình điềukhiển chuột, BX cho số núm của chuột (2
hoặc 3) nếu đã thành công.
Procedure ShowMouse; Assembler;
Asm
mov ax, $01;int $33
End;
Thủ tục này sẽlàm xuất hiện con trỏ chuột trên màn hình (sau khi đã được kích hoạt). Con
trỏchuột trong chế độ văn bản là kí tự ASCII số 219: z (trong NC,Turbo Pascal... bạn vẫn
thấy) , trong chế độ đồ hoạ là hình mũi tên chuẩn (nhưcủa Windows). Hình dạng con trỏ
chuột luôn giới hạn trong một khung 16*16 điểmảnh (hay Pixel - Picture Element) và như
vậy có nghĩa là tuỳ vào độ phân giảimàn hình mà con trỏ chuột có thể to nhỏ, sắc nét khác
nhau.
Bạn đã có thểcho hiện hay ẩn con trỏ chuột rồi nhưng mới vậy thì chưa có ý nghĩa gì cả.
Saukhi tạo một hệ thống menu cho người dùng và hiện chuột, bạn cần biết chuột đượcấn
lúc nào, ấn nút nào và ấn ở đâu để phản ứng theo. Phục vụ con 03 để lấytrạng thái bấm
chuột và vị trí của nó, sau khi gọi ngắt:
CX/DX cho vị tríngang/dọc của con trỏ chuột trong chế độ đồ hoạ 640*480, trong chế độ
văn bảnlà (CX div 8; DX div 8) và trong chế độ đồ hoạ bất kỳ là ((CX*GetMaxX) div 632;
(DX*GetMaxY) div 192). BX có bit 0 bằng 0/1 nếu núm trái thả/ấn, bit 1 bằng 0/1nếu núm

phải thả/ấn (hoặc dễ nhớ: BX=1 là ấn núm trái, BX=2 là ấn núm phải).
Procedure MouseStatus(Var x, y, press: Interger); Assembler;
Asm
mov ax, $03;int $33
mov x, cx; movy, dx
mov press, bx
End;
Giả sử bạncó một cửa sổ có toạ độ đỉnh trên tráilà (x1, y1) và đỉnh dưới phải là (x2, y2), tại
một thời điểm bất kỳ nào đó, bạncó thể gọi MouseStatus để lấy toạ độ chuột và nếu
x1<=x<=x2 vày1<=y<=y2 là chuột đang ở trong vùng cửa sổ này, bạn xử lý tiếp...
Chươngtrình ví dụ (Gọi ngắt cách 2):
Program UsingMouse;
Uses Graph, Dos;
Function InitMouse: boolean;
Var r:registers;
Begin
r.ax:=$00; intr($33,r);
ifr.ax<>0 then InitMouse:=true
elseInitMouse:=false;
End;
Procedure ShowMouse;
Var r:registers;
Begin
r.ax:=$01;intr($33,r);
End;
Procedure HideMouse;
Var r:registers;
Begin
r.ax:=$002;intr($33,r);
End;

Procedure MouseStatus(var x,y,press:integer);
Var r:registers;
Begin
r.ax:=$03;intr($33,r);
x:=r.cx;
y:=r.dx;
press:=r.bx;
End;
Procedure Main;
Var x,y,press: integer;
Begin
x:= detect;
initgraph(x,y,'c:tpbgí);
SetFillStyle(8,4);
Bar(200,410,400,440);
Rectangle(199,409,401,441);
OutTextXY(280,420,'E X I T');
if notInitMouse then
begin
write('Without mouse driver. Can not initialize mousé); exit;
end;
ShowMouse;
repeatMouseStatus(x,y,press);
until (press=1)and (200< and (y
{Exit if youpress in EXIT box}
End;
Begin
Main;
End.
Để thay đổi hìnhdạng Mouse có nhiều cách. Rất nhiều trò chơi dùng một ảnh nào đó

'hayhó một chút thay cho con trỏ chuộtbằng cách liên tục xác định vị trí con trỏ chuột và vẽ
ảnh tại đó (tấtnhiên phải vẽ lại cả nền). Đây chẳng qua chỉ là một 'mẹo vặt' (tấtnhiên là hay
rồi), vì cách này khá phức tạp nên tôi không trình bày. Tôi sẽdùng cách khác 'không mẹo
vặt' chút nào, cũng dùng ngắt $33, phục vụcon $09. Bạn cần chuẩn bị 2 thứ và tiến hành 2
việc:
1. Mô tả hìnhdáng con trỏ chuột: Như đã nói con trỏ chuột giới hạn trong 16*16 điểm ảnh
ởchế độ đồ hoạ. Công việc của bạn là 'sáng tạó trên bảng 16*16điểm ảnh này. Để mô tả nó
người ta quyước dùng 16 số mỗi số 16 bit (2 bytes)hay word. Bạn cứ tưởng tượng 16 số
word này chồng lên nhau như khayđĩa và như vậy ta có một ma trận 16*16bit. Ví dụ:
Const BitTable: array[1..16] of word = (225, 225, 115, 115, 39, 39, 2, 2, 64, 64, 228, 228,
206, 206, 135, 135);

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×