#include "mywin_inc.h" //定义输入法类型 #define WIN_INPUT_TYPE "WIN_InputStruct" //定义输入法按键别名 #define INPUT_BUTTON_Q button[0] #define INPUT_BUTTON_W button[1] #define INPUT_BUTTON_E button[2] #define INPUT_BUTTON_R button[3] #define INPUT_BUTTON_T button[4] #define INPUT_BUTTON_Y button[5] #define INPUT_BUTTON_U button[6] #define INPUT_BUTTON_I button[7] #define INPUT_BUTTON_O button[8] #define INPUT_BUTTON_P button[9] #define INPUT_BUTTON_A button[10] #define INPUT_BUTTON_S button[11] #define INPUT_BUTTON_D button[12] #define INPUT_BUTTON_F button[13] #define INPUT_BUTTON_G button[14] #define INPUT_BUTTON_H button[15] #define INPUT_BUTTON_J button[16] #define INPUT_BUTTON_K button[17] #define INPUT_BUTTON_L button[18] #define INPUT_BUTTON_Z button[19] #define INPUT_BUTTON_X button[20] #define INPUT_BUTTON_C button[21] #define INPUT_BUTTON_V button[22] #define INPUT_BUTTON_B button[23] #define INPUT_BUTTON_N button[24] #define INPUT_BUTTON_M button[25] #define INPUT_BUTTON_LEFT button[26] #define INPUT_BUTTON_RIGHT button[27] #define INPUT_BUTTON_ESC button[28] #define INPUT_BUTTON_SHIFT button[29] #define INPUT_BUTTON_EN button[30] #define INPUT_BUTTON_123 button[31] #define INPUT_BUTTON_COMMA button[32] #define INPUT_BUTTON_SPACE button[33] #define INPUT_BUTTON_FULLSTOP button[34] #define INPUT_BUTTON_BACK button[35] #define INPUT_BUTTON_ENTER button[36] #include "res/pymb.c" static const char *g_keybord_txt ="QWERTYUIOPASDFGHJKLZXCVBNM"; static const char *g_keybord_mini ="qwertyuiopasdfghjklzxcvbnm"; static const char *g_keybord_num[]={ "1234567890-=!@#$%^&*()_+`~", "[]\\;',./{}|:\"<>?" }; //在堆中创建一个输入法 WIN_InputStruct *WIN_CreatInput (WIN_WindowStruct *base, void (*msgLoop)(struct _WIN_WindowStruct *win,WIN_MsgStruct *msg), int x,int y,int x_size,int y_size) { //重设消息循环 if (msgLoop==0) { msgLoop=(void (*)(struct _WIN_WindowStruct *win,WIN_MsgStruct *msg))INPUT_DefaultMsgLoop; } WIN_InputStruct *ret=mymalloc (sizeof ( WIN_InputStruct)); //调用父类的构造函数 if (ret) { mymemset (ret,0,sizeof ( WIN_InputStruct)); if (0==WIN_CreatWindowExt((WIN_WindowStruct *)ret,base,msgLoop,x,y,x_size,y_size)) { //创建失败 myfree (ret); ret=0; } else { //构造一个 ((WIN_WindowStruct *)ret)->winType= WIN_INPUT_TYPE; ((WIN_WindowStruct *)ret)->intercept=1; //输入阻塞 ((WIN_WindowStruct *)ret)->bkcolor=0x7700cc; ret->button_ysize=30; int x=0; int y=0; int x_size=((WIN_WindowStruct *)ret)->x_size; int y_size=((WIN_WindowStruct *)ret)->y_size; int button_x_size=x_size/10; int button_y_size=ret->button_ysize; int button_x=x; int button_y=y+y_size-1-button_y_size*5; ret->pinyin_y=button_y-WIN_GetFontHight();//拼音显示位置 //候选字按键 for (int i=0;i<10;i++) { ret->word[i].x=button_x;ret->word[i].y=button_y; ret->word[i].x_size=button_x_size;ret->word[i].y_size=button_y_size; button_x+=button_x_size; } button_x=x; button_y+=button_y_size; //字母按键 for (int i=0;i<26;i++) { if (i==10) {button_y+=button_y_size;button_x=x+button_x_size/3;} if (i==19) {button_y+=button_y_size;button_x=x+button_x_size*2/3;} ret->button[i].x=button_x;ret->button[i].y=button_y; ret->button[i].x_size=button_x_size;ret->button[i].y_size=button_y_size; button_x+=button_x_size; char chars[2]={0};chars[0]=g_keybord_txt[i]; mymemcpy (ret->button[i].txt,chars,2); } //功能按键 ret->INPUT_BUTTON_LEFT.x=button_x;ret->INPUT_BUTTON_LEFT.y=button_y; ret->INPUT_BUTTON_LEFT.x_size=button_x_size;ret->INPUT_BUTTON_LEFT.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_LEFT.txt,"<",2); button_x+=button_x_size; ret->INPUT_BUTTON_RIGHT.x=button_x;ret->INPUT_BUTTON_RIGHT.y=button_y; ret->INPUT_BUTTON_RIGHT.x_size=button_x_size;ret->INPUT_BUTTON_RIGHT.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_RIGHT.txt,">",2); button_x=x;button_y+=button_y_size; ret->INPUT_BUTTON_ESC.x=button_x;ret->INPUT_BUTTON_ESC.y=button_y; ret->INPUT_BUTTON_ESC.x_size=button_x_size;ret->INPUT_BUTTON_ESC.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_ESC.txt,"ESC",5); button_x+=button_x_size; ret->INPUT_BUTTON_SHIFT.x=button_x;ret->INPUT_BUTTON_SHIFT.y=button_y; ret->INPUT_BUTTON_SHIFT.x_size=button_x_size;ret->INPUT_BUTTON_SHIFT.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_SHIFT.txt,"SHIFT",5); button_x+=button_x_size; ret->INPUT_BUTTON_EN.x=button_x;ret->INPUT_BUTTON_EN.y=button_y; ret->INPUT_BUTTON_EN.x_size=button_x_size;ret->INPUT_BUTTON_EN.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_EN.txt,"EN",5); button_x+=button_x_size; ret->INPUT_BUTTON_123.x=button_x;ret->INPUT_BUTTON_123.y=button_y; ret->INPUT_BUTTON_123.x_size=button_x_size;ret->INPUT_BUTTON_123.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_123.txt,"123",5); button_x+=button_x_size; ret->INPUT_BUTTON_COMMA.x=button_x;ret->INPUT_BUTTON_COMMA.y=button_y; ret->INPUT_BUTTON_COMMA.x_size=button_x_size;ret->INPUT_BUTTON_COMMA.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_COMMA.txt,",",5); button_x+=button_x_size; ret->INPUT_BUTTON_SPACE.x=button_x;ret->INPUT_BUTTON_SPACE.y=button_y; ret->INPUT_BUTTON_SPACE.x_size=button_x_size*2;ret->INPUT_BUTTON_SPACE.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_SPACE.txt," ",5); button_x+=button_x_size*2; ret->INPUT_BUTTON_FULLSTOP.x=button_x;ret->INPUT_BUTTON_FULLSTOP.y=button_y; ret->INPUT_BUTTON_FULLSTOP.x_size=button_x_size;ret->INPUT_BUTTON_FULLSTOP.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_FULLSTOP.txt,".",5); button_x+=button_x_size; ret->INPUT_BUTTON_BACK.x=button_x;ret->INPUT_BUTTON_BACK.y=button_y; ret->INPUT_BUTTON_BACK.x_size=button_x_size;ret->INPUT_BUTTON_BACK.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_BACK.txt,"Back",5); button_x+=button_x_size; ret->INPUT_BUTTON_ENTER.x=button_x;ret->INPUT_BUTTON_ENTER.y=button_y; ret->INPUT_BUTTON_ENTER.x_size=button_x_size;ret->INPUT_BUTTON_ENTER.y_size=button_y_size; mymemcpy (ret->INPUT_BUTTON_ENTER.txt,"ENTER",5); button_x+=button_x_size; } } return ret; } //键盘切换至字母大写 void INPUT_SetToAscBig (WIN_InputStruct *input) { //字母按键 for (int i=0;i<26;i++) { char chars[2]={0};chars[0]=g_keybord_txt[i]; mymemcpy (input->button[i].txt,chars,2); } } //键盘切换至字母小写 void INPUT_SetToAscMini (WIN_InputStruct *input) { //字母按键 for (int i=0;i<26;i++) { char chars[2]={0};chars[0]=g_keybord_mini[i]; if (chars[0]==0) break; mymemcpy (input->button[i].txt,chars,2); } } //键盘切换至数字 void INPUT_SetToNum (WIN_InputStruct *input) { //字母按键 for (int i=0;i<26;i++) { char chars[2]={0};chars[0]=g_keybord_num[input->num_symbol_page][i]; if (chars[0]==0) break; mymemcpy (input->button[i].txt,chars,2); } } //按键按下 void INPUT_SetPressDown (WIN_InputStruct *input) { for (int i=0;i<37;i++) { if (POS_InRect(input->button[i].x,input->button[i].y,input->button[i].x_size,input->button[i].y_size, input->press_x,input->press_y)==1) { input->button[i].press=1; input->press_down_index=i; return; } } for (int i=0;i<10;i++) { if (POS_InRect(input->word[i].x,input->word[i].y,input->word[i].x_size,input->word[i].y_size, input->press_x,input->press_y)==1) { input->word[i].press=1; input->press_down_index_word=i; return; } } } //按键抬起 void INPUT_SetPressUp (WIN_InputStruct *input) { input->button[input->press_down_index].press=0; input->word[input->press_down_index_word].press=0; } //添加拼音 void INPUT_PinYinAppend (WIN_InputStruct *input) { int pinyin_len=strlen(input->inputPinyin); if ((pinyin_len<10)&&input->button[input->press_down_index].press) { char txt=input->button[input->press_down_index].txt[0]; if (txt<'a') txt+='a'-'A'; input->inputPinyin[pinyin_len]=txt; } } //拼音截短 void INPUT_PinYinCut (WIN_InputStruct *input) { int pinyin_len=strlen(input->inputPinyin); if (pinyin_len) input->inputPinyin[pinyin_len-1]=0; } //追加输入字符 void INPUT_WordAppend (WIN_InputStruct *input) { int word_len=strlen(input->inputWords); if (word_lencandidateWord[2]=0; int candidate_len=strlen(input->candidateWord); if (candidate_len==2) { mymemcpy( &input->inputWords[word_len],input->candidateWord,candidate_len+1); mymemset (input->candidateWord,0,3); } else if (input->button[input->press_down_index].press) { input->inputWords[word_len]=input->button[input->press_down_index].txt[0]; input->inputWords[word_len+1]=0; } } } //输入字符截短 void INPUT_WordCut (WIN_InputStruct *input) { int word_len=strlen(input->inputWords); char *p_txt=input->inputWords; int reback=0; while (*p_txt) { if (*p_txt&0x80) reback=2; else reback=1; p_txt+=reback; } input->inputWords[word_len-reback]=0; } //比较两个字符串是否相等,最多比较str1长度的字符串 static int input_strcmp (const char *str1,const char *str2) { int len=strlen(str1); if (len==0) return -1; for (int i=0;iinputPinyin)==0) if (input_strcmp(input->inputPinyin,(char *)g_py_index[i].str)==0) { input->word_const=g_py_index[i].word; input->word_page=0;//重置到第0页 return; } } input->word_const=0; input->word_page=0;//重置到第0页 } //把待选字符复制到字符按钮中 void INPUT_StorWordButton (WIN_InputStruct *input) { int i=0; if (input->word_const) { char *word=(char *)input->word_const+input->word_page*20; for (;i<10;i++) { if (word[i*2]) { input->word[i].txt[0]=word[i*2]; input->word[i].txt[1]=word[i*2+1]; input->word[i].txt[2]=0; } else { break; } } } { for (;i<10;i++) { input->word[i].txt[0]=0; } } } //功能按键 void INPUT_FunctionKey (WIN_InputStruct *input) { if (input->INPUT_BUTTON_BACK.press) { int pinyin_len=strlen(input->inputPinyin); if (pinyin_len) { INPUT_PinYinCut(input); INPUT_FindWord (input); INPUT_StorWordButton(input); } else INPUT_WordCut(input); } else if (input->INPUT_BUTTON_LEFT.press) { //左键 if (input->inputMode==INPUT_MODE_PINYIN) { if (input->word_page>0) input->word_page--; INPUT_StorWordButton(input); } else if (input->inputMode==INPUT_MODE_NUM) { if (input->num_symbol_page>0) input->num_symbol_page--; INPUT_SetToNum(input); } } else if (input->INPUT_BUTTON_RIGHT.press) { //右键 if (input->inputMode==INPUT_MODE_PINYIN) { if (input->word_const) { int str_len=strlen((char *)input->word_const); if ((input->word_page+1)*20word_page++; INPUT_StorWordButton(input); } } else if (input->inputMode==INPUT_MODE_NUM) { if (input->num_symbol_page<1) input->num_symbol_page++; INPUT_SetToNum(input); } } else if (input->INPUT_BUTTON_ESC.press) { input->exit=1;//退出,不保存输入 WIN_SetBlockWinReturn (0,0,0); } else if (input->INPUT_BUTTON_SHIFT.press) { if (input->inputMode==INPUT_MODE_BIG) { INPUT_SetToAscMini (input); input->inputMode=INPUT_MODE_MINI; } else if (input->inputMode==INPUT_MODE_MINI) { INPUT_SetToAscBig (input); input->inputMode=INPUT_MODE_BIG; } } else if (input->INPUT_BUTTON_EN.press) { if (input->inputMode==INPUT_MODE_PINYIN) { INPUT_SetToAscMini (input); input->inputMode=INPUT_MODE_MINI; mymemset( input->inputPinyin,0,10);//清除拼音输入 INPUT_FindWord (input); INPUT_StorWordButton(input); mymemset (input->candidateWord,0,3); } else { INPUT_SetToAscBig (input); input->inputMode=INPUT_MODE_PINYIN; } } else if (input->INPUT_BUTTON_123.press) { input->inputMode=INPUT_MODE_NUM; input->num_symbol_page=0; INPUT_SetToNum (input); mymemset( input->inputPinyin,0,10);//清除拼音输入 INPUT_FindWord (input); INPUT_StorWordButton(input); mymemset (input->candidateWord,0,3); } else if (input->INPUT_BUTTON_ENTER.press) { input->exit=1;//退出,保存输入 void *retdata=mymalloc (100); mymemcpy (retdata,input->inputWords,strlen(input->inputWords)+1); WIN_SetBlockWinReturn (1,retdata,100); myfree(retdata); } } //按键松开的时候做点什么 void INPUT_DoSomethingPressUp (WIN_InputStruct *input) { if (input->press_down_index<26) { //是输入按键 if (input->inputMode==INPUT_MODE_PINYIN) { INPUT_PinYinAppend (input); INPUT_FindWord (input); INPUT_StorWordButton(input); } else { INPUT_WordAppend (input); } } else if ((input->press_down_index>=32)&&(input->press_down_index<=34)) { //主界面的标点符号 mymemset( input->inputPinyin,0,10);//清除拼音输入 INPUT_FindWord (input); INPUT_StorWordButton(input); mymemset (input->candidateWord,0,3); INPUT_WordAppend (input); } else { //功能按键 INPUT_FunctionKey (input); //更新功能按键上显示的字符 if (input->inputMode==INPUT_MODE_PINYIN) { mymemcpy (input->INPUT_BUTTON_EN.txt,"EN",3); } else { mymemcpy (input->INPUT_BUTTON_EN.txt,"拼",3); } } if (input->word[input->press_down_index_word].press) { //选择了候选字 mymemcpy (input->candidateWord,input->word[input->press_down_index_word].txt,3); INPUT_WordAppend(input); mymemset( input->inputPinyin,0,10);//清除拼音输入 INPUT_FindWord (input); INPUT_StorWordButton(input); } } //默认绘制函数 void INPUT_DefaultPaint (WIN_InputStruct *input) { //使用双缓冲,防止闪烁 int x=0; int y=0; int x_size=((WIN_WindowStruct *)input)->x_size; int y_size=((WIN_WindowStruct *)input)->y_size-(((WIN_WindowStruct *)input)->y_size-input->pinyin_y)-1; char txt_buff[20]={0}; WIN_PaintBackGround ((WIN_WindowStruct *)input); u32 font_type=WIN_SetFontSize (20); //显示文本 WIN_SetLcdColor(0x00ffff); WIN_SetFontMode (WIN_DRAWMODE_ALONE); WIN_DrawTxtAt (input->inputWords,x+2,y+2); WIN_SetLcdColor(0xff0000); WIN_DrawVLine (strlen(input->inputWords)*WIN_GetFontWidth()/2+x+4,y,y+2+WIN_GetFontHight()); WIN_SetLcdColor(0xffff00); WIN_DrawRect (x,y,x_size,y_size); //显示键盘 WIN_SetFontSize (20); for (int i=0;i<37;i++) { if (input->button[i].press) { WIN_SetLcdColor(0xbb00aa); } else { WIN_SetLcdColor(0xffffff); } WIN_FillRectByColor (input->button[i].x,input->button[i].y,input->button[i].x_size,input->button[i].y_size); WIN_SetLcdColor(0x000000); WIN_DrawRect (input->button[i].x,input->button[i].y,input->button[i].x_size,input->button[i].y_size); WIN_DrawTxtHCenterAt (input->button[i].txt,input->button[i].x+input->button[i].x_size/2, input->button[i].y+input->button[i].y_size/2-WIN_GetFontHight()/2); } //显示拼音和候选字 if (input->inputMode==INPUT_MODE_PINYIN) { WIN_SetFontSize(20); if (input->inputPinyin[0]) { WIN_SetLcdColor(0xaabbcc); WIN_DrawTxtAt (input->inputPinyin,x,input->pinyin_y); for (int i=0;i<10;i++) { if (input->word[i].press) { WIN_SetLcdColor(0xbb00aa); } else { WIN_SetLcdColor(0xffffff); } WIN_FillRectByColor (input->word[i].x,input->word[i].y,input->word[i].x_size,input->word[i].y_size); WIN_DrawRect (input->word[i].x,input->word[i].y,input->word[i].x_size,input->word[i].y_size); WIN_SetLcdColor(0x55bbaa); WIN_DrawTxtHCenterAt (input->word[i].txt,input->word[i].x+input->word[i].x_size/2, input->word[i].y+input->word[i].y_size/2-WIN_GetFontHight()/2); } } } WIN_SetFontSize (font_type); } //默认消息处理函数 void INPUT_DefaultMsgLoop (WIN_InputStruct *input,WIN_MsgStruct *msg) { WIN_MoveStruct *m=0; WIN_KeyStruct *k=0; switch (msg->msg) { case WIN_MSG_PAINT: INPUT_DefaultPaint(input); break; case WIN_MSG_KEY: k=msg->data.p; if (k->shortPress& KEY_VALUE_HOME) { ((WIN_WindowStruct *)input)->deleteWindow((WIN_WindowStruct *)input); } break; case WIN_MSG_MOVE: m=msg->data.p; switch (m->moveType) { case MOVE_DATA_TOUCHOUT: INPUT_DoSomethingPressUp(input); INPUT_SetPressUp(input); WIN_SetInvalid ((WIN_WindowStruct *)input); if (input->exit) ((WIN_WindowStruct *)input)->deleteWindow((WIN_WindowStruct *)input); break; case MOVE_DATA_TOUCHIN: input->press_x=m->x_move; input->press_y=m->y_move; INPUT_SetPressDown(input); WIN_SetInvalid ((WIN_WindowStruct *)input); break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)input,msg); break; } break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)input,msg); break; } } //使用键盘输入一些数据 int INPUT_KeyBoard (WIN_WindowStruct *win,char *txt,int len) { WIN_InputStruct *input=0; if (win) input=WIN_CreatInput (win,0,0,0,win->x_size,win->y_size); else input=WIN_CreatInput (0,0,0,0,WIN_GetWinStruct()->lcd->getLcdSizeX(),WIN_GetWinStruct()->lcd->getLcdSizeY()); int str_len=strlen(txt); if (str_leninputWords,txt,str_len+1);} WIN_ShowWindow((WIN_WindowStruct *)input); int ret=WIN_RunBlock ((WIN_WindowStruct *)input); WIN_GetBlockWinReturn (&ret,txt,len); return ret; }