基本思路是使用一个图片,定义图片上各个按键的相对位置以及文本框的相对位置。定义键盘的尺寸 当需要显示键盘时,将图片画出来。 当触屏按下时,计算按下的位置,进行相应操作。 所有按键的尺寸一致,定义按键结构,包含左上相对位置,定义数字框,包含上下左右相对位置。 定义所有键值枚举类型 typedef enum { kc,k1,k2,k3,k4,k5,k6,k7,k8,k9,k0,kd,ko} Keyval; 定义一个四边型尺寸结构,长宽数据可以计算得到。这个结构用于定义边框,数字框,按键的外形尺寸。 typedef{ uint16_t left; uint16_t top; uint16_t right; uint16_t down; }stRectPosTypeDef; 定义外边框尺寸数据,这些数据需要与按键图片对应,且使用相对位置。 const stRectPosTypeDef stKeyBoardFrame = {0,0,417,171}; 定义数字框尺寸数据 const stRectPosTypeDef stDigitalBox = {7,6,71,54}; 定义单个按键的尺寸信息及键值 typedef{ stRectPos keypos; Keyval key; }stKeyTypeDef; 定义实体按键数量及实体按键信息,所有参数都是像素相对值 #define TOTLEKEY 13 const stKeyTypeDef stDigitalKey ={ {{347,5,411,53},kc}, {{5,62,69,110},k1}, {{73,62,137,110},k2}, {{142,62,206,110},k3}, {{210,62,274,110},k4}, {{279,62,343,110},k5}, {{5,117,69,165},k6}, {{73,117,137,165},k7}, {{142,117,206,165},k8}, {{210,117,274,165},k9}, {{279,117,343,165},k0}, {{347,62,411,110},kd}, {{347,117,411,165},ko} }; 使用一个字符串保存键入的数值。返回时使用文本到数值的转换,当调用 KeyScan 函数时,首先在合适位置,画出键盘的图片。然后等待触摸动作,当得到触摸值后,顺序使用 RangeCheck 检查触摸值是否在按键的范围里。遍历各个按键位置,一旦为直,即进入 UpdataDigital ,依据键值,改变用于保存数值的字符串。当检测到为回车时,返回数据值。 float KeyScan(uint16_t lcdx,uint16_t lcdy,stKeyBoardTypeDef *pkb){ uint16_t Ax,Ay; uint8_t i,tempstr ; float fltemp; stRectPosTypeDef hpos; fltemp = 0; tempstr = '\0'; pbmp,lcdx,lcdy); GUI_SetBkColor(GUI_BLACK); GUI_SetColor(GUI_WHITE); down); pfont); // wait for key for(;;){ GetTp(&Ax,&Ay); // 获取 TP 的触摸信息 ConvertTp(&Ax,&Ay); Ax -= lcdx; Ay -= lcdy; for(i = 0;i totlekey;i++){ pkey .keypos.down; pkey .keypos.top; pkey .keypos.left; pkey .keypos.right; if(RangeCheck(Ax,Ay,&hpos)) // 检查是否在范围内 break; } if(i totlekey){ // 检测到按键位置 pkey .key == ko){ if(strlen(tempstr) != 0){ fltemp = atof(tempstr); return fltemp; } } if((tempstr =='0')&&(tempstr =='\0')) tempstr ='\0'; pkey .key); down); right - GUI_GetStringDistX(tempstr), down )/2 - GUI_GetFontSizeY()/2); } } } /* 以字符串表示的数据,依据输入按键改变 */ void UpdataDigital(uint8_t *pstr,KeyvalTypeDef key){ uint16_t temp; if(key == ko) return; if(key == kc){ pstr ='\0'; return; } if(key == kd){ if(strchr(pstr,'.')!=NULL) return; else{ if(pstr =='\0') strcpy(pstr,"0."); else strcat(pstr,"."); } return; } switch(key){ case k1: strcat(pstr,"1"); break; case k2: strcat(pstr,"2"); break; case k3: strcat(pstr,"3"); break; case k4: strcat(pstr,"4"); break; case k5: strcat(pstr,"5"); break; case k6: strcat(pstr,"6"); break; case k7: strcat(pstr,"7"); break; case k8: strcat(pstr,"8"); break; case k9: strcat(pstr,"9"); break; case k0: if((pstr =='0')&&(pstr =='\0')) break; else{ strcat(pstr,"0"); break; } default: break; } } 程序初始化GUI 后,在需要改变数值的地方,调用KeyScan,就能获得键入的数据。