TC2.0下实现鼠标操作的模块

  • 来源: 编程中国 作者: 若水   1970-01-01/08:00
  • 这个模块是为了来在TC2.0下的一个作品而设计的模块.
    但由于这个作品花了我几个月的时间做,
    本来想等这个作品一共把源代码发布出来给大家.
    但由于一直没有这个精力,已经有好4个月没去碰它的.
    因此,还是把这个独立性较大的模块发给大家,
    以便大家在学习及业余爱好有所帮助.

    #ifndef ZXF_MOUS_C_INCLUDE
    #define ZXF_MOUS_C_INCLUDE

    #include <dos.h>
    #include <time.h>

    int MouseHolded   =0;        /*是否支持鼠标功能:0--不支持,1--支持*/
    int MouseButtonNum=0;        /*当支持鼠标功能时,存放鼠标的按钮数*/
    int MouseX        =0;        /*存放鼠标的水平方向的值*/
    int MouseY        =0;        /*存放鼠标的垂直方向的值*/
    char MouseType    =1;        /*设置鼠标类型:1--为箭头型,2--编辑型*/
    #define MouseStatusMouseOn  1    /*在MouseStatus()中实时显示鼠标 */
    #define MouseStatusMouseOff 2    /*在MouseStatus()中不实时显示鼠标*/

    #define MouseDoubleClickTime 0.3    /*鼠标双击的最大时间间隔*/
    clock_t LastMouseClickTime=0;    /*上一次鼠标单击的时间*/
    clock_t NowMouseClickTime=0;    /*这次鼠标单击的时间  */
    char    MouseClickType=0;        /*上一次鼠标单击是左键还是右键:1--左键,2--右键*/

    int arrowMousePixSave[16][10];    /*用于保存鼠标即将覆盖的区域*/
    int arrowMouseDraw[16][10]={    /*设计鼠标的形状,其中1:表示鼠标的边界,2:表示鼠标边界所包围的区域,3:表示鼠标以外的区域*/
        {1,1,3,3,3,3,3,3,3,3},
        {1,2,1,3,3,3,3,3,3,3},
        {1,2,2,1,3,3,3,3,3,3},
        {1,2,2,2,1,3,3,3,3,3},
        {1,2,2,2,2,1,3,3,3,3},
        {1,2,2,2,2,2,1,3,3,3},
        {1,2,2,2,2,2,2,1,3,3},
        {1,2,2,2,2,2,2,2,1,3},
        {1,2,2,2,2,2,2,2,2,1},
        {1,2,2,2,2,2,2,1,3,3},
        {1,2,2,2,2,2,1,3,3,3},
        {1,2,1,3,1,2,2,1,3,3},
        {1,1,3,3,1,2,2,1,3,3},
        {3,3,3,3,3,1,2,2,1,3},
        {3,3,3,3,3,1,2,2,1,3},
        {3,3,3,3,3,3,1,2,2,1} };
    int editMousePixSave[15][5];
    int editMouseDraw[15][5]={
        {1,1,3,1,1},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {3,3,1,3,3},
        {1,1,3,1,1}    };

    void MountMouse();            /*加载鼠标*/
    void UnmountMouse();        /*卸载鼠标*/
    void DrawMouseOnly(int,int);        /*绘画鼠标,但不保存即将被鼠标覆盖的区域*/
    void MouseOn(int,int);        /*显示鼠标,但保存即将被鼠标覆盖的区域*/
    void MouseOff(int,int);        /*隐藏鼠标*/
    void SetMouseHoriBound(int,int);    /*设置鼠标水平方向边界*/
    void SetMouseVertBound(int,int);    /*设置鼠标垂直方向边界*/
    void SetMouseXY(int,int);             /*设置鼠标的初始位置*/
    void GetMouseXY();            /*获得鼠标的当前位置*/
    void MouseSpeed(int,int);             /*设置鼠标的速度*/
    int  MouseStatus(int);        /*获得鼠标按键状态*/
    void  Timer(long);            /*计时器*/

    void  Timer(long getTime)        /*计时器*/
    {
        clock_t startTime=clock();
        clock_t endTime=clock();
        while((endTime-startTime)>=getTime)
        {
            endTime=clock();
        }
        return ;#p#分页标题#e#
    }
    /*加载鼠标*/
    void MountMouse()
    {
        _AX=0x00;        /*功能00H*/
        geninterrupt(0x33);    /*0x33:鼠标中断类型*/

        MouseHolded      =_AX;    /*_AX为0000H——不支持鼠标功能,为FFFFH——支持鼠标功能*/
        MouseButtonNum=_BX;    /*鼠标按钮个数*/
    }

    /*卸载鼠标*/
    void UnmountMouse()
    {
        _AX=0x02;        /*功能02H*/
        geninterrupt(0x33);    /*0x33:鼠标中断类型*/
        return ;
    }

    /*设置鼠标水平边界:minX为水平方向的最小值,maxX为水平方向的最大值*/
    void SetMouseHoriBound(int minX,int maxX)
    {
        _AX=0x07;
        _CX=minX;
        _DX=maxX;
        geninterrupt(0x33);
        return;
    }

    /*设置鼠标垂直边界:minY为垂直方向的最小值,maxY为垂直方向的最大值*/
    void SetMouseVertBound(int minY,int maxY)
    {
        _AX=0x08;
        _CX=minY;
        _DX=maxY;
        geninterrupt(0x33);
        return;
    }

    /*设置鼠标指针位置:xValue为水平方向位置,yValue为垂直方向的位置*/
    void SetMouseXY(int xValue,int yValue)
    {
        _AX=0x04;
        _CX=xValue;
        _DX=yValue;
        geninterrupt(0x33);
        return;
    }

    /*读取鼠标位置*/
    void GetMouseXY()
    {
        _AX=0x03;
        geninterrupt(0x33);

        MouseX=_CX;        /*将鼠标水平方向位置存放到MouseX*/
        MouseY=_DX;        /*将鼠标垂直方向位置存放到MouseY*/
        return;
    }

    /*设置鼠标速度*/
    void MouseSpeed(int xSpeed,int ySpeed)
    {
       _CX=xSpeed;
       _DX=ySpeed;
       _AX=0x0f;
       geninterrupt(0x33);
    }

    /*绘画鼠标,但不保存即将被鼠标覆盖的区域*/
    void DrawMouseOnly(int mousex,int mousey)
    {
        int i,j;
        int color;

        if(MouseType==1)
        {
            for(i=0;i<16;i++)
        for(j=0;j<10;j++)
        {                
            if(arrowMouseDraw[i][j]==1)
            putpixel(mousex+j,mousey+i,0);
            else if(arrowMouseDraw[i][j]==2)    /* 画鼠标*/
            putpixel(mousex+j,mousey+i,15);
        }    
        }
        else if(MouseType==2)
        {
        for(i=0;i<15;i++)
                    for(j=0;j<5;j++)
            {
            if(editMouseDraw[i][j]==1)    /*由于编辑鼠标的热点在鼠标的中心*/
                    putpixel(mousex-2+j,mousey-7+i,0);
            }
         }
    }

    /*显示鼠标,但保存即将被鼠标覆盖的区域*/
    void MouseOn(int mousex,int mousey)
    {
        int i,j;
        int color;

        if(MouseType==1)
        {
            for(i=0;i<16;i++)
        for(j=0;j<10;j++)
        {
            arrowMousePixSave[i][j]=getpixel(mousex+j,mousey+i);/* 保存原来的颜色*/
            if(arrowMouseDraw[i][j]==1)
            putpixel(mousex+j,mousey+i,0);
            else if(arrowMouseDraw[i][j]==2)        /* 画鼠标*/
                putpixel(mousex+j,mousey+i,15);
        }    
        }
        else if(MouseType==2)
        {
        for(i=0;i<15;i++)
                for(j=0;j<5;j++)
                {
                editMousePixSave[i][j]=getpixel(mousex-2+j,mousey-7+i);
            if(editMouseDraw[i][j]==1)            /*由于编辑鼠标的热点在鼠标的中心*/#p#分页标题#e#
                putpixel(mousex-2+j,mousey-7+i,0);
            }
        }
    }

    /*隐藏鼠标*/
    void MouseOff(int mousex,int mousey)
    {
       int i,j,x,y,color;
       x=mousex;
       y=mousey;

       if(MouseType==1)
       {
        for(i=0;i<16;i++)
        for(j=0;j<10;j++)
        {
            if(arrowMouseDraw[i][j]==3)
            continue;
            color=getpixel(x+j,y+i);
            putpixel(x+j,y+i,color^color);        /*原位置异或清除*/
            putpixel(x+j,y+i,arrowMousePixSave[i][j]);/* 还原原背景*/
        }
       }
       else if(MouseType==2)
       {
            for(i=0;i<15;i++)
        for(j=0;j<5;j++)
        {
            if(editMouseDraw[i][j]==3)
                continue;
            color=getpixel(x-2+j,y-7+i);
            putpixel(x-2+j,y-7+i,color^color);    /*原位置异或清除*/
            putpixel(x-2+j,y-7+i,editMousePixSave[i][j]);/* 还原原背景*/
        }
       }
    }

    /*获取鼠标状态*/
    int MouseStatus(int Mouse_On_Off)
    {
      int MouseMSG=0;
      int oldMouseX,oldMouseY;
      int i,j,color;

      oldMouseX=MouseX,oldMouseY=MouseY;    /*保存当前鼠标的位置*/

      _AX=0x03;            /*读取鼠标按钮状态*/
      geninterrupt(0x33);        /*产生33号鼠标软中断*/

      if((_BX&1) && !(_BX&2))        /*鼠标左键被按下同时右键没有按下*/
        MouseMSG=4;

      if((_BX&2) && !(_BX&1))        /*鼠标右键被按下同时左键没有按下*/
        MouseMSG=5;

      if(_BX&1 && _BX&2)        /*鼠标左键和右键同时被按下*/
        MouseMSG=3;

      _AX=0x06;            /*读取鼠标按钮释放信息*/
      _BX=0x00;            /*指定读取鼠标左键的释放信息*/
      geninterrupt(0x33);        /*产生33号鼠标软中断*/
      if(_BX==1)            /*如果鼠标左键的释放数为1*/
        MouseMSG=2;            /*产生一个单击左键信息*/

      _AX=0x06;            /*读取鼠标按钮释放信息*/
      _BX=0x01;            /*指定读取鼠标右键的释放信息*/
      geninterrupt(0x33);        /*产生33号鼠标软中断*/
      if(_BX==1)            /*如果鼠标左键的释放次数为1*/
        MouseMSG=1;            /*产生一个单击右键信息*/

      GetMouseXY();            /*获得当前鼠标位置,并把数据赋给MouseX,MouseY*/

      if(Mouse_On_Off==MouseStatusMouseOn)    /*实时显示*/
         if(oldMouseX!=MouseX || oldMouseY!=MouseY)
         {
            MouseOff(oldMouseX,oldMouseY);
            MouseOn(MouseX,Mous


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多