mmihz.c

来自「是一个手机功能的模拟程序」· C语言 代码 · 共 1,669 行 · 第 1/5 页

C
1,669
字号
    unsigned short* ConditionHz=pchinese_Data->ConditionHz;
    unsigned int  mid,low,hig;
    unsigned short TempString[10],ch1[3];
    char msg[100];
    low=0;
    hig=MaxAssHanZi-1;
    while(low<=hig&&ASSCode[mid]!=ConditionHz[0])
    {    mid=(low+hig)/2;
         if((mid%2)!=0)         	
         	mid--;         	
         	
         if(ASSCode[mid]==ConditionHz[0])
           {    
                while(ASSCode[mid-2]==ASSCode[mid])
         	    mid=mid-2;
                
                while(mid<=MaxAssHanZi&&pchinese_Data->SatisfyNum<pchinese_Data->MAX_Satisfy*pchinese_Data->PageNum)
                	{   
                	    if(ASSCode[mid+2]==ASSCode[mid])
                	    {	pchinese_Data->SatisfyNum++;
                	        mid=mid+2;                	        
                	     }
                	    else if(ASSCode[mid+2]!=ASSCode[mid])//&&ASSCode[mid-2]==ASSCode[mid])
                	    	{  pchinese_Data->SatisfyNum++;
                	           break;
                	    	}
                	 }
                pchinese_Data->SatisfyNum = 0;
                memset(TempString,0,sizeof(TempString));
                while(mid<=MaxAssHanZi&&pchinese_Data->SatisfyNum<=pchinese_Data->MAX_Satisfy)
                
                	{   if(ASSCode[mid+2]==ASSCode[mid])
                	    {
                	      /*  ch1[0] =  (*(ASSCode+mid+1));
                            ch1[1] =  ' ';
                            ch1[2] = 0; 
                            */
                            pchinese_Data->SatisfyNum++;
                            if(pchinese_Data->SatisfyNum%10==0)
                            	ch1[0]=0x30;
                            else ch1[0]=pchinese_Data->SatisfyNum+0x30;
                            ch1[1]=(*(ASSCode+mid+1));
                            ch1[2] = 0; 
                            mid=mid+2;
                          //  wsprintf(TempString,"%s",ch1);
                	      //  wordstrcat(PromptBuf,TempString);
                	        wordstrcat(pchinese_Data->PromptBuf,ch1);
                	      }
                        else if(ASSCode[mid+2]!=ASSCode[mid])//&&ASSCode[mid-2]==ASSCode[mid])
                        	  { /* ch1[0] =  (*(ASSCode+mid+1));
                                 ch1[1] =  ' ';
                                 ch1[2] = 0; 
                                 */
                                 
                                 pchinese_Data->SatisfyNum++;
                                 if(pchinese_Data->SatisfyNum%10==0)
                            	    ch1[0]=0x30;
                                 else ch1[0]=pchinese_Data->SatisfyNum+0x30;
                                 ch1[1]=(*(ASSCode+mid+1));
                                 ch1[2] = 0;                                 
                              //   wsprintf(TempString,"%s",ch1);
                	          //   wordstrcat(PromptBuf,TempString);
                	             wordstrcat(pchinese_Data->PromptBuf,ch1);
                	             break;
                        	    }                        
                	  }  
         	}
         else if(ASSCode[mid]<ConditionHz[0])
                low=mid+2;
         else   hig=mid-2;
         
    }
  
}
                	

static void    BiShunProgramCode(chinese_Data* pchinese_Data)
{   unsigned int Num;

    char* ConditionStr =(char*)pchinese_Data->ConditionStr;
    char* ProgramCode=(char*)pchinese_Data->ProgramCode;
    
    ProgramCode[0] = ConditionStr[0];
    for(Num=1; Num<strlen(ConditionStr); Num++)
        switch(ConditionStr[Num])
        {   case '-':   ProgramCode[Num]=1; break;
            case '|':   ProgramCode[Num]=2; break;
            case '/':   ProgramCode[Num]=3; break;
            case '\\':  ProgramCode[Num]=4; break;
            case '>':   ProgramCode[Num]=5; break;
            default :   ProgramCode[Num]=0; break;
        }
    for(;Num<7;Num++) ProgramCode[Num]=0;
}

void SetTheConditionStr(chinese_Data * pChineseData,int keyCode)
    	{
    	 char *str;
    	 int  Index;
    	 char msg[100];
    	 
    	 str = pChineseData->ConditionStr;        	    	 
    	
    	 if(strlen(str)==0 && keyCode)
          {   pChineseData->Index = 0;
              pChineseData->CurCode= keyCode;
              str[0]=InputMethodFirstChar[keyCode-2][pChineseData->Index];
            }
          else if(strlen(str)==1 && (pChineseData->InTheTime) && (pChineseData->CurCode==keyCode) && keyCode)
          {   pChineseData->Index = (pChineseData->Index + 1) % strlen(InputMethodFirstChar[pChineseData->CurCode-2]);
              str[0]=InputMethodFirstChar[pChineseData->CurCode-2][pChineseData->Index];
           }
           else if((strlen(str) || keyCode) && (strlen(str)<6))
           {   if( (pChineseData->CurCode)!=keyCode || !(pChineseData->InTheTime) ) pChineseData->Index=0;  // Next KCD,then New the Index;
               else str[strlen(str)-1]= 0;  // in the same KCD loop,Del The Last Key;
               pChineseData->CurCode= keyCode;

               SetOtherMightChar(pChineseData,keyCode);
               if(strlen(pChineseData->OtherMightChar))
               {   str[strlen(str)]= pChineseData->OtherMightChar[pChineseData->Index];
                   pChineseData->Index = (pChineseData->Index + 1) % strlen(pChineseData->OtherMightChar);
                 }
                else str[strlen(str)]= (char)(0x30 + keyCode);
                }           
           
    	}

int OtherCharIsOnlyOne(chinese_Data *pChineseData)
    	{            
    	  if((strlen(pChineseData->ConditionStr)==1 && strlen(InputMethodFirstChar[pChineseData->CurCode-2])<2 ) 
            ||( strlen(pChineseData->ConditionStr) >1 && strlen(pChineseData->OtherMightChar)<2 ) )
            return 1;
    	  else return 0;
    	}

static void SetThePromptBuf(chinese_Data *pChineseData)
{    int Loop,CurRule;
     char* ConditionStr =pChineseData->ConditionStr;
     unsigned short* ConditionHz=pChineseData->ConditionHz;

     pChineseData->SatisfyNum = 0;
     Loop=strlen(ConditionStr)-1;
     memset(pChineseData->PromptBuf,0,sizeof(pChineseData->PromptBuf));

     if(wordstrlen(ConditionHz))
     	SearchSomeAssociateHanZi(pChineseData);
     else if(ConditionStr[0]=='*')		CurRule = FindBiShun(ConditionStr);
          else 
           {	CurRule = 10;
     	      for(;Loop;Loop--)
        	     if(ConditionStr[Loop]>'z' || ConditionStr[Loop]<'a')
        	     {   CurRule = FindBiShun(ConditionStr);
            	        break;
        	      }
   	        }
   	 
          if(CurRule == 10)                 // PinYin
              {  PinYinProgramCode(pChineseData);
                 SearchSomeHanZi_ByPinYin(pChineseData);
              }
          else if(CurRule == 1)              // BiShun
          {  ChangCharToBs(pChineseData->ConditionStr);
             BiShunProgramCode(pChineseData);
             SearchSomeHanZi_ByBiShun(pChineseData);
          }
          else if( ConditionStr[5] == ':' )   // BiaoDian
     	     SearchSomeHanZi_ByBiaoDian(pChineseData);
     
       /*   if(PromptBuf[0]==0)	Input_one_key(KCD_RIGHT); */// 如果没有找到汉字,删除当前输入字符
} 
#endif
static void SelectHanZi(int KeyCode)
{   T_MFW_HND       win        = mfw_parent (mfw_header());
    T_MFW_WIN     * win_data   = ((T_MFW_HDR *)win)->data;
    T_HZ_INFO * hzdata       = (T_HZ_INFO *)win_data->user;
    T_MFW_HND  parent_win   =hzdata->parent;
    T_MFW_WIN     *parentwin_data =((T_MFW_HDR *)parent_win)->data;
    T_EDITOR_INFO  *parentdata   =(T_EDITOR_INFO *)parentwin_data->user;
    char* ConditionStr=hzdata->chineseData.ConditionStr;
    unsigned short* ConditionHz=hzdata->chineseData.ConditionHz;
    char msg[100];     
    
    static unsigned short code;//codeB[3];
	hzdata->StartNextTime=0;
	if( (hzdata->chineseData.SatisfyNum >= KeyCode && KeyCode>0)||(hzdata->chineseData.SatisfyNum>=10&&KeyCode==0))
    {          	
        if(ConditionStr[5] != ':' )
        	{  if(KeyCode==0)
        	     code=hzdata->chineseData.PromptBuf[10*2-1];
               else  code=hzdata->chineseData.PromptBuf[KeyCode*2-1];
        	}
        else {
        	   if(hzdata->chineseData.PageNum==0)
        	     { if(KeyCode==0)
        	         code=hzdata->chineseData.PromptBuf[24];
        	       else if(KeyCode<=3)
        	         code=hzdata->chineseData.PromptBuf[KeyCode*2-1];
                   else if(KeyCode>=4&&KeyCode<=5)
              	     code=hzdata->chineseData.PromptBuf[8+(KeyCode-4)*2];
                   else code=hzdata->chineseData.PromptBuf[12+(KeyCode-6)*3];
        	      }
        	   else if(KeyCode==0)
        	   	   code=hzdata->chineseData.PromptBuf[28];
        	   else code=hzdata->chineseData.PromptBuf[KeyCode*3-2];
        	   /*
        else Word=PromptBuf[(CurPy-96)/16*15+CurPx/24];
        	if(KeyCode<=7)
        		code=PromptBuf[KeyCode];
        	else code=PromptBuf[8+(KeyCode-7)*2-1+(KeyCode-1)/7];
        	*/
        	} 
        	
		//codeB[1]=PromptBuf[KeyCode*5-4];
		//codeB[1]=0;
    
        memset(ConditionStr,0,sizeof(ConditionStr));
		hzdata->CurPx=hzdata->InitPx;
        hzdata->CurPy=hzdata->InitPy;
        
        hzdata->chineseData.PageNum = 0;
        //LineNum=1;
        hzdata->chineseData.SatisfyNum = 0;
        
     //   edtHide(parentdata->edt_edt); 
     //   sprintf(msg,"selectsymbol:0x%x",code);
     //   TRACE_EVENT(msg);
        edtSymbol(parentdata->edt_edt,(int)code);//codeB[0]);   
        //edtSymbol(parentdata->edt_edt,ecRight);
    //    edtUnhide(parentdata->edt_edt); 
      //  bmpflag=0;
        if(wstrlen(parentdata->editor_data.editor_attr.text)>=(parentdata->editor_data.editor_attr.size-3))
        {	memset(ConditionStr,0,10);//sizeof(ConditionStr));
            memset(ConditionHz,0,sizeof(ConditionHz));
            hz_destroy(hzdata->hz_win);
            return;
        	}
        
        if (wordstrlen(ConditionHz)==0&&code>=0x4e00){
           ConditionHz[0]=code;
           ConditionHz[1]='\0';
           hzdata->CurPx=hzdata->InitPx;
           hzdata->CurPy=hzdata->InitPy;
        	}
        else hz_destroy(hzdata->hz_win);
        	
        
    }
}

static int Input_one_key(T_MFW_HND win,int KeyCode)
{	//T_MFW_HND       win        = mfw_parent (mfw_header());
    T_MFW_WIN     * win_data   = ((T_MFW_HDR *)win)->data;
    T_HZ_INFO *  data       = (T_HZ_INFO *)win_data->user;
    char* ConditionStr =(char*)data->chineseData.ConditionStr;
    unsigned short* ConditionHz=(unsigned short*)data->chineseData.ConditionHz;
    char msg[100];

    
       
    TRACE_EVENT("Input_one_key()");
    sprintf(msg,"win:%d",(int *)win);
    TRACE_EVENT(msg);
    sprintf(msg,"zxp0 string:%s",ConditionStr);
    TRACE_EVENT(msg);
    sprintf(msg,"zxp1 string:%s",(char*)data->chineseData.ConditionStr);
    TRACE_EVENT(msg);
    data->StartNextTime=1;
	timStop(data->l_intime);
	timStop(data->l_intimelong);	
    
    switch(KeyCode)
    {    case KCD_HUP:                
                hz_destroy(data->hz_win);
        		break;
		 case KCD_STAR:
		 	    data->StartNextTime=0;
		 	    if(wordstrlen(ConditionHz)&&ConditionHz[wordstrlen(ConditionHz)-1]!='#'){
                	memset(ConditionStr,0,10);//sizeof(ConditionStr));
                	memset(ConditionHz,0,sizeof(ConditionHz));
                	}
				if(wordstrlen(ConditionHz)==0&&strlen(ConditionStr)==0)
                     {   data->chineseData.InTheTime = 0;
                         strcpy(ConditionStr,"Label:");
                       //  expand2wstr(ConditionStr,"Label:");
                         data->CurPx=data->InitPx;
                         data->CurPy=data->InitPy;
                         SetThePromptBuf(&data->chineseData);
                         DispPromptBuf(data->hz_win);
                         return 1;
                     }
                else   return 0;
                break;
         case KCD_1:
         	    data->StartNextTime=0;
         	    if(wordstrlen(ConditionHz)&&ConditionHz[wordstrlen(ConditionHz)-1]!='#'){
                	memset(ConditionStr,0,sizeof(ConditionStr));
                	memset(ConditionHz,0,sizeof(ConditionHz));
                	data->CurPx=data->InitPx;
                	data->CurPy=data->InitPy;
                	}
         	    if((wordstrlen(ConditionHz)&&ConditionHz[wordstrlen(ConditionHz)-1]=='#')
                	||(strlen(ConditionStr) && ((ConditionStr[strlen(ConditionStr)-1]=='#')||ConditionStr[strlen(ConditionStr)-1]==':'))){
                	SelectHanZi(KCD_1);
                	data->chineseData.PageNum=0;
         	    	}
                else if(ConditionStr[0]=='\0')  ConditionStr[0]='*';
                else   return 0;
                break;
         case KCD_HASH:
         		data->StartNextTime=0;         	
         		if(wordstrlen(ConditionHz))
         		{   if(ConditionHz[wordstrlen(ConditionHz)-1]!='#')
         		      ConditionHz[wordstrlen(ConditionHz)]='#';
         		    else   SelectHanZi(KCD_1);
         		}
               /* else if(strlen(ConditionStr)==0)
                     {   InTheTime = 0;
                         strcpy(ConditionStr,"Label:");
                       //  expand2wstr(ConditionStr,"Label:");
                         SetThePromptBuf();
                         DispPromptBuf();
                         return 1;
                     }*/
                 else  if(strlen(ConditionStr)&&ConditionStr[strlen(ConditionStr)-1]!='#')
                    	     ConditionStr[strlen(ConditionStr)] = '#';
                       else    SelectHanZi(KCD_1);              
                	
                break;
         case KCD_MNUUP:
         	/*
         	    if(ConditionStr[5]==':')
         	    	{if(CurPy>1*16)
         	    	   CurPy=CurPy-16;
         	         else CurPy=6*16;

⌨️ 快捷键说明

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