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

📄 ninput.h

📁 NEO SDK是一个跨平台的免费开源图形软件开发包。它支持基本绘图、多种格式图形显示、鼠标操 作、扩展内存和扩充内存的操作、时钟、音频播放、多种字体的汉字及英文显示等等特性;更激动人心的是
💻 H
📖 第 1 页 / 共 3 页
字号:
      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 + -