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

📄 ninput.h

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

  Open Source Obey NEO_PL.TXT.
  http://neo.coderlife.net
  ckerhome@yahoo.com.cn

  文件名称 : ninput.h
  摘    要 : 本头文件中包含NEO SDK里有关键盘、鼠标控制的各种函数、结构、全局变量
             的声明及定义
  当前版本 : V5.04
  作    者 : 董凯
  完成日期 : 2006.02.12

  取代版本 : V5.02
  原 作 者 : 董凯
  完成日期 : 2006.02.09
*/

#ifndef NINPUT_H
#define NINPUT_H

/*======================================================*
 *    宏和结构的定义(Macro & type definitions)     *
 *======================================================*/
#ifdef  NEO_mouse_bas_unused
#define NEO_mouse_exp_unused
#endif

    /*双击延时量(单位:秒*18):FAST_DBLCLICK为最短延时;SLOW_DBLCLICK为最长延时;MIDDLE_DBLCLICK为中
      速延时,即两次左键单击时间间隔小于0.35秒时被视为一次双击动作.其判定过程通过函数refresh-
      cursor()实现.*/
#define FAST_DBLCLICK    0x3L
#define MID_DBLCLICK     0x5L
#define SLOW_DBLCLICK    0x9L

#define MOUSE_L_DOWN     0x1
#define MOUSE_R_DOWN     0x2
#define MOUSE_LR_DOWN    0x3
#define MOUSE_LDBL_CLICK 0x5
#define MOUSE_RDBL_CLICK 0x6
#define MOUSE_L_UP       0x8
#define MOUSE_R_UP       0x10

#ifndef KEY_BUF_SIZE
#define KEY_BUF_SIZE     0x10
#endif

#define SCAN_ALT 56
#define SCAN_CTRL 29
#define SCAN_caps 58
#define SCAN_LEFTSHIFT 42
#define SCAN_RIGHTSHIFT 54
#define SCAN_SHIFT (keyflag[SCAN_RIGHTSHIFT]||keyflag[SCAN_LEFTSHIFT])
/*     键盘 ASCII 码     */
#define KEY_ESC 27
#define KEY_END 255
#define KEY_LEFT 254
#define KEY_RIGHT 253
#define KEY_PAGEUP 252
#define KEY_UP 251
#define KEY_DOWN 250
#define KEY_HOME 249
#define KEY_CTRLBREAK 248
#define KEY_F1 247
#define KEY_F2 246
#define KEY_F3 245
#define KEY_F4 244
#define KEY_F5 243
#define KEY_F6 242
#define KEY_F7 241
#define KEY_F8 240
#define KEY_F9 239
#define KEY_F10 238
#define KEY_PAGEDOWN 237
#define KEY_INSERT 236
#define KEY_DELETE 235
#define KEY_LEFTALT 234
#define KEY_RIGHTALT 233
#define KEY_RIGHTCTRL 232
#define KEY_LEFTCTRL 231
#define KEY_caps 230
#define KEY_F11 229
#define KEY_F12 228
#define KEY_PRINTSCREEN 228
#define KEY_NUMLOCK 227
#define KEY_SCROLLLOCK 226
#define KEY_LEFTSHIFT 225
#define KEY_RIGHTSHIFT 224
#define KEY_WINDOWS 223

#ifndef NEO_keyboard_unused
unsigned char g_pause_key;
unsigned char g_ascii_key;
unsigned char g_scan_key;
unsigned char keyflag[128];
unsigned char g_keypress;
/*unsigned char g_wheel_flag = FALSE;*/
unsigned g_key;
unsigned g_key_filter = 0xffff;
unsigned g_combine_keys_delay = 400;
static unsigned char g_caps;
static unsigned char g_cur_code,g_key_code;
#endif

void interrupt far (*old_key_int)(__CPPARGS);

#ifndef NEO_keyboard_unused
unsigned char asciis[] =
{

   0,27,'1','2','3','4','5','6','7','8','9','0','-','=',8,9,
   'q','w','e','r','t','y','u','i','o','p','[',']',13,KEY_LEFTCTRL,'a','s',
   'd','f','g','h','j','k','l',';',39,'`',0,92,'z','x','c','v',
   'b','n','m',',','.','/',0,'*',KEY_LEFTALT,' ',KEY_caps,KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,
   KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_NUMLOCK,KEY_SCROLLLOCK,'7','8','9','-','4','5','6','+','1',
   '2','3','0',127,0,0,'\\',KEY_F11,KEY_F12,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
#endif


#ifndef NEO_keyboard_unused
unsigned char shifts[] =
{
   0,27,'!','@','#','$','%','^','&','*','(',')','_','+',8,9,
   'Q','W','E','R','T','Y','U','I','O','P','{','}',13,1,'A','S',
   'D','F','G','H','J','K','L',':',34,'~',KEY_LEFTSHIFT,'|','Z','X','C','V',
   'B','N','M','<','>','?',KEY_RIGHTSHIFT,'*',1,' ',0,0,0,0,0,0,
   0,0,0,0,0,0,0,'7','8','9','-','4','5','6','+','1',
   '2','3','0',127,0,0,'|',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
#endif


#ifndef NEO_keyboard_unused
char specials[] =
{
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,KEY_RIGHTCTRL,0,0,
   0,0,0,0,0,0,0,0,0,0,KEY_WINDOWS,0,0,0,0,0,
   0,0,0,0,0,'/',0,KEY_PRINTSCREEN,KEY_RIGHTALT,0,0,0,0,0,0,0,
   0,0,0,0,0,0,KEY_CTRLBREAK,KEY_HOME,KEY_UP,KEY_PAGEUP,0,KEY_LEFT,0,KEY_RIGHT,0,KEY_END,
   KEY_DOWN,KEY_PAGEDOWN,KEY_INSERT,KEY_DELETE,0,0,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
#endif


#ifndef NEO_mouse_exp_unused
typedef struct
{
   unsigned int cursor[32];

   char hotx;
   char hoty;
}Hardcur_T;

Hardcur_T g_arrow_t=
{
   {
       0x3fff,0x1fff,0x0fff,0x07ff,
       0x03ff,0x01ff,0x00ff,0x007f,
       0x003f,0x00ff,0x01ff,0x10ff,
       0x30ff,0xf87f,0xf87f,0xfc3f,
       0x0000,0x7c00,0x6000,0x7000,
       0x7800,0x7c00,0x7e00,0x7f00,
       0x7f80,0x7e00,0x7c00,0x4600,
       0x0600,0x0300,0x0300,0x0180
   },
   0,0,
};
#endif

#ifndef NEO_keyboard_unused
   unsigned g_key_buf[KEY_BUF_SIZE];
   unsigned char g_head_count;
   unsigned char g_tail_count;
#endif

#ifndef NEO_mouse_adv_unused
typedef struct
{
   int x;         /*当前鼠标光标 x坐标*/
   int y;         /*当前鼠标光标 y坐标*/
   /*int z;*/     /*当前鼠标滚轮偏移量*/
   #ifndef NEO_mouse_exp_unused
   char logic_x;  /*鼠标光标贴图的逻辑坐标(相对于以上的两个物理坐标,可以为负值)*/
   char logic_y;
   #endif
   long dblclickdelay;   /*双击延时变量.当第二次按下鼠标键与第一次的时间间隔小于该变量时,被
                          认为是双击鼠标键*/

   char advclickinfo;                  /*当前鼠标的按键状态,
                                         clickinfo=0 : 没动作;
                                         clickinfo=1 : 左键被按下;
                                         clickinfo=2 : 右键被按下;
                                         clickinfo=3 : 两键同时按下;
                                         clickinfo=5 : 左键被双击; */
   int oldclickinfo;
   clock_t start;
   clock_t end;                  /*这几个变量是为实现记录左键双击而设的“私有”变量*/

   char status_flag;/*临时去掉鼠标光标标志,为1时暂时不显示光标,一般用在作画操作前隐藏鼠标,防止满屏留下鼠标拖动轨迹*/

   #ifdef NEO_color_depth_16_unused
   char overlay_buf[CUR_SIDE];/*覆盖缓冲区:保存被光标覆盖的屏幕,以在光标移开后恢复*/
   #else
   int overlay_buf[CUR_SIDE];
   #endif

   Cursor iconbuffer;          /*光标缓冲区:保存被光标(文件)的位图信息,用以显示光标*/
   Cursor_ptr iconbuffer_p;    /*指向光标缓冲区的指针,用作调用相关函数的参数*/
   char mouse_b;
}Mouse_t;
Mouse_t *g_mouse_tp;
#endif

/*======================================================*
 *              函数声明(Function declare)              *
 *======================================================*/

#define keyboard_callback(key_filter) (g_key_filter = (key_filter))
#define _get_asc() (g_keypress == 1?g_ascii_key : 0)
#define _get_scan() (g_keypress == 1?g_scan_key : 0)
void clear_keybuf(void);
void interrupt new_key_int(__CPPARGS);
unsigned readkey(void);
void simulate_keypress(unsigned  key);
void install_keyboard(void);
void remove_keyboard(void);
unsigned char _getch(void);
unsigned char get_asc(void);
unsigned char get_scan(void);
         /*NEO的键盘例程提供的函数不能与TC标准库的键盘处理函数混用(如getch();)否则将无法正常结束程序*/
char keypressed(void);
char scan_asc_key(unsigned char scankey, unsigned char asckey);

#ifndef NEO_mouse_bas_unused
/*判断鼠标是否发生按键动作.*/
#define mouse_act() get_click() == 0?0 : 1

int init_mouse(void);     /*初始化鼠标器.*/
int get_mouse_x(void);     /*获取当前鼠标光标X坐标.*/
int get_mouse_y(void);     /*获取当前鼠标光标Y坐标.*/
char get_click(void);  /*获取当前鼠标按钮状态.*/
                     /*获取按钮按下状态.*/
unsigned get_press_info(int key, int *x, int *y, int *count);
                     /*获取按钮放开状态.*/
unsigned get_release_info(int key, int *x, int *y, int *count);
void locate_mouse(int x,int y);
                     /*显示鼠标光标.*/
void show_hard_cur(void);
                     /*隐藏鼠标光标.*/
void hide_hard_cur(void);
                     /*设置光标的有效活动范围.*/
void set_mouse_range(int xmin,int xmax,int ymin,int ymax);
#endif

#ifndef NEO_mouse_exp_unused
void mouse_shape(Hardcur_T cur);
void set_mouse_speed(int vx,int vy);
                     /*设置光标速度加速下限.*/
void speed_limit(int ms);
                       /*设置鼠标光标焦点*/
void set_mouse_focus(char f_x, char f_y);
#endif

#ifndef NEO_mouse_adv_unused
char install_mouse(void);   /*鼠标器高级初始化.*/
                     /*设置光标坐标.*/
void position_mouse(int x,int y);
void show_mouse(void);     /*鼠标图形光标显示.*/
void hide_mouse(void);     /*鼠标图形光标隐藏.*/
void cursor_refresh(void);   /*鼠标图形光标的更新显示.*/
void scare_mouse_area(int x, int y, int w, int h);  /*设置光标的隐藏区域*/
void scare_mouse(void);    /*暂时隐藏光标*/
void unscare_mouse(void);  /*取消光标隐藏*/
int  mouse_refresh(void);  /*鼠标图形光标的刷新.*/
                          /*鼠标双击判定延时设置.*/
void set_dbl_click_delay(int userdelay);
                          /*改变鼠标光标的形状.*/
int  set_mouse_icon(char *p_iconfile);
int  get_click_info(void);/*获得当前的鼠标高级按键状态.*/
void remove_mouse(void);     /*鼠标关闭函数.*/
#endif

/*======================================================*
 *            函数定义(Function definitions)            *
 *======================================================*/
#ifndef NEO_keyboard_unused
void clear_keybuf(void)
{
   if (!_keyboard_installed)
   {
      #ifndef NEO_sys_report_error_unused
      Errinfo_t error = {"clear_keybuf", N_KEYB_NOT_INIT, 0};
      throw_error(error);
      #endif
   }
   else
   {
      g_key = 0;
      memset(keyflag, 0, sizeof(keyflag)); /*键盘映射缓冲归零*/
      memset(g_key_buf, 0, KEY_BUF_SIZE);  /*键盘队列缓冲归零*/
      #ifndef NEO_key_buffer_unused
      g_tail_count = g_head_count;
      #endif
   }
}


void interrupt new_key_int(__CPPARGS)
{
   static unsigned char specialflag;
   static char rec_specials;
   unsigned char k, c, temp;

   k = inp(0x60);
   temp = inp(0x61) | 0x80;
   outportb(0x61,temp);

   if (k == 0xe0) specialflag = 1;
   else if (k == 0xe1) g_pause_key = 1;
   else
   {
      if (k & 0x80)
      {
         k &= 0x7f;
         keyflag[k] = 0;
         g_keypress = -1;
      }
      else
      {
         g_key_code = g_cur_code;
         g_cur_code = g_scan_key = k;
         keyflag[k] = 1;
         if (specialflag) /*防止特殊键被重复判断*/
         {
            c = specials[k];
            if (rec_specials == -33)
            {
               if (c) g_ascii_key = c;
               specialflag = rec_specials = 0;
               outportb(0x20,0x20);
               return;
            }
            rec_specials = -33;
         }
         else
         {
            if (k == SCAN_caps)
            {
               g_caps = (~g_caps) & 1;
            }
            if (SCAN_SHIFT)
            {
               c = shifts[k];
               if ((c >= 'A')&&(c <= 'Z') && g_caps)
               c += 'a'- 'A';
            }
            else
            {
               c=asciis[k];
               if (( c >= 'a') && (c <= 'z') && g_caps)
               c -= 'a' - 'A';
            }
         }
         if (c) g_ascii_key = c;
         g_keypress = 1;
      }
      specialflag=0;
   }
   outportb(0x20,0x20);

   #ifndef NEO_key_buffer_unused
   /*往键盘缓冲区放入相应的键值*/
   if (g_keypress == 1 && (g_key = (g_scan_key << 8) + g_ascii_key) != 10975)
   {
      if (g_key_filter == 0xffff)
      {
         g_key_buf[g_head_count] = g_key & g_key_filter;
      }
      else if (g_key_filter == 0)
      { /*按键不被加入缓冲队列*/ }
      else
      {
         g_key_buf[g_head_count] = g_key_filter;
      }
      if ( !((++g_head_count) < KEY_BUF_SIZE) )
      {
         g_head_count = 0;
      }

      if (g_head_count == g_tail_count)
      {
         if( !((++g_tail_count) < KEY_BUF_SIZE) )
         {
            g_tail_count = 0;
         }
      }
   }
   #else
   g_key = (g_scan_key << 8) + g_ascii_key;
   #endif
}


unsigned readkey(void)
{
   #ifndef NEO_key_buffer_unused
   unsigned key;

   while (g_head_count == g_tail_count); /*缓冲区为空时等待*/

   key = g_key_buf[g_tail_count];
   if ( !((++g_tail_count) < KEY_BUF_SIZE) )
   {
      g_tail_count = 0;
   }
   return key;

   #else
   unsigned key = g_key;
   if (g_keypress == 1)
   {
      g_key = 0;
   }
   return key;
   #endif
}


void simulate_keypress(unsigned  key)
{
   #ifndef NEO_key_buffer_unused
   if ((g_key = key) != 10975)
   {
      g_key_buf[g_head_count] = g_key;
      if ( !((++g_head_count) < KEY_BUF_SIZE) )
      {
         g_head_count = 0;
      }

      if (g_head_count == g_tail_count)
      {
         if( !((++g_tail_count) < KEY_BUF_SIZE) )

⌨️ 快捷键说明

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