📄 t9.c
字号:
/*T9*//*author:liming*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include "minigui/common.h" #include "minigui/minigui.h" #include "minigui/gdi.h" #include "minigui/window.h" #include "minigui/control.h" #include "minigui/endianrw.h" #include "ssrpub.h"#include "msg.h"#include "options.h"#include "flashdb.h"#include "commu.h"#include "ssrcommon.h"#include "exfun.h"#include "t9mb.h"#include "t9.h"//全局变量HWND sg_hTargetWnd = 0; // 输入的目标窗口.HWND hIMEWnd = 0;int IMEMode; //const T9PY_IDX* pt9idx;char en_Buf[MAX_KEY_CHAR]; //当前的字母(用于英文输入方式)char py_key[MAX_PY_LENGTH+1]; //中文输入中拼音输入键序列char py_Buf[MAX_PY_SAME][MAX_PY_LENGTH+1]; //拼音unsigned char hz_Buf[MAX_HZ_COUNT*2]; //汉字unsigned char fh_Buf[50];int perpagecount; //每页显示的文字个数int input_type; //输入方式 0:拼音,1:英文,2:符号int cur_status; //输入状态 0.输入状态; 1.选择状态int start_point; //显示数据的起始位置int py_keycounts; //中文输入键个数(拼音长度)int cur_py; //当前拼音序号int py_count; //拼音个数//function definestatic void InputKeyProcess(unsigned char key, LPARAM lParam);static void init_ime_parameter(void);static void RefreshIMEBox(HWND hWnd, HDC hDC);static void ClrInBuf(void);static BOOL py_key_filter(char key); //拼音输入键是否有效static void get_py_from_table(void);static void get_hz_from_table(char* py);static void get_en_from_table(char key);static void ime_writemsg(int sindex);static void delete_last_py(void);char* ime_method[3];static const unsigned char fh_table[] = "~!@#$%^&*()_+{}|:\"<>?`-=[]\\;',./,。‘’“”";//funcion processstatic void init_ime_parameter(void){ memset(fh_Buf,0,50); nmemcpy(fh_Buf,fh_table,strlen(fh_table)); perpagecount = MAX_ROW_COUNTS; cur_py = 0; py_keycounts = 0; py_count = 0; start_point = 0; input_type = (IMEMode)?0:1; //默认输入方式 cur_status = 0; //初始输入状态}static void ClrInBuf(void){ switch(input_type) { case 0: memset(hz_Buf,0,MAX_HZ_COUNT*2); memset(py_key,0,MAX_PY_LENGTH+1); //清除拼音输入 memset(py_Buf,0,MAX_PY_LENGTH+1); py_keycounts = 0; cur_status = 0; cur_py = 0; start_point = 0; py_count = 0; break; case 1: memset(en_Buf,0,MAX_KEY_CHAR); cur_status = 0; break; case 2: cur_status = 1; //符号输入直接进入选择状态 break; }}static void RefreshIMEBox(HWND hWnd, HDC hDC){ char str[100]; char sstr[100]; char tmppy[MAX_PY_LENGTH+1]; //当前拼音 char tmpstr[4]; //读取汉字 PLOGFONT logfont; SIZE size; int i; int pos_x, cWidth, sWidth; //绘制选择框 SetBkColor(hDC,GetWindowElementColor(BKC_CONTROL_DEF)); memset(str,0,100); strcpy(str,ime_method[input_type]); //写输入方式标识 switch(input_type) { case 0: //input chinese TextOut(hDC,2,2,str); GetTextExtent(HDC_SCREEN, str, strlen(str), &size); cWidth = GetMaxFontWidth(hDC)/2; //一个字节宽度 pos_x = (strlen(str))*cWidth; if(py_keycounts>0) { get_py_from_table(); //get py from table if(cur_status == 0) { for(i=0;i<py_count;i++) sprintf(str,"%s%s ",str,py_Buf[i]); for(i=0;i<cur_py;i++) pos_x += (strlen(py_Buf[i])+1)*cWidth; sWidth = (strlen(py_Buf[cur_py]))*cWidth+6; SetBkMode(hDC,BM_TRANSPARENT); SetBrushColor(hDC,COLOR_blue); FillBox (hDC, pos_x ,2 ,sWidth, size.cy); } else if(cur_status == 1) sprintf(str,"%s%s",str,py_Buf[cur_py]); TextOut(hDC, 2, 2, str); //output first line memset(tmppy,0,MAX_PY_LENGTH+1); strncpy(tmppy,py_Buf[cur_py],MAX_PY_LENGTH); get_hz_from_table(tmppy); //get hz from table memset(str,0,4*perpagecount+2); if((start_point >= perpagecount) && (cur_status == 1)) sprintf(str,"%s","<"); else sprintf(str,"%s"," "); memset(sstr,0,4*perpagecount); for(i=0;i<perpagecount;i++) { memset(tmpstr,0,4); tmpstr[0] = hz_Buf[(start_point+i)*2]; tmpstr[1] = hz_Buf[(start_point+i)*2+1]; tmpstr[2] = '\0'; if(tmpstr[0]!='\0' || tmpstr[1] != '\0') { if(cur_status == 0) sprintf(sstr,"%s %s",sstr,tmpstr); else if(cur_status == 1) sprintf(sstr,"%s%d.%s",sstr,i,tmpstr); } } if((((start_point+perpagecount)*2) < strlen(hz_Buf)) && (cur_status == 1)) sprintf(str,"%s%s%s",str,sstr,">"); else sprintf(str,"%s%s%s",str,sstr," "); logfont = GetSystemFont(SYSLOGFONT_CONTROL); //设置中文显示字体 SelectFont (HDC_SCREEN, logfont); TextOut(hDC, 2, size.cy+2, str); } break; case 1: //英文输入显示 TextOut(hDC, 2, 2, str); memset(str,0,60); GetTextExtent (HDC_SCREEN, en_Buf, strlen(en_Buf), &size); for(i = 0; i < strlen(en_Buf); i++){ if(cur_status == 0) sprintf(str,"%s %c ",str,en_Buf[i]); else if(cur_status == 1) sprintf(str,"%s%d %c ",str,i,en_Buf[i]); } TextOut(hDC,2+2,size.cy+2,str); break; case 2: //符号输入 TextOut(hDC, 2, 2, str); GetTextExtent(HDC_SCREEN, str, strlen(str), &size); memset(str,0,4*perpagecount+2); if((start_point >= perpagecount) && (cur_status == 1)) sprintf(str,"%s","<"); else sprintf(str,"%s"," "); memset(sstr,0,4*perpagecount); for(i=0;i<perpagecount;i++){ if((start_point+i)<32) sprintf(sstr,"%s %d %c",sstr,i,fh_Buf[start_point+i]); else{ if((fh_Buf[32+(start_point+i-32)*2] != '\0')||(fh_Buf[32+(start_point+i-32)*2+1] != '\0')){ memset(tmpstr,0,4); tmpstr[0] = fh_Buf[32+(start_point+i-32)*2]; tmpstr[1] = fh_Buf[32+(start_point+i-32)*2+1]; sprintf(sstr,"%s %d %s",sstr,i,tmpstr); } } } if((start_point+perpagecount) < 38 && (cur_status == 1)) sprintf(str,"%s%s %s",str,sstr,">"); else sprintf(str,"%s%s %s",str,sstr," "); logfont = GetSystemFont(SYSLOGFONT_CONTROL); SelectFont (HDC_SCREEN, logfont); TextOut(hDC, 2, size.cy+2, str); break; }}static void get_hz_from_table(char* py){ int i; BOOL matchflag = FALSE; pt9idx = t9PY_index; memset(hz_Buf,0,MAX_HZ_COUNT*2); while(pt9idx->PY[0] != '\0'){ matchflag = TRUE; if(strlen(pt9idx->PY) == py_keycounts){ for(i=0;i<py_keycounts;i++){ if(py[i] != pt9idx->PY[i]) matchflag = FALSE; } } else matchflag = FALSE; if(matchflag){ i = 0; while(pt9idx->MB[i] != '\0'){ hz_Buf[i] = pt9idx->MB[i]; i++; } break; } pt9idx++; }}static void get_py_from_table(void){ int i; BOOL matchflag; pt9idx = t9PY_index; py_count = 0; for(i=0;i<MAX_PY_SAME;i++) memset(py_Buf[i],0,MAX_PY_LENGTH+1); while(pt9idx->T9[0] != '\0'){ matchflag = TRUE; if(strlen(pt9idx->T9) == py_keycounts){ for(i=0;i<py_keycounts;i++){ if(py_key[i] != pt9idx->T9[i]) matchflag = FALSE; } } else matchflag = FALSE; if(matchflag){ strcpy(py_Buf[py_count++],pt9idx->PY); } pt9idx++; }}static BOOL py_key_filter(char key){ char tmpkey[MAX_PY_LENGTH]; int i; BOOL matchflag; BOOL newpyflag; //输入键是否有效 pt9idx = t9PY_index; strcpy(tmpkey,py_key); //记录已输入键序列 if(py_keycounts < MAX_PY_LENGTH){ sprintf(tmpkey,"%s%c",tmpkey,key); //暂存新输入键 newpyflag = FALSE; while(pt9idx->T9[0] != '\0'){ matchflag = TRUE; if(strlen(pt9idx->T9) == py_keycounts +1){ for(i=0;i<py_keycounts+1;i++){ if(tmpkey[i] != pt9idx->T9[i]) matchflag = FALSE; } } else matchflag = FALSE; if(matchflag) return TRUE; pt9idx++; } } return FALSE;}static void get_en_from_table(char key){ T9EN_IDX* penidx; penidx = (T9EN_IDX*)t9EN_index; int i = 0; for(i=0;i<8;i++){ if(key == penidx->key[0]){ strcpy(en_Buf,penidx->Letter); cur_status = 1; break; } penidx++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -