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

ĐIỀU KHIỂN CHUỘT TRONG CHẾ độ đồ HOẠ 256 màu

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 (38.04 KB, 6 trang )

ĐIỀU KHIỂN CHUỘT TRONG CHẾ ĐỘ ĐỒ HOẠ 256 MÀU
Hữu Chính
Trong nhiều trường hợp bạn cần thiết phải tạo ra một giao diện (Interface) thật
bắt mắt cho dự án (Project) lập trình của bạn. Chính vì vậy nếu bạn phải thực
hiện trong PASCAL thì việc khởi tạo và sử dụng chế độ đồ hoạ 256 màu là việc
không thể tránh khỏi. Tất nhiên khi đó bạn cũng phải viết các modul chương
trình để điều khiển chuột. ở chế độ đồ hoạ thường (16 màu) thì viết thư viện điều
khiển chuột bạn có thể sử dụng các hàm chuẩn về chuột của DOS (Ngắt 33h).
Thế nhưng trong chế độ màu SVGA 256 thì bạn không thể dùng phương pháp
này, bởi vì khi đó sẽ hình ảnh của chuột không thể hiện lên được. Để khắc phục
bạn phải tự viết chương trình quản lý chuột và hiện chuột. Dưới đây là một
chương trình như vậy để bạn tham khảo. Trong khuôn khổ bài viết không thể đề
cập tất cả vấn đề. Để hiểu rõ bạn có thể tham khảo ở các sách về lập trình hệ
thống cho các thiết bị ngoại vi.
Chương trình này sau khi bạn dịch File Mlib.tpu bạn có thể sử dụng như sau:
- Khởi động chuột: mInit;
- Đặt toạ độ chuột: mSet(x,y);
- Lấy tình trạng chuột: mGet;
- Lấy toạ độ chuột: MWhereX, MWhereY;
- Lấy tình trạng phím bấm: Biến PressButton.
1. Nếu Bít 0 bằng: Nút trái đang bấm.
2. Nếu Bít 1 bằng: Nút phải đang bấm.
3. Nếu Bít 2 bằng: Nút giữa đang bấm.
- Hiện, ẩn chuột: mHide, mShow;
{$A+,B+,D+,E+,F+,G+,I+,L+,N+,O+,P+,Q+,R-,S+,T+,V+,X+}
{$M 16384,0,655360}
Unit MLib;
Interface
Procedure mInit;
Procedure mGet;
Procedure mSet(x,y:word);


Var PressButton:Word;
MWhereX,MWhereY: Word;
mShow,MHide:Procedure;
OldMWhereX,OldMWhereY:Word;
Implementation
Uses Graph;


Type MAreaSvga256=Array[0..15,0..15] of byte;
Const
Off:Boolean=True;
MousePatern:MAreaSvga256=(01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,0
0),
(01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00),
(01,02,01,00,00,00,00,00,00,00,00,00,00,00,00,00),
(01,10,02,01,00,00,00,00,00,00,00,00,00,00,00,00),
(01,10,02,02,01,00,00,00,00,00,00,00,00,00,00,00),
(01,10,10,02,02,01,00,00,00,00,00,00,00,00,00,00),
(01,10,10,02,02,02,01,00,00,00,00,00,00,00,00,00),
(01,10,10,10,02,02,02,01,00,00,00,00,00,00,00,00),
(01,10,10,10,02,02,02,02,01,00,00,00,00,00,00,00),
(01,10,10,10,10,02,02,02,02,01,00,00,00,00,00,00),
(01,10,10,10,10,02,02,02,02,02,01,00,00,00,00,00),
(01,10,10,10,01,01,01,01,01,01,01,01,00,00,00,00),
(01,10,10,01,00,00,00,00,00,00,00,00,00,00,00,00),
(01,10,01,00,00,00,00,00,00,00,00,00,00,00,00,00),
(01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00),
(01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00)
); {Du lieu hinh anh chuot}
Var OldMAreaSvga256:MAreaSvga256;

MousePaint:Procedure(x,y:Word);
mHandlerP:Procedure;
MaxX,MaxY:Word;
Procedure Wait(i:Byte);
Var x: Byte;
Begin
x:=5;
While i>0 do
Begin
If (i mod 2) = 0 then Inc(x) else Dec(x);
Dec(i);
End;
End;


Procedure SaveMAreaSvga256;
Var Mi,Mj:word;
Begin
For Mi:=0 to 15 do
For Mj:=0 to 15 do
OldMAreaSvga256[Mi,Mj]:=GetPixel(MWhereX+Mi,MWhereY+Mj);
End;
Procedure RestoreMAreaSvga256;
Var mi,mj:word;
Begin
For mi:=0 to 15 do
For mj:=0 to 15 do
if(OldMWhereX+mi<=MaxX)then
PutPixel(OldMWhereX+mi,OldMWhereY+mj,OldMAreaSvga256[mi,mj]);
End;

Procedure MousePaintSvga256(col,row:word);
Var mi,mj:word;
Begin
If Off then
Begin
MWhereX:=col;MWhereY:=row;
OldMWhereX:=MWhereX;OldMWhereY:=MWhereY;
Exit;
End;
RestoreMAreaSvga256;
MWhereX:=col;MWhereY:=row;
OldMWhereX:=MWhereX;OldMWhereY:=MWhereY;
SaveMAreaSvga256;
For mi:=0 to 15 do
For mj:=0 to 15 do
If(MousePatern[mi,mj]<>0)and(col+mj<=MaxX)then
PutPixel(col+mj,row+mi,MousePatern[mi,mj]);
End;
Procedure MouseHandler;Assembler;
Asm


mov ax,seg OldMAreaSvga256
mov ds,ax
mov ax,cx
mov cl,3
shr ax,cl
shr dx,cl
push ax
push dx

call mousepaint
retf
End;
Procedure mIns;assembler;
Asm
les dx,mhandlerp
mov ax,0Ch
mov cx,01h
int 33h
End;
Procedure mUnins;assembler;
Asm
les dx,mhandlerp
mov ax,0Ch
mov cx,00h
int 33h
End;
Procedure mShowSvga256;
Begin
If not off then Exit;
Off:=False;
SaveMAreaSvga256; MousePaintSvga256(mWhereX,mWhereY);
mIns;
End;
Procedure mHideSvga256;
Begin


If Off then Exit;
mUnins;Off:=True;

Wait(10);
RestoreMAreaSvga256;
End;
Procedure mSet(x,y:word);
Begin
mHide;
asm
mov ax,0004
mov cx,x
mov dx,y
shl cx,2
shl dx,2
int 33h
end;
mWhereX:=X shr 1;mWhereY:=Y shr 1;
OldMWhereX:=MWhereX;OldMWhereY:=MWhereY;
mShow;
End;
Procedure mInit;
Begin
mHandlerP:=MouseHandler;
mWhereX:=MaxX shr 1;mWhereY:=MaxY shr 1;
OldMWhereX:=MWhereX;OldMWhereY:=MWhereY;
MousePaint:=MousePaintSvga256;
mShow:=mShowSvga256;mHide:=mHideSvga256;
Asm
xor ax,ax
int 33h
mov ax,000Fh
mov cx,1

mov dx,1
int 33h


mov ax,0007h
xor cx,cx
mov dx,MaxX
shl dx,3
int 33h
mov ax,0008h
xor cx,cx
mov dx,MaxY
shl dx,3
int 33h
mov ax,0004h
mov cx,MaxX
shl cx,2
mov dx,Maxy
shl dx,2
int 33h
mov ax, 001ch
mov bx, 2h
int 33h
call mIns;
End;
End;
Procedure mGet;Assembler;
Asm
mov ax,3
int 33h

mov PressButton,bx
End;
Begin
MaxX:=640;
MaxY:=480;
{Ban co the thay doi gioi han vi tri chuot o day}
End.



×