签到

06月21日
尚未签到

共有回帖数 0

    雷神

    等级:
    鼠标事件(转载)


    #include graphics.h
    #include stdlib.h
    #include dos.h
    #include conio.h

    /*鼠标信息宏定义*/
    #define WAITING 0xff00
    #define LEFTPRESS 0xff01
    #define LEFTCLICK 0xff10
    #define LEFTDRAG 0xff19
    #define RIGHTPRESS 0xff02
    #define RIGHTCLICK 0xff20
    #define RIGHTDRAG 0xff2a
    #define MIDDLEPRESS 0xff04
    #define MIDDLECLICK 0xff40
    #define MIDDLEDRAG 0xff4c
    #define MOUSEMOVE 0xff08

    int Keystate;
    int MouseExist;
    int MouseButton;
    int MouseX;
    int MouseY;


    int up[16][16],down[16][16],mouse_draw[16][16],pixel_save[16][16];

    void MouseMath()/*计算鼠标的样子*/
    {int i,j,jj,k;
    long UpNum[16]={
          0x3fff,0x1fff,0x0fff,0x07ff,
          0x03ff,0x01ff,0x00ff,0x007f,
          0x003f,0x00ff,0x01ff,0x10ff,
          0x30ff,0xf87f,0xf87f,0xfc3f
          };
    long   DownNum[16]={
          0x0000,0x7c00,0x6000,0x7000,
          0x7800,0x7c00,0x7e00,0x7f00,
          0x7f80,0x7e00,0x7c00,0x4600,
          0x0600,0x0300,0x0300,0x0180
         };
      for(i=0;i16;i++)
      {
      j=jj=15;
       while(UpNum!=0)
       {
       up[j]=UpNum%2;
       j--;
       UpNum/=2;
       }
      while(DownNum!=0)
       {
       down[jj--]=DownNum%2;
       DownNum/=2;
       }
     for(k=j;k=0;k--)
      up[k]=0;
     for(k=jj;k=0;k--)
      down[k]=0;
     for(k=0;k16;k++)/*四种组合方式*/
      {
      if(up[k]==0&&down[k]==0)
       mouse_draw[k]=1;
      else if(up[k]==0&&down[k]==1)
       mouse_draw[k]=2;
      else if(up[k]==1&&down[k]==0)
       mouse_draw[k]=3;
      else
       mouse_draw[k]=4;
     }
    }
    mouse_draw[1][2]=4;/*特殊点*/
    }
    /*鼠标光标显示*/
    void MouseOn(int x,int y)
     {
    int i,j;
    int color;

     for(i=0;i16;i++)/*画鼠标*/
     {
      for(j=0;j16;j++)
       {
       pixel_save[j]=getpixel(x+j,y+i);/*保存原来的颜色*/
       if(mouse_draw[j]==1)
        putpixel(x+j,y+i,0);
       else if(mouse_draw[j]==2)
        putpixel(x+j,y+i,15);
       }
      }
     }
    /*隐藏鼠标*/
    void MouseOff()
    {
    int i,j,x,y,color;
    x=MouseX;
    y=MouseY;
    for(i=0;i16;i++)/*原位置异或消去*/
     for(j=0;j16;j++)
       {
       if(mouse_draw[j]==3||mouse_draw[j]==4)
        continue;
       color=getpixel(x+j,y+i);
       putpixel(x+j,y+i,color^color);
       putpixel(x+j,y+i,pixel_save[j]);
       }
    }
    /*鼠标是否加载
     MouseExist:1=加载
         0=未加载
     MouseButton:鼠标按键数目 */
    void MouseLoad()
     {
      _AX=0x00;
      geninterrupt(0x33);
      MouseExist=_AX;
      MouseButton=_BX;
     }

    /*鼠标状态值初始化*/
    void MouseReset()
     {
      _AX=0x00;
      geninterrupt(0x33);
     }

    /*设置鼠标左右边界
     lx:左边界
     gx:右边界        */
    void MouseSetX(int lx,int rx)
     {
      _CX=lx;
      _DX=rx;
      _AX=0x07;
      geninterrupt(0x33);
     }

    /*设置鼠标上下边界
     uy:上边界
     dy:下边界       */
    void MouseSetY(int uy,int dy)
     {
      _CX=uy;
      _DX=dy;
      _AX=0x08;
      geninterrupt(0x33);
     }

    /*设置鼠标当前位置
     x:横向坐标
     y:纵向坐标        */
    void MouseSetXY(int x,int y)
     {
      _CX=x;
      _DX=y;
      _AX=0x04;
      geninterrupt(0x33);
     }

    /*设置鼠标速度(缺省值:vx=8,vy=1)
     值越大速度越慢                 */
    void MouseSpeed(int vx,int vy)
     {
      _CX=vx;
      _DX=vy;
      _AX=0x0f;
      geninterrupt(0x33);
     }

    /*获取鼠标按下键的信息*/
    /*是否按下左键
     返回值: 1=按下 0=释放*/
    int LeftPress()
     {
      _AX=0x03;
      geninterrupt(0x33);
      return(_BX&1);
     }

    /*是否按下中键
     返回值同上   */
    int MiddlePress()
     {
      _AX=0x03;
      geninterrupt(0x33);
      return(_BX&4);
     }

    /*是否按下右键
     返回值同上    */
    int RightPress()
     {
      _AX=0x03;
      geninterrupt(0x33);
      return(_BX&2);
     }

    /*获取鼠标当前位置*/
    void MouseGetXY()
     {
      _AX=0x03;
      geninterrupt(0x33);
      MouseX=_CX;
      MouseY=_DX;
     }

    int MouseStatus()/*鼠标按键情况*/
    {
    int x,y;
    int status;
    int press=0;

    int i,j,color;
    status=0;/*默认鼠标没又移动*/

    x=MouseX;
    y=MouseY;

    while(x==MouseX&&y==MouseY&&status==0&&press==0)
    {
    if(LeftPress()&&RightPress())
     press=1;
    else if(LeftPress())
     press=2;
    else if(RightPress())
     press=3;
    MouseGetXY();
    if(MouseX!=x||MouseY!=y)
     status=1;
    }
    if(status)/*移动情况才重新显示鼠标*/
    {
    for(i=0;i16;i++)/*原位置异或消去*/
     for(j=0;j16;j++)
       {
       if(mouse_draw[j]==3||mouse_draw[j]==4)
        continue;
       color=getpixel(x+j,y+i);
       putpixel(x+j,y+i,color^color);
       putpixel(x+j,y+i,pixel_save[j]);
       }
    MouseOn(MouseX,MouseY);/*新位置显示*/
    }
    if(press!=0)/*有按键得情况*/
     return press;
    return 0;/*只移动得情况*/
    }


    void main()
    {int gd=DETECT,gm;
    initgraph(&gd,&gm,"c:\tc");
    MouseMath();/*计算鼠标形状,一开始必须使用,后面就不用了*/
    MouseSetY(0,479);
    MouseSetX(0,639);
    MouseSetXY(100,100);

    outtextxy(400,400,"Author: milo_zy");
    outtextxy(370,420,"welcome to www.8623.com");
    settextstyle(0,0,4);
    outtextxy(100,200,"XP Mouse Demo");

    MouseOn(MouseX,MouseY);/*第一次显示鼠标*/
    while(!kbhit())
    {
     switch(MouseStatus())
     {/*双键按下画黄点*/
      case 1:MouseOff();
             putpixel(MouseX,MouseY,YELLOW);
             MouseGetXY();
             MouseOn(MouseX,MouseY);break;
      /*左键按下画红点*/
      case 2:
             MouseOff();
             putpixel(MouseX,MouseY,RED);
             MouseGetXY();
             MouseOn(MouseX,MouseY);break;
      /*右键按下画绿点*/
      case 3:
             MouseOff();
             putpixel(MouseX,MouseY,GREEN);
             MouseGetXY();
             MouseOn(MouseX,MouseY);break;
      default:break;
     }
    }
    closegraph();
    }



    #include dos.h
    #includeconio.h
    #includegraphics.h
    #includestdio.h
    #includestdlib.h


    union REGS regs;
    /*function's prototype*/
    void initgr()
    {
    int gd=DETECT,gm=0;
    registerbgidriver(EGAVGA_driver);
    /*register BGI driver */


    initgraph(&gd,&gm,"");
    } /*initialize the graphic*/

    void cursor(int x,int y)
    {

    line(x,y,x,y+18);
    line(x+1,y,x+1,y+18);
    line(x,y,x+12,y+12);
    line(x+1,y,x+13,y+12);
    line(x,y+18,x+4,y+14);
    line(x,y+17,x+4,y+13);
    line(x+4,y+14,x+6,y+20);
    line(x+4,y+13,x+6,y+19);
    line(x+6,y+20,x+10,y+18);
    line(x+6,y+19,x+10,y+17);
    line(x+10,y+18,x+8,y+12);
    line(x+10,y+17,x+8,y+11);
    line(x+8,y+12,x+12,y+12);
    line(x+8,y+11,x+12,y+11);
    } /*this is the mouse's cursor,maybe a little ugly*/

    int init(int xmi,int xma,int ymi,int yma)
    {
    int retcode;
    regs.x.ax=0;
    int86(51,®s,®s);
    /*with int86*/
    retcode=regs.x.ax;
    if(retcode==0)
    return 0;
    regs.x.ax=7;
    regs.x.cx=xmi;
    regs.x.dx=xma;
    int86(51,®s,®s);
    regs.x.ax=8;
    regs.x.cx=ymi;
    regs.x.dx=yma;
    int86(51,®s,®s);
    return retcode;
    } /*initialize the mouse*/



    int readmouse(int *mx,int *my,int *mbutt)
    {
    int xx0=*mx,yy0=*my,but0=0,mb=0;
    int xnew, ynew;
    do {
    regs.x.ax=3;
    int86(51,®s,®s);
    xnew=regs.x.cx;
    ynew=regs.x.dx;
    *mbutt=regs.x.bx;
    } while(xnew==xx0 && ynew==yy0 && *mbutt == but0 );
    *mx=xnew;
    *my=ynew;
    mb=(*mbutt);
    if(mb)
    {
    if(mb==1)
    return 1;
    else
    return 0;
    }
    else
    return 0;
    } /*read the mouse action*/

    void newxy(int *mx,int *my,int *mbutt)
    {
    int ch,xx0=*mx,yy0=*my,x,y;
    int xm,ym;
    ch=readmouse(&xm,&ym,mbutt);
    if(xm!=xx0||ym!=yy0)
    {
    switch (ch)
    {
    case 0:
    cursor(xx0,yy0);
    cursor(xm,ym);
    break;
    case 1:
    cursor(xx0,yy0);
    cursor(xm,ym);
    break;
    } /*paint the cursor when invoke the mouse's action*/
    *mx=xm;
    *my=ym;
    } /*mouse event handling*/
    }
    main()
    {
    int x,y,button;
    int gdriver = DETECT , gmode;

    initgraph(&gdriver, &gmode, "");
    setbkcolor(2);
    init(0,640,0,480);
    while(1)
    {
    setcolor(4);
    cursor(x,y);
    setcolor(2);
    cursor(x,y);
    newxy(&x,&y,&button);
    }
    }

    #include dos.h
    #includeconio.h
    #includegraphics.h
    #includestdio.h
    #includestdlib.h


    union REGS regs;
    /*function's prototype*/

    void cursor(int x,int y)
    {

    line(x,y,x,y+18);
    line(x+1,y,x+1,y+18);
    line(x,y,x+12,y+12);
    line(x+1,y,x+13,y+12);
    line(x,y+18,x+4,y+14);
    line(x,y+17,x+4,y+13);
    line(x+4,y+14,x+6,y+20);
    line(x+4,y+13,x+6,y+19);
    line(x+6,y+20,x+10,y+18);
    line(x+6,y+19,x+10,y+17);
    line(x+10,y+18,x+8,y+12);
    line(x+10,y+17,x+8,y+11);
    line(x+8,y+12,x+12,y+12);
    line(x+8,y+11,x+12,y+11);
    } /*this is the mouse's cursor,maybe a little ugly*/

    int init(int xmi,int xma,int ymi,int yma)
    {
    int retcode;
    regs.x.ax=0;
    int86(51,®s,®s);
    /*with int86*/
    retcode=regs.x.ax;
    if(retcode==0)
    return 0;
    regs.x.ax=7;
    regs.x.cx=xmi;
    regs.x.dx=xma;
    int86(51,®s,®s);
    regs.x.ax=8;
    regs.x.cx=ymi;
    regs.x.dx=yma;
    int86(51,®s,®s);
    return retcode;
    } /*initialize the mouse*/



    int readmouse(int *mx,int *my,int *mbutt)
    {
    int xx0=*mx,yy0=*my,but0=0,mb=0;
    int xnew, ynew;
    do {
    regs.x.ax=3;
    int86(51,®s,®s);
    xnew=regs.x.cx;
    ynew=regs.x.dx;
    *mbutt=regs.x.bx;
    } while(xnew==xx0 && ynew==yy0 && *mbutt == but0 );
    *mx=xnew;
    *my=ynew;
    mb=(*mbutt);
    if(mb)
    {
    if(mb==1)
    return 1;
    else
    return 0;
    }
    else
    return 0;
    } /*read the mouse action*/

    void newxy(int *mx,int *my,int *mbutt)
    {
    int ch,xx0=*mx,yy0=*my,x,y;
    int xm,ym;
    ch=readmouse(&xm,&ym,mbutt);
    if(xm!=xx0||ym!=yy0)
    {
    switch (ch)
    {
    case 0:
    cursor(xx0,yy0);
    cursor(xm,ym);
    break;
    case 1:
    cursor(xx0,yy0);
    cursor(xm,ym);
    break;
    } /*paint the cursor when invoke the mouse's action*/
    *mx=xm;
    *my=ym;
    } /*mouse event handling*/
    }
    main()
    {
    int x,y,button;
    int gdriver = DETECT , gmode;

    initgraph(&gdriver, &gmode, "");
    setbkcolor(2);
    init(0,640,0,480);

    while(1)
    {
    setcolor(4);
    cursor(x,y);
    setcolor(2);
    cursor(x,y);
    newxy(&x,&y,&button);
    if (x==0 &&y==0)
    break;
    }
    }

    楼主 2016-02-25 11:51 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知