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 + -
显示快捷键?