Chuột trong lập trình Pascal

8 3.7K 52
Chuột trong lập trình Pascal

Đang tải... (xem toàn văn)

Thông tin tài liệu

Chuột trong lập trình Pascal

Điều khiển chuột trong chương trìnhĐinh Mạnh ĐạtTừ 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ột1: hiện con trỏ chuột2: ẩn con trỏ chuột3: lấy trạng thái chuột4: di chuyển con trỏ chuột7/8: qui định phạm vi di chuyển ngang/dọc của con trỏchuột1F: 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;Asmmov ah, $00;int $33End; hay:Procedure InitMouse;Var R: Registers;BeginR.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;Asmmov 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;Asmmov ax, $03;int $33mov x, cx; movy, dxmov press, bxEnd;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;Beginr.ax:=$00; intr($33,r);ifr.ax<>0 then InitMouse:=trueelseInitMouse:=false;End;Procedure ShowMouse;Var r:registers;Beginr.ax:=$01;intr($33,r); End;Procedure HideMouse;Var r:registers;Beginr.ax:=$002;intr($33,r);End;Procedure MouseStatus(var x,y,press:integer);Var r:registers;Beginr.ax:=$03;intr($33,r);x:=r.cx;y:=r.dx;press:=r.bx;End;Procedure Main;Var x,y,press: integer;Beginx:= 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 beginwrite('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;BeginMain;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); Tuy nhiên contrỏ chuột lại cần đến 2 bảng bit như vậy để mô tả nó:+ Bảng AND: trong bảng bit này, những chỗ có bit=1 thìcon trỏ chuột coi như 'trong suốt' (ảnh nền dưới con trỏ hiện ra).+ Bảng XOR: trong bảng bit này, những chỗ có bit=1 thìcon trỏ chuột có màu 15 (trắng), nếu cùng vị trí này trong bảng AND cũng cóbit=1 thì màu của con trỏ chuột sẽ đảo ngược so với màu nền (có thế thì bạn mớithấy con trỏ chuột ở mọi màu nền).Lưu ý 2 bảng bitAND và XOR này cùng để mô tả 1 bảng 16*16 điểm ảnh duy nhất mà con trỏ chuột sẽhiện ra. Nếu cảm thấy rắc rối với công việc 'sáng tạó này bạn có thểbỏ qua và dùng sẵn các bảng tôi cung cấp. Chúng ta cần 32 word vì vậy chúng takhai báo mảng 1 chiều 32 số word đã 'thiết kế', tên mảng là BitTable(array[1 32] of word).2. Xác định vịtrí của điểm kích hoạt trên con trỏ chuột, là tương đối so với bảng bit lúctrước (góc trên trái bảng bit là (0,0), góc dưới phải là (15,15)). Đặt 2 toạ độnày vào 2 hằng nào đó là Xput, Yput chẳng hạn.Bạn đã chuẩn bịxong 2 thứ, giờ việc thứ nhất cần tiến hành là: cho cặp thanh ghi ES:DX chứađịa chỉ mảng BitTable, BX chứa Xput, CX chứa Yput. Cuối cùng gọi ngắt $33, phụcvụ con $09.Chương trìnhdưới đây sẽ tạo con trỏ chuột là một chiếc bút chì có dạng:(Bảng 16*16 Pixel) Program ChangeMouseCursor;Const{ Uses hexanumber }BitTable:array[1 32] of word=</p> ($FF07,$FE03,$FC01,$F800,$F000,$E000,$C000,$8000,$0001,$0003,$0007,$000F,$001F,$003F,$007F,$00FF,$0000,$0078,$017C,$0366,$0766,$0EBE,$1ĐE,$1BE0,$57DC,$4FB8,$5F70,$6EE0,$75C0,$7800,$3F00,$0000);XPut = -1; YPut = 16;BeginAsmmov ax,$13;int $10 { Move screen to graphics 320*200*256 }mov ax,0; int$33 { Init mouse }mov ax,seg BitTable;mov es,axmov dx,offset BitTable{ Move BitTable to ES:DX }mov bx,XPut;mov cx,YPutmov ax,$09;int $33 { Set mouse cursor }mov ax,$01;int $33 { Show mouse }@loop: movax,$03; int $33cmp bx,0; je@loop { Repeat until you click mouse}End;End. Ngoài ra bạn có thể dùng những hình con trỏchuột khác, có rất nhiều mẫu con trỏ khác nhau và cả chương trình tạo ra mẫurất thuận tiện. Dưới đây là các bảng BitTable2, BitTable3 style='sẽ tạo con trỏ chuột có dạng hình bàn taychỉ ngón.BitTable2:array[1 32] of word=</p> ($F33F,$E1FF,$E1FF,$E1FF,$E07F,$E00F,$C001,$8000,$0000,$0000,$0000,$0000,$8000,$C000,$E001,$E003,$0000,$0C00,$0C00,$0C00,$0C00,$0D80,$0DB0,$2DB0,$6DB6,$6FFE,$6FFE,$7FFE,$3FFE,$1FFE,$0FFC,$0000);XPut2 = -1;YPut2 = 16;BitTable3:array[1 32] of word=</p> ($FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$F000,$8E00,$41C0,$3830,$0608,$0188,$0044,$0042,$07C2,$0821,$6821,$99E0,$A620,$41C0,$2000,$1000); XPut3 = -1;YPut3 = 16;Hy vọng những kiến thức cơ sở này về Mouse cóthể giúp bạn 'làm đẹp' chương trình của mình hơn và nếu bạn thấythích điều khiển chuột, sáng tác ra những 'trò chơi chuột' như JewelThief hay Neko (mèo đuổi chuột) thì hãy liên hệ với tôi. Chúc các bạn thànhcông với Mickey của mình!Đinh Mạnh Đạtdinhmanhdat@fptnet.com . tạo) chuột1 : hiện con trỏ chuột2 : ẩn con trỏ chuột3 : lấy trạng thái chuột4 : di chuyển con trỏ chuột7 /8: qui định phạm vi di chuyển ngang/dọc của con tr chuột1 F:. 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

Ngày đăng: 07/09/2012, 11:40

Hình ảnh liên quan

Tuynhiên contrỏ chuột lại cần đến 2 bảng bit như vậy để mô tả nó: - Chuột trong lập trình Pascal

uynhi.

ên contrỏ chuột lại cần đến 2 bảng bit như vậy để mô tả nó: Xem tại trang 6 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan