⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mouse.cpp

📁 本软件是简单的文本编辑器
💻 CPP
字号:
/*********************************************************************
* 鼠标的实现:
* 调用33H中断得到有关鼠标的信息,如鼠标当前位置,鼠标的按健状态等信息。
*********************************************************************/
//定义鼠标类
class MouseClass
{
  private:
    char cMousePresent;
    unsigned char cPrex,cPrey,cCurx,cCury;
    unsigned char cButton;
    int iBuf;
  public:
    MouseClass();
    ~MouseClass();
    int MouseMove(Msg &TheMsg);
    void Refresh();
};

//定义构造函数
MouseClass::MouseClass()
{
  //检测鼠标是否存在
  REGS r;		
  r.x.ax=0;
  int86(0x33,&r,&r);
  cMousePresent=r.x.ax;

  //设定鼠标的活动范围
  r.x.ax=7;
  r.x.cx=8;
  r.x.dx=640;
  int86(0x33,&r,&r);
  r.x.ax=8;
  r.x.cx=8;
  r.x.dx=200;
  int86(0x33,&r,&r);

  //设定鼠标最初出现的位置
  r.x.ax=4;
  r.x.cx=0;
  r.x.dx=0;
  int86(0x33,&r,&r); 
  cPrex=cPrey=0;
  cButton=0;
}

//定义析构函数
MouseClass::~MouseClass()
{
  REGS r;
  r.x.ax=0;
  int86(0x33,&r,&r);//鼠标复位
}

//定义鼠标操作函数
//鼠标若有操作,向系统发鼠标有操作的消息。
int MouseClass::MouseMove(Msg &TheMsg)
{
  //如果鼠标不存在,直接返回
  REGS r;
  if(!cMousePresent) return 0;

  //检测鼠标按健状态
  r.x.ax=3;
  int86(0x33,&r,&r); 
  cCurx=r.x.cx>>3;cCury=r.x.dx>>3;

  //向系统发送消息
  TheMsg.DestItem=NULL; 
  TheMsg.iAgu1=(cCurx<<8)|cCury;
  
  //如果鼠标移动
  if(cCurx!=cPrex||cCury!=cPrey) 
  {
	//恢复原先鼠标位置的内容
	puttext(cPrex,cPrey,cPrex,cPrey,&iBuf);
    
	//获取鼠标当前位置的显示模式
	gettext(cCurx,cCury,cCurx,cCury,&iBuf);
    
	//颜色取反再显示
	iBuf^=0x7f00;
    puttext(cCurx,cCury,cCurx,cCury,&iBuf);
    
	//保存当前位置显示模式
	iBuf^=0x7f00;
    
	//返回鼠标移动消息
	TheMsg.iOpera=mMOUSEMOVE;
    TheMsg.iAgu2=r.x.bx;
    cPrex=cCurx;cPrey=cCury;
    return mMOUSEMOVE;
  }

  //如果鼠标左键松开
  if(!(r.x.bx&0x1)&&(cButton&0x1)) 
  {
	//返回鼠标点击消息
    TheMsg.iOpera=mMOUSECLICK;
    TheMsg.iAgu2=cButton;
    cButton=r.x.bx;
    return mMOUSECLICK;
  }

  //如果鼠标左键按下
  if((r.x.bx&0x1)&&!(cButton&0x1)) 
  {
	//返回按键按下消息
    TheMsg.iOpera=mMOUSEBUTTONDOWN;
    TheMsg.iAgu2=r.x.bx;
    cButton=r.x.bx;
    return mMOUSEBUTTONDOWN;
  }

  Refresh();
  return 0;
}

//定义鼠标当前覆盖内容刷新的函数
//鼠标没有任何操作,但其覆盖的内容有变化时需要刷新
void MouseClass::Refresh()
{
  int ibuf;
  //获取当前位置显示信息
  gettext(cCurx,cCury,cCurx,cCury,&ibuf);
  
  //与已经存储的数据比较,如果相同则返回
  if((ibuf^0x7f00)==iBuf) return;

  //如果不同,刷新存储数据并绘制鼠标
  iBuf=ibuf;    
  ibuf^=0x7f00;
  puttext(cCurx,cCury,cCurx,cCury,&ibuf);
}

//定义鼠标对象
MouseClass MyMouse;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -