易码技术论坛

 找回密码
 加入易码
搜索
查看: 193044|回复: 10

Lava有输入函数吗?怎么做?

[复制链接]
发表于 2007-1-21 18:37:11 | 显示全部楼层

看LavaX编程手册
 楼主| 发表于 2007-1-21 18:48:37 | 显示全部楼层
Lava1.0有吗?
发表于 2007-1-21 18:52:10 | 显示全部楼层
有!!!
发表于 2007-1-21 19:12:34 | 显示全部楼层
/*===================================输入法区=========================================*/
char num_data[]=//拼音输入法的下提示选字的数字
  {
  // 宽=104,=5
  0x77,0xf7,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,
  0x77,0x77,0xf7,0x7f,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,0xff,0xff,
  0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,
  0xff,0xff,0x77,0x77,0x77,0xf7,0x77,0x77,0x77,0x77,0x77,0x7f,0x77,0x77,0x77,0x77,
  0x77,0x7f,0x77,0x77,0x77,0x77,0xf7,0x7f,0x77,0x77,0x77,0x77,0xf7,0x77,0x77,0x77,
  0x77,0x77,0xf7,0x77,0x77,0x77,0x77,0x77,0x77,0x7f,0x77,0x77,0x77,0x77,0xf7,0x7f,
  0x77,0x77,0x77,0x77,0xf7,0x7f,0x77,0x77,0x77,0xf7,0x77,0x77,0x77,0x77,0xff,0xff,
  0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,
  0xff,0xff,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,0x77,0x7f,0x77,0x77,
  0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0xf7,0x77,0x77,
  0x77,0x77,0xf7,0x77,0x77,0x77,0x77,0x77,0x77,0x7f,0x77,0x77,0x77,0x77,0x77,0x7f,
  0x77,0x77,0x77,0x77,0x77,0x7f,0x77,0x77,0x77,0x77,0xf7,0x7f,0x77,0x77,0x77,0x77,
  0x77,0x7f,0x77,0x77,0x77,0x77,0xf7,0x7f,0x77,0x77,0x77,0x77,0x77,0x7f,0x77,0x77,
  0x77,0xf7,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,
  0x77,0x77,0x77,0x7f,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,0xff,0xff,
  0x77,0x77,0x77,0x77,0x77,0x7f,0x77,0x77,0x77,0x77,0xff,0xff,0x77,0x77,0x77,0x77,
  0xff,0xff,0x77,0x77
  };

#define USE_QUEWEI  1 //编译区位输入集成到五笔输入,不想要可屏蔽该语句
#define MAX_FINDSTR  167
//存放搜索用字串数组的长度,必须是奇数,最大25*25+1即可,最小27
//标准版词库最大取331就够了

struct TABLE_P1
{
int  max;
int  len;
long pos;
};//长度8
struct TABLE_P2
{
int  max;
int  len;
long pos;
long search;
int  num[2];
};//长度16

int  Wb_begin1,Wb_begin2;
int  Wb_len[3];
int  Wb_tsize[2];//sizeof(TABLE_P1),sizeof(TABLE_P2)
//因为#bigram会造成结构体大小向特定数对齐,所以直接从文件中读取原写入值
char Wb_dname[5];
char scanf_data[6400];
char Wb_fp;
int Wb_i;

void WB2GB_Exit()
{
fclose(Wb_fp);
}
void WB2GB_Init()
{
char ver[5];
Wb_fp=fopen("/LavaData/wb2gb.dic","r");
fseek(Wb_fp,32,0);
fread(ver,1,4,Wb_fp);
if(strcmp(ver,"1.01")!=0)
  {
  SetScreen(1);
  printf("没有五笔字库!五笔中文输入法不能用!",ver);
  getchar();
  }
fseek(Wb_fp,50,0);
fread(Wb_dname,1,sizeof(Wb_dname),Wb_fp);
fread(Wb_tsize,1,sizeof(Wb_tsize),Wb_fp);
Wb_begin1=ftell(Wb_fp);
Wb_begin2=Wb_begin1+Wb_tsize[0]*25;
}

int System_QW2GB(long qwc,long buf)
{
char gb[4];
if(strlen(qwc)!=4)return -1;
gb[0]=*(qwc+0)*10+ *(qwc+1)- 368;
gb[1]=*(qwc+2)*10+ *(qwc+3)- 368;
gb[2]=0;
if(gb[0]>160&&gb[1]>160)strcpy(buf,gb);
else return -1;
return gb[0]|gb[1]<<8;
}

long System_WB2GB(int iq,long ims,long buf,int bufsize)
//返回值低16位:实际取词个数
//返回值高16位:最大取词个数
//iq :取词的序数,从0开始
//ims:待查找的五笔码
//buf:返回五笔码对应的字词
//bufsize:缓存区大小,强烈建议直接用sizeof(数组名)
{
struct TABLE_P1 Addr;
struct TABLE_P2 Tab2;
int  max,len,num;
long pos,pos0;
char p1,p2;
char wbs[5];
char fds[MAX_FINDSTR];
//*buf=0;
if(iq<0) return -1;
#ifdef USE_QUEWEI
if(wbs[0]==&#39;v&#39; && isdigit(wbs[1]))
  {
  if(System_QW2GB(&wbs[1],buf)==-1)return -1;
  else return 0x00010001;
  }
#endif
len=strlen(ims);
if(len<=0||len>4)return -1;//五笔码长度越界
for(Wb_i=0;Wb_i<len;Wb_i++)
  {
  wbs[Wb_i]=tolower(*ims++);
  if(!islower(wbs[Wb_i]))return -1;
  }
p1=wbs[0]-&#39;a&#39;;
p2=wbs[1]-&#39;a&#39;;
if(len==1)fseek(Wb_fp,Wb_begin1+Wb_tsize[0]*p1,SEEK_SET);
else
if(len==2)fseek(Wb_fp,Wb_begin2+Wb_tsize[1]*(p1*25+p2),SEEK_SET);
else
if(len==3)
  {
  fseek(Wb_fp,Wb_begin2+Wb_tsize[1]*(p1*25+p2),SEEK_SET);
  fread(Tab2,1,Wb_tsize[1],Wb_fp);
  fseek(Wb_fp,Tab2.search,SEEK_SET);
  fread(fds,1,Tab2.num[0],Wb_fp);
  pos=strchr(fds,wbs[2])-fds;
  if(pos==-fds)return -1;
  fseek(Wb_fp,pos*Wb_tsize[0],SEEK_CUR);
  }
else
  {
  fseek(Wb_fp,Wb_begin2+Wb_tsize[1]*(p1*25+p2),SEEK_SET);
  fread(Tab2,1,Wb_tsize[1],Wb_fp);
  if(!Tab2.num[0])pos0=Tab2.search;
  else pos0=Tab2.search+Tab2.num[0]+Wb_tsize[0]*(Tab2.num[0]-1);
  fseek(Wb_fp,pos0,SEEK_SET);
  max=len=Tab2.num[1];
  num=sizeof(fds)-1;
  fds[num]=0;
  for(Wb_i=0;max>0;Wb_i++)
    {
    if(len<=num)fread(fds,1,max,Wb_fp);
    else fread(fds,1,num,Wb_fp);
    for(pos=-1;pos%2&&pos!=-fds;)pos=strstr(fds+pos+1,&wbs[2])-fds;
    if(pos>=0)break;
    max=max-num;
    }//end for i
  if(pos==-fds)return -1;
  pos=(pos+num*Wb_i)/2;
  fseek(Wb_fp,pos0+len+pos*Wb_tsize[0],SEEK_SET);
  }
fread(Addr,1,Wb_tsize[0],Wb_fp);
num=Addr.max-iq;
pos=buf+num;
if(num<=0)return -1;//序号越界或没找到
if(bufsize-num<Addr.len)return  0;//缓存区过小
fseek(Wb_fp,Addr.pos,0);
fread(pos,1,Addr.len,Wb_fp);
pos0=buf;
for(Wb_i=0;Wb_i<Addr.max;)
  {
  if(Wb_i++>=iq){*buf++=pos-pos0;}
  pos=pos+strlen(pos)+1;
  }
return num|Addr.max<<16;//num:返回词个数,max:最大词个数
}
//以上是由诗诺比提供的五笔中文输入系统

void clearscreen()
{
Block(0,0,160,80,0);
}

void Button(char x1,char y1,char x2,char y2,char type)//按钮
{//x1 左上角横坐标,x2 左上角纵坐标,x3 右下角横坐标,x4 右下角纵坐标,type=0 凹,type=1 凸,type=2 阴影
if(type==2)
  {
  SetFgColor(15);
  Rectangle(x1,y1,x2,y2,1);
  Rectangle(x2+1,y1+2,x2+2,y2+2,1);
  Rectangle(x1+2,y2+1,x2+2,y2+2,1);
  }
else
  {
  SetFgColor(13-type*12);
  Rectangle(x1,y1,x2,y2,1);
  SetFgColor(1+type*12);
  Rectangle(x2,y1,x2,y2,1);
  Rectangle(x1,y2,x2,y2,1);
  }
SetFgColor(15);
}

void print_word(char mode,char caps,char china)//输入法的皮肤
{
char word[19];
WriteBlock(0,0,160,80,0x81,scanf_data);
if(mode==2 && china==0)
  {
  Block(22,3,138,75,0);
  Button(22,3,138,75,1);
  Button(23,4,137,74,1);
  }
else
  {
  Block(22,3,138,69,0);
  Button(22,3,138,69,1);
  Button(23,4,137,68,1);
  }
SetBgColor(0);
Block(24,5,136,17,0);
TextOut(44,5,"数据输入系统",1);
SetBgColor(7);
Block(24,5,136,17,2);
Button(25,19,135,34,0);
SetBgColor(0);
if(mode==0)
  {
  Block(26,36,51,49,0);
  TextOut(27,37,"数字",1);
  Block(26,36,51,49,2);
  }
else
if(mode==1)
  {
  Block(26,36,75,49,0);
  if(caps==1)TextOut(27,37,"英文大写",1);
  else TextOut(27,37,"英文小写",1);
  Block(26,36,75,49,2);
  }
else
  {
  Block(26,36,51,49,0);
  if(china==1)TextOut(27,37,"五笔",1);
  else TextOut(27,37,"拼音",1);
  Block(26,36,51,49,2);
  }
SetBgColor(7);
Button(25,51,135,66,0);
if(mode==2 && china==0)WriteBlock(31,68,104,5,0x81,num_data);
}

long english(char caps)
{
long cz;
char word_data[19];
char mode,scanf_t;
cz=0;
SetFgColor(15);
for(;;)
  {
  scanf_t=getchar();
  if(scanf_t==29 || scanf_t==13 || scanf_t==27)return scanf_t;
  else
  if(scanf_t==26)
    {
    caps++;
    if(caps==2)caps=0;
    return caps;
    }
  else
  if(scanf_t==18)return -1;
  else
  if(scanf_t>=&#39;a&#39; && scanf_t<=&#39;z&#39;)
    {
    cz=scanf_t-caps*32;
    return cz;
    }
  else
  if(scanf_t>=48 && scanf_t<=57)return scanf_t;//输入数字字符
  }
}

long number()//用于老式键盘输入数字字符,TC800上用可以不要这个函数
{
long cz;
char word_data[19];
char mode,scanf_t;
cz=0;
SetFgColor(15);
for(;;)
  {
  scanf_t=getchar();
  if(scanf_t==29 || scanf_t==13 || scanf_t==27)return scanf_t;
  else
  if(scanf_t==18)return -1;
  else
  if(scanf_t==&#39;0&#39;)return 48;
  else
  if(scanf_t==&#39;b&#39;)return 49;
  else
  if(scanf_t==&#39;n&#39;)return 50;
  else
  if(scanf_t==&#39;m&#39;)return 51;
  else
  if(scanf_t==&#39;g&#39;)return 52;
  else
  if(scanf_t==&#39;h&#39;)return 53;
  else
  if(scanf_t==&#39;j&#39;)return 54;
  else
  if(scanf_t==&#39;t&#39;)return 55;
  else
  if(scanf_t==&#39;y&#39;)return 56;
  else
  if(scanf_t==&#39;u&#39;)return 57;
  }
}

long wb(long add,long adda,int str_len)//五笔中文输入法
{
int cz,lenn;
int wb_i,wb_j;
int max,lx,ip;
char hz[32],wbm[5];
long res,num;
char word_data[19],wb_t,sa[50];
memset(word_data,0,str_len+1);
memcpy(word_data,adda,strlen(adda));
for(;;)
  {
  wbm[0]=0;
  lx=0;
  for(;;)
    {
    cz=0;
    lenn=strlen(word_data);
    print_word(2,1,1);
    TextOut(27,21,word_data,1);
    if(strlen(word_data)<18)Block(strlen(word_data)*6+27,32,strlen(word_data)*6+31,33,1);
    else
      {
      if(word_data[str_len-1]<160)Block(strlen(word_data)*6+21,32,strlen(word_data)*6+25,33,1);
      else Block(strlen(word_data)*6+15,32,strlen(word_data)*6+25,33,1);
      }
    TextOut(52,37,wbm,1);
    Refresh();
    wb_t=getchar();
    if(wb_t>=&#39;a&#39; && wb_t<=&#39;y&#39;)
      {
      wbm[lx++]=wb_t;
      wbm[lx]=0;
      if(lx==4)break;
      }
    else
    if(wb_t==13 || wb_t==27)
      {
      memcpy(add,word_data,strlen(word_data));
      return wb_t;
      }
    else
    if(wb_t==32)break;
    else
    if(wb_t==18)
      {
      memset(add,0,str_len+1);
      memcpy(add,word_data,strlen(word_data));
      return 2;
      }
    else
    if(wb_t==26)
      {
      memset(add,0,str_len+1);
      memcpy(add,word_data,strlen(word_data));
      return 1;
      }
    else
    if(wb_t==23)
      {
      if(lx)
        {
        wbm[--lx]=0;
        ip=0;
        }
      }
    else
    if(wb_t==29 && lenn)
      {
      lenn--;
      if(word_data[lenn]>=160)
        {
        lenn--;
        memset(word_data+lenn,0,2);
        }
      else word_data[lenn]=0 ;
      continue ;
      }
    }
  res=System_WB2GB(0,wbm,hz,sizeof(hz));
  TextOut(52,37,wbm,1);
  if(res==-1 || res==0)continue;
  num=res&0xffff;
  max=res>>16;
  lenn=strlen(word_data);
  if(num==1)//无重码
    {
    if(lenn<str_len-1)memcpy(word_data+lenn,hz+hz[0],(str_len-lenn)/2*2);
    else continue;
    }
  else//有重码
    {
    wb_j=0;
    for(wb_i=0;wb_i<num;wb_i++)
      {
      sprintf(sa,"%d",wb_i+1);
      TextOut(wb_j*6+27,53,sa,1);
      TextOut(wb_j*6+33,53,hz+hz[wb_i],1);
      wb_j=wb_j+strlen(hz+hz[wb_i])+1;
      }
    Refresh();
    wb_t=getchar();
    if(wb_t==18)
      {
      memset(add,0,str_len+1);
      memcpy(add,word_data,strlen(word_data));
      return 2;
      }
    if(wb_t==26)
      {
      memset(add,0,str_len+1);
      memcpy(add,word_data,strlen(word_data));
      return 1;
      }
    if(lenn<str_len-1)//选字
      {
      if(wb_t==&#39;b&#39;|| wb_t==&#39;1&#39; || wb_t==32)memcpy(word_data+lenn,hz+hz[0],(str_len-lenn)/2*2);
      if((wb_t==&#39;n&#39;|| wb_t==&#39;2&#39;) && num>1)memcpy(word_data+lenn,hz+hz[1],(str_len-lenn)/2*2);
      if((wb_t==&#39;m&#39;|| wb_t==&#39;3&#39;) && num>2)memcpy(word_data+lenn,hz+hz[2],(str_len-lenn)/2*2);
      if((wb_t==&#39;g&#39;|| wb_t==&#39;4&#39;) && num>3)memcpy(word_data+lenn,hz+hz[3],(str_len-lenn)/2*2);
      if((wb_t==&#39;h&#39;|| wb_t==&#39;5&#39;) && num>4)memcpy(word_data+lenn,hz+hz[4],(str_len-lenn)/2*2);
      if((wb_t==&#39;j&#39;|| wb_t==&#39;6&#39;) && num>5)memcpy(word_data+lenn,hz+hz[5],(str_len-lenn)/2*2);
      }
    }
  }
}

long chinese(long add,int str_len)//拼音中文输入法
{
int cz,py_i,py_j;
char pinyin[10];
int id,lx;
int sum;
long tg;
char wd[60],py_t;
char word_data[19];
memset(word_data,0,19);
memcpy(word_data,add,strlen(add));
SetFgColor(15);
pinyin[0]=0;
lx=0;
id=0;
sum=0;
tg=-1;
print_word(2,0,0);
TextOut(27,21,word_data,1);
if(strlen(word_data)<18)Block(strlen(word_data)*6+27,32,strlen(word_data)*6+31,33,1);
  else
    {
    if(word_data[str_len-1]<160)Block(strlen(word_data)*6+21,32,strlen(word_data)*6+25,33,1);
    else Block(strlen(word_data)*6+15,32,strlen(word_data)*6+25,33,1);
    }
Refresh();
for(;;)
  {
  py_t=getchar();
  if(py_t==23)
    {
    if(lx)
      {
      pinyin[--lx]=0;
      id=0;
      sum=0;
      }
    }
  else
  if(py_t==27 || py_t==29 || (py_t==13 && tg==-1))return py_t;
  else
  if(py_t==26)return 1;
  else
  if(py_t==18)return 2;
  else
  if(py_t==21)
    {
    if(id+9<sum)id=id+9;
    }
  else
  if(py_t==20)
    {
    if(id>9)id=id-9;
    else id=0;
    }
  else
  if(py_t>=&#39;a&#39; && py_t<=&#39;z&#39;)
    {
    if(lx<6)
      {
      pinyin[lx++]=py_t;
      pinyin[lx]=0;
      id=0;
      sum=0;
      }
    }
  else
  /************下面的功能是老式键盘用的,TC800上用可以去掉这些****************/
  if(py_t==13 && tg!=-1)
    {
    py_i=0;
    for(;;)
      {
      for(;;)
        {
        if(id+py_i>=sum)py_i--;
        else
        break;
        }
      tg=System.PY2GB(id,pinyin,wd);
      Block(27,53,134,64,0);
      TextOut(27,53,wd,1);
      Block(py_i*12+27,53,py_i*12+38,64,2);
      Refresh();
      py_t=getchar();
      if(py_t==22)
        {
        py_i++;
        if(id+py_i>=sum || py_i>8)py_i=0;
        }
      else
      if(py_t==23)
        {
        py_i--;
        if(py_i<0)py_i=8;
        }
      else
      if(py_t==21)
        {
        if(id+9<sum)id=id+9;
        }
      else
      if(py_t==20)
        {
        if(id>9)id=id-9;
        else id=0;
        }
      else
      if(py_t==27)break;
      else
      if(py_t==13)
        {
        py_t=py_i+49;
        break;
        }
      }
    }
  /************上面的功能是老式键盘用的,TC800上用可以去掉这些****************/  
  
  if(py_t==&#39;1&#39;)
    {
    cz=wd[0]+wd[1]*256;
    return cz;
    }
  else
  if(py_t==&#39;2&#39; && id+1<sum)
    {
    cz=wd[2]+wd[3]*256;
    return cz;
    }
  else
  if(py_t==&#39;3&#39; && id+2<sum)
    {
    cz=wd[4]+wd[5]*256;
    return cz;
    }
  else
  if(py_t==&#39;4&#39; && id+3<sum)
    {
    cz=wd[6]+wd[7]*256;
    return cz;
    }
  else
  if(py_t==&#39;5&#39; && id+4<sum)
    {
    cz=wd[8]+wd[9]*256;
    return cz;
    }
  else
  if(py_t==&#39;6&#39; && id+5<sum)
    {
    cz=wd[10]+wd[11]*256;
    return cz;
    }
  else
  if(py_t==&#39;7&#39; && id+6<sum)
    {
    cz=wd[12]+wd[13]*256;
    return cz;
    }
  else
  if(py_t==&#39;8&#39; && id+7<sum)
    {
    cz=wd[14]+wd[15]*256;
    return cz;
    }
  else
  if(py_t==&#39;9&#39; && id+8<sum)
    {
    cz=wd[16]+wd[17]*256;
    return cz;
    }
  print_word(2,0,0);
  TextOut(27,21,word_data,1);
  if(strlen(word_data)<18)Block(strlen(word_data)*6+27,32,strlen(word_data)*6+31,33,1);
  else
    {
    if(word_data[str_len-1]<160)Block(strlen(word_data)*6+21,32,strlen(word_data)*6+25,33,1);
    else Block(strlen(word_data)*6+15,32,strlen(word_data)*6+25,33,1);
    }
  TextOut(52,37,pinyin,1);
  tg=System.PY2GB(id,pinyin,wd);
  if(tg!=-1)
    {
    sum=tg>>16;
    TextOut(27,53,wd,1);
    }
  Refresh();
  }
}

long inputnum(int str_len)//输入一个整数
{
long cz;
char str_dat[11];
char scanf_t;
int str_n,str_i,str_j;
memset(str_dat,0,10);
str_i=0;
for(;;)
  {
  print_word(0,3,1);
  TextOut(27,21,str_dat,1);
  Block(strlen(str_dat)*6+27,32,strlen(str_dat)*6+32,33,1);
  Refresh();
  scanf_t=getchar();
  str_n=strlen(str_dat);
  if(str_dat[0]==45)str_i=1;
  else str_i=0;
  if((scanf_t==45 || scanf_t==23) && str_n==0)str_dat[0]=45;
  else
  if(scanf_t>=&#39;0&#39; && scanf_t<=&#39;9&#39; && str_n<str_len+str_i)str_dat[str_n]=scanf_t;
  
  /************下面的功能是老式键盘用的,TC800上用可以去掉这些****************/
  else
  if(scanf_t==&#39;b&#39; && str_n<str_len+str_i)str_dat[str_n]=49;
  else
  if(scanf_t==&#39;n&#39; && str_n<str_len+str_i)str_dat[str_n]=50;
  else
  if(scanf_t==&#39;m&#39; && str_n<str_len+str_i)str_dat[str_n]=51;
  else
  if(scanf_t==&#39;g&#39; && str_n<str_len+str_i)str_dat[str_n]=52;
  else
  if(scanf_t==&#39;h&#39; && str_n<str_len+str_i)str_dat[str_n]=53;
  else
  if(scanf_t==&#39;j&#39; && str_n<str_len+str_i)str_dat[str_n]=54;
  else
  if(scanf_t==&#39;t&#39; && str_n<str_len+str_i)str_dat[str_n]=55;
  else
  if(scanf_t==&#39;y&#39; && str_n<str_len+str_i)str_dat[str_n]=56;
  else
  if(scanf_t==&#39;u&#39; && str_n<str_len+str_i)str_dat[str_n]=57;
  /************上面的功能是老式键盘用的,TC800上用可以去掉这些****************/
  
  else
  if(scanf_t==13)
    {
    if(str_dat[0]==45)//判断是否为负数
      {
      str_i=1;
      str_j=-1;
      }
    else
      {
      str_i=0;
      str_j=1;
      }
    str_n=strlen(str_dat);
    if(str_n==0 || (str_n==1 && str_dat[0]==45))return 0;
    cz=str_dat[str_i]-48;
    for(str_i++;str_i<str_n;str_i++)cz=cz*10+str_dat[str_i]-48;//字符串转成数值
    cz=cz*str_j;
    return cz;
    }
  else
  if(scanf_t==27)return 0;
  else
  if(scanf_t==29)str_dat[--str_n]=0;
  }
}

void scanf(long format,long add,int str_len)//输入函数
//format为输入格式,"%s" 为字符串,"%d" 为数值;
//add为将要保存的地址;
//str_len为长度:字符串最长为十八个字节,数值最长为九位数(不包括负号);
//0<str_len<=18;超出这个范围系统会自动设为最大值。

//这个函数可以用五笔和拼音输入中文;最多支持输入九个汉字;
//可以输入英文字符串;最多支持输入十八个英文字母;
//可以输入一个正整数或一个负整数;最多支持输入九位数值(不包括负号)。
{
int cz,scanf_n;
long cz_num;
char cz_str[4];
char word_data[19];
char word[19];
char caps,mode,china;
char gs[3];
caps=1;
mode=2;
china=1;
scanf_n=0 ;
gs[2]=0 ;
SetFgColor(15);
GetBlock(0,0,160,80,0x40,scanf_data);
/******************************输入数值******************************/
if(strcmp(format,"%s")!=0)
  {
  if(str_len<=0 || str_len>9)str_len=9;
  cz_num=inputnum(str_len);
  memcpy(add,&cz_num,4);
  WriteBlock(0,0,160,80,0x81,scanf_data);
  Refresh();
  return;
  }
/******************************输入数值******************************/

/*****************************输入字符串*****************************/
if(str_len<=0 || str_len>18)str_len=18;
memcpy(word_data,add,strlen(add));
for(;;)
  {
  cz=0;
  print_word(mode,caps,china);
  TextOut(27,21,word_data,1);
  if(strlen(word_data)<18)Block(strlen(word_data)*6+27,32,strlen(word_data)*6+31,33,1);
  else
    {
    if(word_data[str_len-1]<160)Block(strlen(word_data)*6+21,32,strlen(word_data)*6+25,33,1);
    else Block(strlen(word_data)*6+15,32,strlen(word_data)*6+25,33,1);
    }
  Refresh();
  if(mode==0)//老式键盘输入数字字符用的,TC800上用可以去掉,
    {
    cz=number();
    if(cz==-1)
      {
      mode=2;
      continue;
      }
    }
  else
    if(mode==1)//输入英文字符
    {
    cz=english(caps);
    if(cz==-1)
      {
      mode=0;
      continue;
      }
    else
    if(cz==0 || cz==1)
      {
      caps=cz;
      continue;
      }
    }
    else//输入中文字符
    {
    if(china==1)//五笔输入法
      {
      cz=wb(word,word_data,str_len);
      memset(word_data,0,7);
      memcpy(word_data,word,strlen(word));
      if(cz==1)
        {
        china=0;
        continue;
        }
      else
      if(cz==2)
        {
        mode=1;
        continue;
        }
      }
    else //拼音输入法
      {
      cz=chinese(word_data,str_len);
      if(cz<0)cz=cz+65536;
      if(cz==1)
        {
        china=1;
        continue;
        }
      else
      if(cz==2)
        {
        mode=1;
        continue;
        }
      }
    }
  
  gs[0]=cz;
  scanf_n=strlen(word_data);
  if(isprint(gs[0]) && scanf_n<str_len)
    {
    word_data[scanf_n]=gs[0];
    continue ;
    }
  else
  if(gs[0]>=160 && scanf_n<str_len-1)
    {
    gs[1]=cz>>8;
    word_data[scanf_n]=gs[0];
    word_data[scanf_n+1]=gs[1];
    continue ;
    }
  else
  if(gs[0]==29 && scanf_n)
    {
    scanf_n--;
    if(word_data[scanf_n]>=160)
      {
      scanf_n--;
      memset(word_data+scanf_n,0,2);
      }
    else word_data[scanf_n]=0 ;
    continue ;
    }
  else
  if(gs[0]==13 && scanf_n)
    {
    word_data[scanf_n]=0;
    memset(add,0,str_len);
    memcpy(add,word_data,strlen(word_data));
    WriteBlock(0,0,160,80,0x81,scanf_data);
    Refresh();
    return;
    }
  if(gs[0]==27)
    {
    WriteBlock(0,0,160,80,0x81,scanf_data);
    Refresh();
    return;
    }
  if(scanf_n==0 && gs[0]==13)Beep();
  }
/*****************************输入字符串*****************************/
}
以上是一个输入函数。可以输入英文,汉字和数字,但不能输入符号!用法是:
把上面的这个函数放在一个文本文件里,然后把文件名改成scanf.h,在LAVAXIDE3。5版中编译,编译前把这个文件包含进去。注意你定义的变量名不能与这个函数里的相同哦!下面是一个例子:

char name[19];
  long i;
  
  #include "scanf.h"

  void main()
  {
  WB2GB_Init();//在程序一开始时请打开五笔输入法的文件句柄;
  SetGraphMode(4);
  SetBgColor(5);
  clearscreen();
  Refresh();
  scanf("%s",&name,0);//name一定要有足够的空间来存放返回值!
  scanf("%d",&i,0);//用于存放数值的变量i一定要是一个long型的,要用int的请自行转换!
  printf("%s\n%d",name,i);
  getchar();
  WB2GB_Exit();//在程序结束时请关闭五笔输入法的句柄!
  }
发表于 2007-1-22 10:03:52 | 显示全部楼层
好长啊,我觉得E路客的那个比较好哦
 楼主| 发表于 2007-1-22 18:03:56 | 显示全部楼层
多谢啦.
P.S:似乎很长啊,好象BAS的INPUT更简洁啊.
楼上知道哪个简洁的吗?
发表于 2007-1-22 18:08:57 | 显示全部楼层
1.0 的输入函数很容易写,LZ也可借鉴ewe的源代码中的输入函数
lava1.0以上的要自己写字库,wqxstar028写了个现成的,直接用吧~
发表于 2007-1-22 18:42:05 | 显示全部楼层
BAS的是原来就有人帮你写好的,而lavax的需要自己写,所以自然长些拉.在本版我向E路客请教的那篇帖里我提取了eww里的输入函数,不过就是不知道彻底不,哈,凑合着用吧
 楼主| 发表于 2007-1-22 18:44:43 | 显示全部楼层
I SEE.
THANKS!
 楼主| 发表于 2007-1-21 18:24:59 | 显示全部楼层 |阅读模式
最近研究好像没找到,Basic都有个"Input",Lava呢?
发表于 2007-12-22 15:50:16 | 显示全部楼层

有个没有优化的英文输入

应能给新手一些帮助:


long input(int a,int b,long xx){
int x,y,i;
char ch,qj[11],zf[11];
i=0;
memmove(zf,qj,11);
ClearScreen();
while(1){
ClearScreen();
TextOut(1,1,xx,1);
TextOut(a,b,zf,1);
Block(i*6+1,b,i*6+2,b+13,2);
Refresh();
ch=getchar();
if('a'<=ch&&ch<='z')zf[i++]=ch;
if('0'<=ch&&ch<='9')zf[i++]=ch;
if(ch=='.')zf[i++]='.';
if(ch==23){
   zf[i=i-1]=0;
   if(i<=0)i=0;
}
if(ch==13)return zf;
if(i>=15)return zf;
if(ch==27)return 0;
}
}

void main(){
long x;
x=input(1,13,"请输入字符串:");
printf("%s",x);
getchar();
}
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-20 09:36 , Processed in 0.012967 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表