回 帖 发 新 帖 刷新版面

主题:[原创]在Pascal中实现对鼠标的控制


把以下代码复制到Pascal中,保存为Mouse.pas,编译后就是Mouse.tpu。然后把Mouse.tpu复制到units文件夹中,在你自己的程序中加入"uses Mouse"一行就行了。
这段程序通过调用33h中断实现对鼠标的控制。

{**BEGIN***}

unit Mouse;

interface
const LeftKey=0;
      RightKey=1;
      MidKey=2;
procedure InitMouse(var s:boolean;var c:word);
procedure ShowMouse;
procedure HideMouse;
procedure GetMouse(var s,x,y:word);
procedure SetMouse(x,y:word);
procedure DownMouse(b:word;var s,c,x,y:word);
procedure UpMouse(b:word;var s,c,x,y:word);

implementation
procedure InitMouse(var s:boolean;var c:word);
var _s,_c:word;
begin
     asm
        mov ax,0
        int $33
        mov _s,ax
        mov _c,bx
     end;
     s:=_s<>0;
     c:=_c;
end;
procedure ShowMouse;
begin
     asm
        mov ax,1
        int $33
     end;
end;
procedure HideMouse;
begin
     asm
        mov ax,2
        int $33
     end;
end;
procedure GetMouse(var s,x,y:word);
var _s,_x,_y:word;
begin
     asm
        mov ax,3
        int $33
        mov _s,bx
        mov _x,cx
        mov _y,dx
     end;
     s:=_s;
     x:=_x;
     y:=_y;
end;
procedure SetMouse(x,y:word);
begin
     asm
        mov ax,4
        mov cx,x
        mov dx,y
        int $33
     end;
end;
procedure DownMouse(b:word;var s,c,x,y:word);
var _s,_c,_x,_y:word;
begin
     asm
        mov ax,5
        mov bx,b
        int $33
        mov _s,ax
        mov _c,bx
        mov _x,cx
        mov _y,dx
     end;
     s:=_s;
     c:=_c;
     x:=_x;
     y:=_y;
end;
procedure UpMouse(b:word;var s,c,x,y:word);
var _s,_c,_x,_y:word;
begin
     asm
        mov ax,6
        mov bx,b
        int $33
        mov _s,ax
        mov _c,bx
        mov _x,cx
        mov _y,dx
     end;
     s:=_s;
     c:=_c;
     x:=_x;
     y:=_y;
end;
begin
end.

{***EOF***}


各过程的说明:

procedure InitMouse(var s:boolean;var c:word);
初始化鼠标
s :如果初始化成功s为true,否则为false。
c :鼠标按键个数。

procedure ShowMouse;
显示光标。

procedure HideMouse;
隐藏光标。

procedure GetMouse(var s,x,y:word);
获取鼠标状态。
s: 各按键状态。
x: 光标当前x坐标值。
y: 光标当前y坐标值。

procedure SetMouse(x,y:word);
设置光标坐标。
x: 光标x坐标值。
y: 光标y坐标值。

procedure DownMouse(b:word;var s,c,x,y:word);
取某一按键按下信息。
b: 欲检测的按键。左键:0或Leftkey 右键:1或RightKey 中键:2或MidKey
s: 各按键状态。
c: 在这次调用之前该按键被按下的次数。
x: 光标被按下的x坐标值。
y: 光标被按下的y坐标值。

procedure UpMouse(b:word;var s,c,x,y:word);
取某一按键释放信息。
b: 欲检测的按键。左键:0或Leftkey 右键:1或RightKey 中键:2或MidKey
s: 各按键状态。
c: 在这次调用之前该按键被释放的次数。
x: 光标被释放的x坐标值。
y: 光标被释放的y坐标值。

程序返回的各按键状态的信息通过返回值的二进制位的值来表达,如下所示:

值      0          1
第0位 左键未按下 左键正在按下
第1位 右键未按下 右键正在未按下

例如:当只有左键按下时,按键状态的信息为1(10),右键按下为2(10),左键右键一起按下时为3(10),只有中键按下时为4(10)。

以下是一段示例代码,用左键绘图,中键换色,右键退出。

{***BEGIN***}

program example;
uses Mouse,Graph;
var gDrv,gMode,cl:integer;
    x1,x2,y1,y2,s,c,x,y,t:word;
    p:boolean;
begin
     gDrv:=Detect;
     gMode:=0;
     InitGraph(gDrv,gMode,'..\BGI');
     InitMouse(p,t);
     ShowMouse;
     cl:=1;
     SetColor(cl);
     if p then
        repeat
           x2:=x1;
           y2:=y1;
           GetMouse(s,x1,y1);
           if s=1 then
           begin
                HideMouse;  {为什么要HideMouse?自己想吧。}
                Line(x1,y1,x2,y2);
                ShowMouse;
           end;
           DownMouse(MidKey,s,c,x,y);
           if c>0 then
           begin
                inc(cl);
                if cl>15 then cl:=1;
                SetColor(cl);
           end;
           DownMouse(RightKey,s,c,x,y);
        until c>0
     else
         writeln('Mouse not found.');
     CloseGraph;
end.

{***EOF***}

回复列表 (共24个回复)

11 楼

强,谢谢!!

12 楼

在某个地方见过

13 楼

原创的阿
没看见吗

14 楼

I 服了 YOU

15 楼

楼主弓虽!!!!!……

16 楼

┳ ┃ ┏┓  ┏━
┃ ┃ ┃┃┃┃┣
┻ ┗━┗┛┗┛┗━
┏┓┏┓┏┓┏┓┏┓┏┓┏┳┓┳┏┓┃┏┓
┣┛┣┛┃┃┃┓┣┛┣┫┃┃┃┃┃┃┃┃┓
┃ ┣┓┗┛┗┛┣┓┃┃┃┃┃┻┃┗┛┗┛

17 楼

为什么我没鼠标?

18 楼

我一开始还担心贴这种东西会被高手笑话,但却得到过分赞扬。
我不知道该高兴还是该悲哀……

19 楼

我上机调试了一下,通过了!!!感谢fuch

20 楼

对初学者来说挺好的!真的!

我来回复

您尚未登录,请登录后再回复。点此登录或注册