neverTheSame 发表于 2008-3-27 14:51

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

这个模块是为了来在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 ;
}
/*加载鼠标*/
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)                        /*由于编辑鼠标的热点在鼠标的中心*/
                    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,MouseY);
      }

  /*鼠标双击的判断*/
  if(MouseMSG==3)                        /*如果是同时按下鼠标的左键*/
    MouseClickType=0;                /*上一次的按键是既不是鼠标左键也不是鼠标右键*/
  else if(MouseMSG==1)                /*如果是按下鼠标的右键*/
  {
     if(MouseClickType==2)                /*如果上一次也是按下鼠标的右键*/
     {
        NowMouseClickTime=clock();/*获得现在的程序运行时间*/
        /*判断上一次按下鼠标的右键到这次按下鼠标右键的时间间隔是不是小于最大鼠标双击时间间隔*/
        if(((NowMouseClickTime-LastMouseClickTime)/CLK_TCK)<=MouseDoubleClickTime)
             MouseMSG=6;                /*鼠标消息为右键双击*/
        LastMouseClickTime=NowMouseClickTime;
     }
     else
     {
        MouseClickType=2;                /*作为下一次的按键判断时的上一次按键状态*/
        NowMouseClickTime=clock();   /*作为下一次的按键判断时的上一次按键时间*/
        LastMouseClickTime=NowMouseClickTime;
     }
   }
   else if(MouseMSG==2)
   {
        if(MouseClickType==1)
        {
            NowMouseClickTime=clock();/*获得现在的程序运行时间*/
            /*判断上一次按下鼠标的左键到这次按下鼠标左键的时间间隔是不是小于最大鼠标双击时间间隔*/
            if(((NowMouseClickTime-LastMouseClickTime)/CLK_TCK)<=MouseDoubleClickTime)
                MouseMSG=7;        /*鼠标消息为左键双击*/
            LastMouseClickTime=NowMouseClickTime;
        }
        else
        {
            MouseClickType=1;                /*作为下一次的按键判断时的上一次按键状态*/
            NowMouseClickTime=clock();    /*作为下一次的按键判断时的上一次按键时间*/
            LastMouseClickTime=NowMouseClickTime;
        }
   }

  return MouseMSG;                /*返回鼠标按键消息:0--没有按键,1--单击右键,
                        2--单击左键,3--同时按下左键和右键,
                        4--拖曳左键,5--拖曳右键,6--双击右键,7--双击左键*/
}

#endif/*ZXF_MOUS_C_INCLUDE*/

jerry4966263 发表于 2008-3-27 14:59

赞,我正好需要,拿来用一下

jerry4966263 发表于 2008-3-27 15:01

似乎2.0下面不通过啊。。。

hoodlum1980 发表于 2008-3-27 16:41

我试用了下,觉得还是不错的。我给出补充少许以可以进行完整运行和测试的代码。(TC2.0下)
[code]/*TC2.0下实现鼠标操作的模块*/
/*别人发布的代码-hoodlum1980注*/
#ifndef ZXF_MOUS_C_INCLUDE
#define ZXF_MOUS_C_INCLUDE
#endif

#include <graphics.h>
#include <stdio.h>
#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}    };
           
/* 鼠标消息码:
* 0--没有按键,1--单击右键,
* 2--单击左键,3--同时按下左键和右键,
* 4--拖曳左键,5--拖曳右键,6--双击右键,7--双击左键
*/
enum MOUSE_MESSAGES_CODE
{
        NOTHING=0,
        RBUTTONCLK=1,
        LBUTTONCLK=2,
        BOTHBUTTONSDOWN=3,
        LBUTTONDRAG=4,
        RBUTTONDRAG=5,
        RBUTTONDBCLK=6,
        LBUTTONDBCLK=7
};

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 DisplayMsg(char *msg);
void main();

void  Timer(long getTime)        /*计时器*/
{
    clock_t startTime=clock();
    clock_t endTime=clock();
    while((endTime-startTime)>=getTime)
    {
        endTime=clock();
    }
    return ;
}
/*加载鼠标*/
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)            /*由于编辑鼠标的热点在鼠标的中心*/
            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,MouseY);
      }

  /*鼠标双击的判断*/
  if(MouseMSG==3)            /*如果是同时按下鼠标的左键*/
    MouseClickType=0;        /*上一次的按键是既不是鼠标左键也不是鼠标右键*/
  else if(MouseMSG==1)        /*如果是按下鼠标的右键*/
  {
     if(MouseClickType==2)        /*如果上一次也是按下鼠标的右键*/
     {
                    NowMouseClickTime=clock();/*获得现在的程序运行时间*/
                    /*判断上一次按下鼠标的右键到这次按下鼠标右键的时间间隔是不是小于最大鼠标双击时间间隔*/
                    if(((NowMouseClickTime-LastMouseClickTime)/CLK_TCK)<=MouseDoubleClickTime)
                MouseMSG=6;        /*鼠标消息为右键双击*/
                    LastMouseClickTime=NowMouseClickTime;
     }
     else
     {
             MouseClickType=2;        /*作为下一次的按键判断时的上一次按键状态*/
            NowMouseClickTime=clock();   /*作为下一次的按键判断时的上一次按键时间*/
            LastMouseClickTime=NowMouseClickTime;
     }
   }
   else if(MouseMSG==2)
   {
    if(MouseClickType==1)
    {
        NowMouseClickTime=clock();/*获得现在的程序运行时间*/
        /*判断上一次按下鼠标的左键到这次按下鼠标左键的时间间隔是不是小于最大鼠标双击时间间隔*/
        if(((NowMouseClickTime-LastMouseClickTime)/CLK_TCK)<=MouseDoubleClickTime)
        MouseMSG=7;    /*鼠标消息为左键双击*/
        LastMouseClickTime=NowMouseClickTime;
    }
    else
    {
        MouseClickType=1;            /*作为下一次的按键判断时的上一次按键状态*/
        NowMouseClickTime=clock();    /*作为下一次的按键判断时的上一次按键时间*/
        LastMouseClickTime=NowMouseClickTime;
    }
   }

  return MouseMSG;        /*返回鼠标按键消息:0--没有按键,1--单击右键,
            2--单击左键,3--同时按下左键和右键,
            4--拖曳左键,5--拖曳右键,6--双击右键,7--双击左键*/
}

/*display msg*/
void DisplayMsg(char *msg)
{
        setcolor(YELLOW);
        floodfill(10,451,WHITE);/*填充msg矩形!*/
        outtextxy(10,452,msg);       
}

void main()
{
        int gdriver=DETECT,gmode,tempx,tempy,mouseMsg;
        initgraph(&gdriver,&gmode,"C:\\TC\\");
        setcolor(WHITE);
        rectangle(0,450,630,478);/*绘制信息边框*/
        setfillstyle(SOLID_FILL,BLACK);
        setcolor(YELLOW);/*用黄色绘制信息*/
        DisplayMsg("Mouse DEMO: Click any key to exit the demo!");
        MountMouse();            /*install the mouse, 加载鼠标*/
        SetMouseHoriBound(0,600);    /*设置鼠标水平方向边界*/
        SetMouseVertBound(0,450);    /*设置鼠标垂直方向边界*/
        SetMouseXY(100,100);
        tempx=tempy=100;
        MouseOn(tempx,tempy);
        while(!kbhit())
        {
                GetMouseXY();/*get current mouse position */
                /*更新鼠标位置*/
                if(tempx!=MouseX || tempy!=MouseY)
                {
                        MouseOff(tempx,tempy);
                        MouseOn(MouseX,MouseY);        /*显示鼠标,但保存即将被鼠标覆盖的区域*/
                        tempx=MouseX;                  /* cache current mouse pos */
                        tempy=MouseY;
                }
                /*查询鼠标行为*/
                mouseMsg=MouseStatus(!MouseStatusMouseOn);
                if(mouseMsg!=NOTHING)
                {
                        switch(mouseMsg)
                        {
                                case LBUTTONCLK:
                                        DisplayMsg("Left Button Clicked!");
                                        break;
                                case RBUTTONCLK:
                                        DisplayMsg("Right Button Clicked!");
                                        break;
                                case LBUTTONDBCLK:
                                        DisplayMsg("Left Button Double Clicked!");
                                        break;
                                case RBUTTONDBCLK:
                                        DisplayMsg("Right Button Double Clicked!");
                                        break;
                                case BOTHBUTTONSDOWN:
                                        DisplayMsg("Both Buttons Down!");
                                        break;
                                case LBUTTONDRAG:
                                        DisplayMsg("Left Button Dragging!");
                                        break;
                                case RBUTTONDRAG:
                                        DisplayMsg("Right Button Dragging!");
                                        break;
                        }
                }
                Timer(1000);
        }
        UnmountMouse();        /*uninstall the mouse . 卸载鼠标*/
        closegraph();
}
/***************************************************/[/code]

wo0304 发表于 2008-3-27 16:53

顶顶顶!!!!!!!

...................

flyue 发表于 2008-3-27 18:02

哎,现在好少程序是用TC写的。
这么麻烦,还不如用VC++
又不是没有条件,现在已经不是上世纪90年代啦……

neverTheSame 发表于 2008-3-27 18:40

多谢hoodlum1980给出的例子.
我也做了一个例子,可以参考.

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include"ZXF_MOUS.C"
int main()
{
    int gdriver=VGA,gmode=VGAHI,errorcode;/*        gdriver   : 图形方式的驱动程序,
                                                    gmode     : 图形方式的模式,
                                                  errorcode : 初始化返回的信息*/

    initgraph(&gdriver,&gmode,"D:\turboc2");  /*调用初始化函数*/
    errorcode=graphresult();                  /*接收初始化信息*/

    if(errorcode!=grOk)                       /*初始化不成功*/
    {
                printf("Error of: %s",grapherrormsg(errorcode));
                printf("\nPress any key to end this programe!");
                getch();
                exit(1);                              /*退出*/
    }

    cleardevice();                  /*清屏*/

    setfillstyle(1,2);                /*设置背景,在这里作者建议不要使用
                                        setbkcolor()*/
    bar(0,0,getmaxx(),getmaxy());

    MountMouse();                        /*加载鼠标*/

    /*设置鼠标的有效范围*/
    SetMouseHoriBound(0,getmaxx());
    SetMouseVertBound(0,getmaxy());
       
    SetMouseXY(0,0);                /*设置鼠标的初始位置*/

    MouseOn(MouseX,MouseY);         /*显示鼠标*/

    settextstyle(2,0,5);                /*设置文本类型*/
    setcolor(14);                        /*设置前景色*/


    while(1)                        /*无限循环*/
    {
                                /*设置输入热点*/
        moveto(getmaxx()/2,getmaxy()/2);
                                /*捕获鼠标消息*/
        switch(MouseStatus(MouseStatusMouseOn))
        {
        case 0:        break;
        case 1:                /*单击右键*/
                        /*隐藏鼠标,以下同理*/
                MouseOff(MouseX,MouseY);
                        /*清除原先文本,以下同理*/
                setfillstyle(1,2);
                bar(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy()/2+20);
                           /*显示新文本,以下同理*/
                outtext("Mouse's RightButton is clicked!");
                           /*显示鼠标,以下同理*/
                MouseOn(MouseX,MouseY);
        break;
        case 2:                 /*单击左键*/
                MouseOff(MouseX,MouseY);
                 setfillstyle(1,2);
                bar(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy()/2+20);
                outtext("Mouse's LeftButton is clicked!");
                MouseOn(MouseX,MouseY);
        break;
        case 3:                 /*同时按下左键和右键*/
                MouseOff(MouseX,MouseY);
                setfillstyle(1,2);
                bar(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy()/2+20);
                outtext("Mouse's RightButton and LeftButton are clicked!");
                MouseOn(MouseX,MouseY);
        break;
        case 4:                 /*拖曳左键*/
                MouseOff(MouseX,MouseY);
                setfillstyle(1,2);
                bar(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy()/2+20);
                outtext("Mouse's LeftButton is draging!");
                MouseOn(MouseX,MouseY);
        break;
        case 5:                 /*拖曳右键*/
                MouseOff(MouseX,MouseY);
                setfillstyle(1,2);
                bar(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy()/2+20);
                outtext("Mouse's RightButton is draging!");
                MouseOn(MouseX,MouseY);
        break;
        case 6:                 /*双击右键*/
                MouseOff(MouseX,MouseY);
                setfillstyle(1,2);
                bar(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy()/2+20);
                outtext("Mouse's RightButton is double clicked!");
                MouseOn(MouseX,MouseY);
        break;
        case 7:                 /*双击左键*/
                 MouseOff(MouseX,MouseY);
                setfillstyle(1,2);
                bar(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy()/2+20);
                outtext("Mouse's LeftButton is double clicked!");
                MouseOn(MouseX,MouseY);
        break;
        }
        if(bioskey(1))                        /*检查是否有键盘键被按下*/
        {
            bioskey(0);                         /*清除键盘缓冲区*/

            setfillstyle(1,2);                /*清除原先的文本*/
            bar(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy()/2+20);
            outtext("Press any key to exit!");/*显示新的文本*/

            break;
        }
    }

    getch();                /*暂停*/
    UnmountMouse();        /*卸载鼠标*/
    closegraph();           /*关闭图形方式*/
    return 0;
}

shy1201 发表于 2008-3-27 19:23

好贴啊

wwl568 发表于 2008-3-28 11:09

谢谢,努力学习中.

hyq1122 发表于 2008-3-28 12:40

其实有更简单的

下载并安装curse(或ncures)库,这是控制台下的操作库,支持鼠标、窗口等一系列函数

随心 发表于 2008-3-28 12:53

不错,顶一个

小涓儿 发表于 2008-3-31 17:30

jxt598598 发表于 2008-3-31 22:37

这么多强人啊!

daijia 发表于 2008-5-18 09:25

厉害啊

jerry4966263 发表于 2008-6-5 01:32

唉,又来膜拜这个帖子

hoodlum1980 发表于 2008-9-4 21:35

原来你说的那个作品就是那个“加密解密”。

neverTheSame 发表于 2008-9-5 17:01

对啊

碧波红露 发表于 2008-10-22 09:06

经典贴,顶!!!

yi157 发表于 2008-10-24 20:36

[em16]

页: [1]

编程论坛