📄 ninput.h
字号:
for (h = 0; h<32; ++h)
{
/*保存光标将要覆盖的屏幕*/
g_mouse_tp->overlay_buf[v * 32 + h] = get_dot(cur_x + h, cur_y + v);
}
}
set_mouse_icon(NULL); /*设置成默认指针光标*/
for (v = 0; v<32; ++v)
{
for (h = 0; h<32; ++h)
{
dot(cur_x + h , cur_y + v, g_mouse_tp->overlay_buf[v * 32 + h]);
}
}
common_flags &= 0xFFFD;
g_routines |= 2;
#ifndef NEO_timer_unused
#ifndef NEO_mouse_bind_timer_unused
if (!(common_flags & 0x2))
{
install_int_ex((void (*)())mouse_refresh, 1); /*将鼠标的刷新工作交给时钟*/
}
#endif
#endif
return keys;
}
/*---------------------------------------------------*
*函数功能: 设置光标坐标. *
*参数说明: 整型参数x,y为光标的新位置坐标. *
*返回说明: 无. *
*备 注: 底层鼠标控制函数.用户通过nadmouse.h中的高*
* 鼠标控制函数间接调用 *
*---------------------------------------------------*/
void position_mouse(int x,int y)
{
if (g_mouse_tp != NULL)
{
hide_mouse();
locate_mouse(x, y);
show_mouse();
}
else
{
#ifndef NEO_mouse_bas_unused
hide_hard_cur();
locate_mouse(x, y);
show_hard_cur();
#endif
}
}
/*---------------------------------------------------*
*函数功能: 以鼠标结构中保留的坐标值在屏幕相应的位置 *
* 绘制光标 *
*参数说明: 无. *
*返回说明: 无. *
*备 注: 高级鼠标控制函数.用户通过mouse_refresh() *
间接调用. *
*---------------------------------------------------*/
void show_mouse(void)
{
int h, v;
unsigned offs = g_sl_offset;
char work = g_work_surface;
#ifndef NEO_mouse_exp_unused
int cur_x = (g_mouse_tp->x = get_mouse_x()) + g_mouse_tp->logic_x;
int cur_y = (g_mouse_tp->y = get_mouse_y()) + g_mouse_tp->logic_y;
#else
int cur_x = g_mouse_tp->x = get_mouse_x();
int cur_y = g_mouse_tp->y = get_mouse_y();
#endif
common_flags |= 0x8;
#ifndef NEO_surface_unused
if (g_look_surface != g_work_surface)
set_work_surface(g_look_surface);
#endif
for (v = 0; v < 32; v += 2)
{
for (h = 0; h < 32; ++h)
{
/*保存光标将要覆盖的屏幕*/
g_mouse_tp->overlay_buf[(v << 5) + h] = get_dot(cur_x + h, cur_y + v);
g_mouse_tp->overlay_buf[((v + 1) << 5) + h] = get_dot(cur_x + h, cur_y + v + 1);
}
}
#ifndef NEO_icon_support_unused
blit_icon(g_mouse_tp->iconbuffer_p, cur_x, cur_y);
#endif
g_work_surface = work;
g_sl_offset = offs;
common_flags &= 0xfff7;
}
/*---------------------------------------------------*
*函数功能: 鼠标图形光标隐藏. *
*参数说明: 无. *
*返回说明: 无. *
*备 注: 高级鼠标控制函数.用户通过cursor_refresh()*
* 间接调用. *
*---------------------------------------------------*/
void hide_mouse(void)
{
int h, v;
unsigned offs = g_sl_offset;
char work = g_work_surface;
#ifndef NEO_mouse_exp_unused
int x = g_mouse_tp->x + g_mouse_tp->logic_x, y = g_mouse_tp->y + g_mouse_tp->logic_y;
#else
int x = g_mouse_tp->x, y = g_mouse_tp->y;
#endif
#ifndef NEO_surface_unused
if (g_look_surface != g_work_surface)
set_work_surface(g_look_surface);
#endif
#ifndef NEO_draw_smooth_unused
vsync();
#endif
for (v = 0; v < 32; ++v)
{
for (h = 0; h < 32; ++h)
{
dot(x + h , y + v, g_mouse_tp->overlay_buf[(v << 5) + h]);
}
}
g_work_surface = work;
g_sl_offset = offs;
}
/*---------------------------------------------------*
*函数功能: 鼠标图形光标的更新显示. *
* 当鼠标光标可能被覆盖时调用来重绘光标. *
*参数说明: 无. *
*返回说明: 无. *
*备 注: 高级鼠标控制函数.用户可直接调用. *
*---------------------------------------------------*/
void cursor_refresh(void)
{
if (!(common_flags & 0x4) && (!(common_flags & 0x2)))
{
common_flags |= 0x8; /*防止重入标志*/
hide_mouse(); /*隐藏原来的光标*/
common_flags &= 0xfff7;
show_mouse(); /*绘制新的光标.*/
}
}
void scare_mouse_area(int x, int y, int w, int h)
{
if ((g_mouse_tp->x > x) && (g_mouse_tp->y > y) && (g_mouse_tp->x < x + w) && (g_mouse_tp->y < y + h))
{
scare_mouse();
}
else
{
common_flags |= 0x2;
}
}
/*临时去掉鼠标光标*/
void scare_mouse(void)
{
common_flags |= 0x4;
hide_mouse();
}
/*恢复临时去掉的鼠标光标*/
void unscare_mouse(void)
{
if (common_flags & 0x4)
{
common_flags &= 0xFFFB;
show_mouse();
}
common_flags &= 0xFFFD;
}
char check_click(void)
{
int current_x = get_mouse_x();
int current_y = get_mouse_y();
if ((current_x == g_mouse_tp->x) && (current_y == g_mouse_tp->y))
{
#ifndef NEO_dbl_click_unused
char click = get_click();
/*检测左键是否双击*/
if (click == 0 && (g_mouse_tp->oldclickinfo==1) && (g_mouse_tp->advclickinfo==0))
{
g_mouse_tp->mouse_b = g_mouse_tp->advclickinfo = 0;
}
else if (click == 0 && (g_mouse_tp->advclickinfo == 1))
{
g_mouse_tp->start = clock();
g_mouse_tp->oldclickinfo = g_mouse_tp->advclickinfo;
g_mouse_tp->advclickinfo = 0;
g_mouse_tp->mouse_b = MOUSE_L_UP;/*单击左键*/
}
else if (click == 1 && (g_mouse_tp->oldclickinfo==1)&&(g_mouse_tp->advclickinfo==0))
{
g_mouse_tp->end = clock();
/*当dblclickdelay为MIDDLE_DBLCLICK即双击*/
if (g_mouse_tp->end - g_mouse_tp->start <= g_mouse_tp->dblclickdelay)
{
g_mouse_tp->mouse_b = g_mouse_tp->advclickinfo = MOUSE_LDBL_CLICK;
}
g_mouse_tp->oldclickinfo = -1;
}
else
{
g_mouse_tp->mouse_b = g_mouse_tp->advclickinfo = get_click();
if (g_mouse_tp->oldclickinfo != -1) g_mouse_tp->oldclickinfo = -1;
}
#endif
return FALSE;
}
else /*鼠标移动了*/
{
g_mouse_tp->mouse_b = g_mouse_tp->advclickinfo = get_click();
return TRUE;
}
}
/*---------------------------------------------------*
*函数功能: 鼠标图形光标的刷新.放在用户程序的主循环中*
* 用以刷新鼠标的各种主要状态. *
*参数说明: 无. *
*返回说明: 若鼠标移动返回0;否则返回1. *
*备 注: 高级鼠标控制函数.用户可直接调用. *
*---------------------------------------------------*/
int mouse_refresh(void)
{
if (g_mouse_tp == NULL) /*检查高级鼠标例程是否已安装*/
{
#ifndef NEO_sys_report_error_unused
Errinfo_t error = {"mouse_refresh", NOT_INIT_ADVMOUSE, 1};
throw_error(error);
#endif
return -1;
}
if (check_click())
{
cursor_refresh();
return 0;
}
return 1;
}
/*---------------------------------------------------*
*函数功能: 鼠标双击判定延时设置.当两次相邻的单击时间*
* 间隔小于双击判定延时即被认为是双击. *
*参数说明: userdelay可以是: *
* FAST_DBLCLICK,MIDDLE_DBLCLICK *
* 或SLOW_DBLCLICK(用户亦可自定一个小于1.5的*
* 延时) *
*返回说明: 无. *
*备 注: 高级鼠标控制函数.用户可直接调用. *
*---------------------------------------------------*/
void set_dbl_click_delay(int userdelay)
{
if (g_mouse_tp==NULL)
{
#ifndef NEO_sys_report_error_unused
Errinfo_t error = {"set_dbl_click_delay", NOT_INIT_ADVMOUSE, 0};
throw_error(error);
#endif
}
(g_mouse_tp->dblclickdelay=userdelay);
}
/*---------------------------------------------------*
*函数功能: 改变鼠标光标的形状. *
*参数说明: p_iconfile:光标文件的文件名. *
*返回说明: 改变成功返回1;失败返回0,并改为默认的箭头 *
* 形光标. *
*备 注: 高级鼠标控制函数.用户可直接调用. *
*---------------------------------------------------*/
int set_mouse_icon(char *p_iconfile)
{
unsigned char *deft = NULL;
Cursor_ptr tempcur;
if (g_mouse_tp == NULL)
{
#ifndef NEO_sys_report_error_unused
Errinfo_t error = {"set_mouse_icon", NOT_INIT_ADVMOUSE, 0};
throw_error(error);
#endif
}
#ifndef NEO_mouse_icon_unused
if (p_iconfile!=NULL)
{
FILE *fp;
fp = fopen(p_iconfile, "rb");
if (fp!=NULL)
{
fclose(fp);
tempcur = load_icon(p_iconfile);
memcpy(g_mouse_tp->iconbuffer_p, tempcur, sizeof(Cursor));
free(tempcur);
cursor_refresh();
return 1;
}
else
{
#ifndef NEO_sys_report_error_unused
Errinfo_t error = {"set_mouse_icon", NO_FILE, 1};
throw_error(error);
#endif
}
}
#else
p_iconfile += 0; /*加上此句只是为在条件编译时不报警*/
#endif
#ifndef NEO_mouse_cursor_unused
/*当指定的光标文件找不到时,执行以下代码*/
/*以下代码段是在光标缓冲区填入默认的箭头形光标*/
memset(g_mouse_tp->iconbuffer_p->buffer, TPT8 + 16, 1024);
g_mouse_tp->iconbuffer_p->color64k[1] = 0x0000;
g_mouse_tp->iconbuffer_p->color64k[_WHITE_] = 0xffff;
deft = g_mouse_tp->iconbuffer_p->buffer;
*deft = 1;
*(deft += 32) = *(deft + 1) = 1;
*(deft += 32) = *(deft + 2) = 1;
*(deft + 1) = _WHITE_;
*(deft += 32) = *(deft + 3) = 1;
*(deft + 1) = *(deft + 2) = _WHITE_;
*(deft += 32) = *(deft + 4) = 1;
*(deft + 1) = *(deft + 2) = *(deft + 3) = _WHITE_;
*(deft += 32) = *(deft + 5) = 1;
*(deft + 1) = *(deft + 2) = *(deft + 3) = *(deft + 4) = _WHITE_;
*(deft += 32) = *(deft + 6) = 1;
*(deft + 1) = *(deft + 2) =*(deft + 3)=*(deft + 4)=*(deft + 5)=_WHITE_;
*(deft += 32) = *(deft + 7) = 1;
memset((deft + 1), _WHITE_, 6);
*(deft += 32) = *(deft + 8) = 1;
memset((deft + 1), _WHITE_, 7);
*(deft += 32) = *(deft + 9) = 1;
memset((deft + 1), _WHITE_, 8);
*(deft += 32) = 1;
memset((deft + 1), _WHITE_, 5); memset((deft + 6), 1, 5);
*(deft += 32) = *(deft + 3) = *(deft + 6) = 1;
*(deft + 1) = *(deft + 2) = *(deft + 4) = *(deft + 5) = _WHITE_;
*(deft += 32) = *(deft + 2) = *(deft + 4) = *(deft + 7) = 1;
*(deft + 1) = *(deft + 5) = *(deft + 6) = _WHITE_;
*(deft += 32) = *(deft + 1) = *(deft + 4) = *(deft + 7) = 1;
*(deft + 5) = *(deft + 6) = _WHITE_;
*(deft += 32) = *(deft + 5) = *(deft + 8) = 1;
*(deft + 6) = *(deft + 7) = _WHITE_;
deft += 32;
*(deft + 5) = *(deft + 8) = 1;
*(deft + 6) = *(deft + 7) = _WHITE_;
deft += 32;
*(deft + 6) = *(deft + 9) = 1;
*(deft + 7) = *(deft + 8) = _WHITE_;
deft += 32;
*(deft + 6) = *(deft + 9) = 1;
*(deft + 7) = *(deft + 8) = _WHITE_;
deft += 32;
*(deft + 7) = *(deft + 8) = 1;
#else
deft += 0;
#endif
cursor_refresh();
return 0;
}
/*---------------------------------------------------*
*函数功能: 获得当前的鼠标高级按键状态. *
*参数说明: 无. *
*返回说明: 返回0 : 没有动作; *
* 返回1 : 左键单击; *
* 返回2 : 右键单击; *
* 返回3 : 左右同时单击; *
* 返回5 : 左键双击; *
*备 注: 高级鼠标控制函数.用户可直接调用. *
*---------------------------------------------------*/
int get_click_info(void)
{
#ifdef NEO_mouse_bind_timer_unused
mouse_refresh();
#else
if (!_timer_installed)
{
mouse_refresh();
}
else
{
check_click();
}
#endif
return g_mouse_tp->mouse_b;
}
/*---------------------------------------------------*
*函数功能: 鼠标关闭函数,主要用于释放鼠标结构占用的内*
* 存. *
*参数说明: 无. *
*返回说明: 无. *
*备 注: 由清理函数neo_exit();会自动调用所以用户一*
* 般不用直接调用 *
*---------------------------------------------------*/
void remove_mouse(void)
{
if (g_mouse_tp != NULL)
{
free(g_mouse_tp);
g_mouse_tp = NULL;
}
g_routines &= 253;
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -