首页  编辑  

C++写的mouse类

Tags: /超级猛料/Hardware.硬件相关/键盘和鼠标/   Date Created:

]、。·ˉˇ¨〃々—~‖…’”〕〉》」』〗】∶!"'),.:;?]` 下面是一个C++写的mouse类,可以参考一下:

/* FileName: MSMOUSE.CPP */

/* Microsoft Mouse Subroutines Written in C++ */

#include

#include

const int MsCall=0x33; // INT 33H

const int Iret=0xcf;

const int False=0;

const int True=1;

/* constructor */

MouseObject::MouseObject(void)

{

OK=False;

MouseOff=True;

}

/* detect the mouse driver */

int MouseObject::DriverExists(void)

{

void far *address;

address=getvect(MsCall);

return (address!=NULL)&&(*(unsigned char far*)address!=Iret);

}

/* initialize the mouse */

void MouseObject::Setup(VideoModeType VideoMode)

{

union REGS regs;

OK=DriverExists();

if(OK)

if(OK)

{

if(VideoMode==HerculesGr) *(char far*)MK_FP(0x0040,0x0049)=6;

regs.x.ax=0;

int86(MsCall,?s,?s);

if(regs.x.ax==0) OK=False;

}

if(!OK)

{

TurnOff();

return;

}

TurnOn();

if(VideoMode==TextScrn)

TextMode=True;

else

TextMode=False;

if(VideoMode==TextScrn)

LowRes=True;

else

LowRes=False;

Oldx=0;

Oldy=0;

Oldy=0;

X=0;

Y=0;

Dx=0;

Dy=0;

Move(0,0);

}

int MouseObject::SetupOK(void)

{

return OK;

}

/* close the cursor */

void MouseObject::Hide(void)

{

union REGS regs;

if(!Operating())

return;

regs.x.ax=2;

int86(MsCall,?s,?s);

}

/* show the cursor */

void MouseObject::Show(void)

{

union REGS regs;

if(!Operating())

return;

regs.x.ax=1;

int86(MsCall,?s,?s);

}

/* get the mouse status */

unsigned MouseObject::Status(int &Mx,int &My)

{

union REGS regs;

if(!Operating())

{ Mx=0; My=0;

return 0;

}

regs.x.ax=3;

int86(MsCall,?s,?s);

Mx=regs.x.cx;

My=regs.x.dx;

My=regs.x.dx;

if(TextMode)

{

Mx>>=3;

My>>=3;

}

if(LowRes) Mx>>=1;

return regs.x.bx;

}

/* get the button status */

unsigned MouseObject::ButtonStatus(void)

{

int Mx,My;

if(!Operating())

return 0;

else

return Status(Mx,My);

}

/* Get the press count */

int MouseObject::PressCnt(unsigned ButtonMask)

{

{

union REGS regs;

if(!Operating())

return 0;

regs.x.ax=5;

regs.x.bx=ButtonMask>>1;

int86(MsCall,?s,?s);

return regs.x.bx;

}

/* Get the Release count */

int MouseObject::ReleaseCnt(unsigned ButtonMask)

{

union REGS regs;

if(!Operating())

return 0;

regs.x.ax=6;

regs.x.bx=ButtonMask>>1;

int86(MsCall,?s,?s);

return regs.x.bx;

}

/* The Mouse Event */

unsigned MouseObject::Event(int &Mx, int &My)

{

unsigned E;

if(!Operating())

{

Mx=0;

My=0;

return Idle;

}

E=Status(Mx,My);

if(E==0)

{

if(PressCnt(LeftButton)>0) E=LMouseDown;

else if(PressCnt(RightButton)>0) E=RMouseDown;

else if(ReleaseCnt(LeftButton)>0) E=LMouseUp;

else if(ReleaseCnt(RightButton)>0) E=RMouseUp;

}

else

{

if(E&LeftButton)

{

if(PressCnt(LeftButton)>0) E=LMouseDown;

else E=LMouseStillDown;

}

else if(PressCnt(RightButton)>0)

E=RMouseDown;

else

E=RMouseStillDown;

}

return E;

}

/* Wait for response */

unsigned MouseObject::WaitForAnyEvent(int &Mx,int &My)

{

unsigned E;

if(!Operating())

{

Mx=0;

My=0;

return Idle;

}

do{

E=Event(Mx,My);

} while(E==Idle);

return E;

}

/* Wait for some response */

void MouseObject::WaitForEvent(unsigned E,int &Mx,int &My)

{

unsigned Etry;

if(!Operating())

{

Mx=0;

My=0;

return ;

}

do{

Etry=Event(Mx,My);

} while(Etry!=E);

}

/* Move the cursor */

int MouseObject::Moved(void)

{

{

if(!Operating())

return False;

Oldx=X; Oldy=Y;

Status(X,Y);

Dx=X-Oldx;

Dy=Y-Oldy;

return (Dx!=0)||(Dy!=0);

}

/* Move the cursor to X,Y */

void MouseObject::Move(int Mx,int My)

{

union REGS regs;

if(!Operating()) return;

regs.x.ax=4;

regs.x.cx=Mx;

regs.x.dx=My;

if(TextMode)

{

regs.x.cx<<=3;

regs.x.dx<<=3;

}

}

if (LowRes) regs.x.cx<<=1;

int86(MsCall,?s,?s);

}

/* Turn on the cursor */

void MouseObject::TurnOn(void)

{

if(OK&&MouseOff)

{

MouseOff=False;

Show();

}

}

/* Turn off the cursor */

void MouseObject::TurnOff(void)

{

if(OK&&!MouseOff)

{ Hide();

MouseOff=True;

}

}

}

/* if it is operating */

int MouseObject::Operating(void)

{

return !MouseOff;

}

/* set the new mouse cursor */

void MouseObject::SetCursor(const MouseCursor &NewCursor)

{

union REGS regs;

struct SREGS sregs;

if(!Operating()) return;

regs.x.ax=9;

regs.x.bx=NewCursor.HotSpot.X;

regs.x.cx=NewCursor.HotSpot.Y;

regs.x.dx=FP_OFF(NewCursor.ScreenMask);

sregs.es=FP_SEG(NewCursor.ScreenMask);

int86x(MsCall,?s,?s,&sregs);

}

/* different mouse cursor types */

const MouseCursor ArrowCursor={

{0,0},

{ // Screen Mask

0x3fff,0x1fff,0x0fff,0x07ff,

0x03ff,0x01ff,0x00ff,0x007f,

0x003f,0x00ff,0x01ff,0x10ff,

0x30ff,0xf87f,0xf87f,0xfc3f},

{ // Cursor Mask

0x0000,0x4000,0x6000,0x7000,

0x7800,0x7c00,0x7e00,0x7f00,

0x7f80,0x7e00,0x7c00,0x4600,

0x0600,0x0300,0x0300,0x0180}

};

const MouseCursor HandCursor={

{4,0},

{ // Screen Mask

0xf3ff,0xe1ff,0xe1ff,0xe1ff,

0xe001,0xe000,0xe000,0xe000,

0x8000,0x0000,0x0000,0x0000,

0x0000,0x0000,0x8001,0xc003},

{ // Cursor Mask

0x0c00,0x1200,0x1200,0x1200,

0x13fe,0x1249,0x1249,0x1249,

0x7249,0x9001,0x9001,0x9001,

0x8001,0x8001,0x4002,0x3ffc}

};

const MouseCursor LeftRightCursor={

{8,8},

{ // Screen Mask

0xffff,0xffff,0xfbdf,0xf3cf,

0xe3c7,0xc003,0x8001,0x0000,

0x8001,0xc003,0xe3c7,0xf3cf,

0xfbdf,0xffff,0xffff,0xffff},

{ // Cursor Mask

0x0000,0x0000,0x0420,0x0c30,

0x1428,0x27e4,0x4002,0x8001,

0x4002,0x27e4,0x1428,0x0c30,

0x0420,0x0000,0x0000,0x0000}

};

const MouseCursor UpDownCursor={

{8,8},

{ // Screen Mask

0xfeff,0xfcff,0xf83f,0xf01f,

0xe00f,0xc007,0xf83f,0xf83f,

0xf83f,0xf83f,0xc007,0xe00f,

0xf01f,0xf83f,0xfc7f,0xfeff},

{ // Cursor Mask

0x0100,0x0280,0x0440,0x0820,

0x1010,0x3c78,0x0440,0x0440,

0x0440,0x0440,0x3c78,0x1010,

0x0820,0x0440,0x0280,0x0100}

};