📄 saolei.txt
字号:
/**** 加入头文件 ****/
#ifndef TYPE_H
#define TYPE_H
#include "type.h"
#endif
#ifndef CGRAPH_H
#define CGRAPH_H
#include "CGraph.h"
#endif
/**** 定义 CMouse.h 中用到的数据类型、常量和全局变量 ****/
typedef int MouseState; /* 鼠标的状态 */
typedef int ClickInfor; /* 击键的信息 */
enum mouseState /* 鼠标状态常量,共8种状态 */
{
NO_BUTTON_IS_PRESSED=0,
LEFT_BUTTON_IS_PRESSED,
RIGHT_BUTTON_IS_PRESSED,
LEFT_AND_RIGHT_BUTTONS_ARE_PRESSED,
CENTER_BUTTON_IS_PRESSED,
LEFT_AND_CENTER_BUTTONS_ARE_PRESSED,
RIGHT_AND_CENTER_BUTTONS_ARE_PRESSED,
LEFT_AND_RIGHT_AND_CENTER_BUTTONS_ARE_PRESSED
};
enum clickInfor /* 鼠标击键信息常量*/
{
NO_BUTTON_CLICK, /* 没有击键信息*/
LEFT_CLICK, /* 左键单击 */
RIGHT_CLICK, /* 右键单击 */
CENTER_CLICK, /* 中键单击 */
DOUBLE_CLICK, /* 左键双击 */
LEFT_RELEASED, /* 左键释放 */
RIGHT_RELEASED /* 右键释放 */
};
typedef struct CursorICO /* 鼠标光标图标类 */
{
int * m_cursor; /* 光标图标数据数组,大小是 width×height。显示鼠标光标图标时,横向将数组中数据写入显存 */
int * m_backGround; /* 用于保存光标背景,数组大小是 width×height */
int m_width; /* 光标图标的宽度 */
int m_height; /* 光标图标的高度 */
Bool m_visible; /* 鼠标指针是否可见 */
Bool m_hasBackGround;/* 是否保存了背景 */
CPoint m_position; /* 当前显示光标的位置 */
} CCursorICO;
typedef struct MouseInfor /* 记录鼠标信息 */
{
int m_buttons; /* 鼠标按钮数 */
int m_doubleClickDelay; /* m_doubleClickDelay 表示双击延迟时间是刷新鼠标图标的 m_doubleClickDelay 倍 */
CPoint m_position; /* 鼠标的当前位置 */
MouseState m_mouseState; /* 鼠标的当前状态 */
ClickInfor m_clickInfor; /* 鼠标当前的击键信息 */
} CMouseInfor;
typedef struct Mouse
{
CCursorICO m_cursorICO;
CMouseInfor m_mouseInfor;
} CMouse;
CMouse myMouse; /* 全局变量,一个应用程序中只允许一个鼠标变量 */
Bool hasMouse=false; /* 是否存在鼠标,初始化成功后赋值为 true */
/**** 函数声明 ****/
Bool installMouse(); /* 安装鼠标器,在使用鼠标之前调用,并且只调用一次,如果初始化鼠标失败,则返回false */
void removeMouse(); /* 清除鼠标器,如果决定在当前应用中不再使用鼠标器,可以调用此函数清除鼠标器,并释放资源。
清除完后不能在安装鼠标!所以该函数一般是在程序结束时调用,如果要隐藏鼠标,可调用另一个函数: setVisible(false);*/
Bool initMouse(int buttons); /* 初始化鼠标器,由 installMouse() 函数调用,用户不许自己调用它来初始化鼠标!因为初始化只进行一次 */
Bool setCursorICO(int * cursorICO,int height,int width); /* 设置鼠标指针 */
void showMouse(); /* 显示鼠标指针,用户不需要自己调用,在 refreshMouse() 函数中被调用,如果想让隐藏的鼠标指针显示出来,可以调用:setVisible(true); */
void setVisible( Bool visible ); /* 设置鼠标是否可见 */
int getButtons(); /* 获得鼠标按键个数 */
int getDoubleClickDelay(); /* 获得鼠标双击延迟时间 */
void setDoubleClickDelay(int doubleClickDelay); /* 设置鼠标双击延迟时间 */
void setActiveArea(UINT x1,UINT y1,UINT x2,UINT y2); /* 设置鼠标活动区域 */
void setMouseActiveZone(CZone zone); /* 设置鼠标活动区域 */
void moveTo(UINT x, UINT y); /* 把鼠标移至坐标(x,y) */
void moveMouseTo(CPoint position); /* 把鼠标移至坐标position处 */
void refreshMouse(); /* 刷新鼠标信息,包括鼠标指针和鼠标状态、击键信息 */
CPoint getMousePosition(); /* 获取鼠标当前位置坐标 */
MouseState getMouseState(); /* 获取鼠标当前状态 */
ClickInfor fetchClickInfor(); /* 获取鼠标击键信息 */
/**** 函数实现 ****/
Bool installMouse() /* 安装鼠标器 */
{
static Bool firstCall = true; /* 记录是否是第一次调用这个函数,防止多次调用 */
if( firstCall )
{
UINT result=0, buttons=0;
firstCall = false;
asm MOV AX,00H;
asm INT 33H;
asm MOV result, AX;
asm MOV buttons,BX;
if(0xFFFF==result)
{
hasMouse = true;
if( initMouse(buttons) )
{
return true;
}
else /* 初始化鼠标器失败 */
{
printf("Error: System has a mouse with %u buttons, but I failed to initialize it\n", buttons);
return false;
}
}
else /* 安装鼠标失败 */
{
return false;
}
}
else /* 重复调用是不允许的,返回false */
{
return false;
}
}
void removeMouse()
{
int * cursor = myMouse.m_cursorICO.m_cursor;
int * bg = myMouse.m_cursorICO.m_backGround;
if(!hasMouse) /* 如果不存在鼠标器,则不需要清除鼠标 */
{
return;
}
if( bg && myMouse.m_cursorICO.m_hasBackGround ) /* 如果鼠标还保存有背景,还得清除鼠标图标,恢复背景 */
{
int i,j,width,height,x,y;
long index, tmp;
x=myMouse.m_cursorICO.m_position.x;
y=myMouse.m_cursorICO.m_position.y;
width = myMouse.m_cursorICO.m_width;
height = myMouse.m_cursorICO.m_height;
index=0;
for(i=0; i<="0" height<="0" x,y; height, cursorICO, setCursorICO( 设置鼠标指针 myMouse.m_mouseInfor.m_clickInfor="NO_BUTTON_CLICK;" myMouse.m_mouseInfor.m_mouseState="NO_BUTTON_IS_PRESSED;" myMouse.m_mouseInfor.m_doubleClickDelay="2;" myMouse.m_mouseInfor.m_buttons="buttons;" 设置鼠标信息 11) 16, !setCursorICO(cursorICO, 如果不存在鼠标器,则不进行初始化 }; 0, 1, cursorICO[16][11]="{1," 设置鼠标光标图标 初始化鼠标器 buttons) initMouse(int free(bg); 释放鼠标背景占有的内存 if(bg) 释放鼠标指针占有的内存>0)
{
putpixel( newX+j, newY+i, pixel );
}
tmp++;
}
index+=width;
}
myMouse.m_cursorICO.m_hasBackGround = true;
myMouse.m_cursorICO.m_position.x = newX;
myMouse.m_cursorICO.m_position.y = newY;
}
}
void changeBackGround(CZone zone)
{
int * bg = myMouse.m_cursorICO.m_backGround;
int width = myMouse.m_cursorICO.m_width;
int height = myMouse.m_cursorICO.m_height;
int i,j,x,y;
long index;
CZone cursorZone;
x = myMouse.m_cursorICO.m_position.x;
y = myMouse.m_cursorICO.m_position.y;
cursorZone.leftUp.x=x;
cursorZone.leftUp.y=y;
cursorZone.rightDown.x=x+width -1;
cursorZone.rightDown.y=y+height-1;
if( !publicZone(zone, cursorZone, &cursorZone) )
{
return ;
}
if( NULL!=bg )
{
index=0;
for(i=0; i1)
{
switch(i)
{
case 0 : clickInfor=DOUBLE_CLICK; break; /* 只有左键才有双击事件 */
case 1 : clickInfor=RIGHT_CLICK; break;
case 2 : clickInfor=CENTER_CLICK; break;
default : break;
}
}
}
count=1;
}
/* 以下语句用来判断鼠标按键的释放动作 */
if( NO_BUTTON_CLICK==clickInfor )
{
if( LEFT_BUTTON_IS_PRESSED==priorState && NO_BUTTON_IS_PRESSED==state )
{
clickInfor=LEFT_RELEASED;
}
else if( RIGHT_BUTTON_IS_PRESSED==priorState && NO_BUTTON_IS_PRESSED==state )
{
clickInfor=RIGHT_RELEASED;
}
}
priorState=myMouse.m_mouseInfor.m_mouseState;
myMouse.m_mouseInfor.m_clickInfor=clickInfor;
/* 4、最后在新的位置显示鼠标指针 */
showMouse();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -