📄 infertt.c
字号:
}else if(tt_status == SYMBAL_ENTERNING || tt_status == ASC_ENTERNING)
{
if(event.code + lrview1->baseindex <= lrview1->cellnum)
MoveLrCursor(lrview1,event.code -lrview1->coursorx - 1,0 );
ShowLrList(lrview1);
event.code = BUTTON_SELECT;
DTOS_DRV_SendMessage(MainTaskQueue,&event);
}
}break;
case HZMODE:/*汉字操作*/
{
if(tt_status == WAIT_ENTERN)
{
FreeLrListItems(lrview0);/*用那个就先清那个UNLOCK那个*/
UnLockLrList(lrview0);
SetCurPick(event.code);/*可以输入拼音或特殊字符*/
ProcessPick();
if(event.code == 1)
tt_status = SYMBAL_ENTERNING;
else
{
if(event.code != 0)
{
tt_status = ASC_ENTERNING;
ShowLrList(lrview0);/*画出新的*/
}
}
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 0, 200, "enterned WAIT_ENTERN!");
#endif
}
else if(tt_status == HZ_ENTERNING ||tt_status == SYMBAL_ENTERNING)/*当前是挑选汉字的状态*/
{
/*将光标移到数字定义位置*/
if(event.code + lrview1->baseindex <= lrview1->cellnum)
MoveLrCursor(lrview1,event.code -lrview1->coursorx-1,0 );
ShowLrList(lrview1);
if(event.code == 0)
{
SetCurPick(event.code);
ProcessPick();
}
event.code = BUTTON_SELECT;
DTOS_DRV_SendMessage(MainTaskQueue,&event);
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 220, "tt_status == HZ_ENTERNING ||tt_status == SYMBAL_ENTERNING");
#endif
}else if(tt_status == ASC_ENTERNING)
{
if(event.code != 1)/*输入拼音状态下不能输入特殊字符*/
{
SetCurPick(event.code);
ProcessPick();
if(event.code != 0)
{
UnLockLrList(lrview0);
ShowLrList(lrview0);/*画出新的*/
}
}
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 180, "enterned asc!");
#endif
}
}break;
case NUMMODE:
{
char txt[2] ={0};
txt[0] = event.code + '0';
AddToCellView(cellview,txt);
DrawCellFrame(cellview);
}
break;
}
}
break;
}
}
}
/*****************************************************************************\
以下为TT绘画函数模块
\******************************************************************************/
static void ShowTTFrame(void)
{
/*
Colors_clear,
Colors_white,
Colors_black,
Colors_dtred,
Colors_thkgreen, /*深绿 */
/*Colors_weakgreen, /*浅绿 */
/*Colors_thkblue1, /*深蓝1 */
/*Colors_thkblue2, /*深蓝2 */
/*Colors_thkblue3, /*深蓝3 */
/*Colors_weakblue1, /*浅蓝1 */
/*Colors_weakblue2, /*浅蓝2 */
/*Colors_weakpurple, /*浅紫 */
/*Colors_orange, /*橙色 */
/*Colors_midyellow, /*中黄 */
/*Colors_lemyellow, /*柠檬黄*/
/*Colors_gray,
/*COLOR_MAX
(120,60,100,30)
(120,100,240*2 ,240);
(120,340,240*2,80)
(120,340,240*2,80)
*/
/* GFMDrawRectangle(100,60,240*2+40,440,COLOR_blue_gray, 1);
GFMDrawRectangle(120,120,100,20,COLOR_blue_gray, 1);
GFMDrawRectangle(100,60,240*2+40,2,Colors_weakpurple, 1);
GFMDrawRectangle(100,60,2,440,Colors_weakpurple, 1);
FNTDrawText(0, 0, 120, 120, "当前模式:汉字输入");
FNTDrawText(0, 0, 290, 120, "F3/#键切换输入模式");
FNTDrawText(0, 0, 490, 120, "菜单键删除");
FNTDrawText(0, 1, 260, 80, "东太拼音输入法");
GFMDrawRectangle( 120,140,240*2,240,Colors_weakpurple, 1);/*绘画编辑区*/
ShowLrList(lrview0);
/* GFMDrawRectangle(120,120,150,20,COLOR_blue_gray, 1);*/
FNTDrawText(0, 0, 270, INF_TXT_TOP,"当前模式:汉字输入" );
FNTDrawText(0, 0, 125, INF_TXT_TOP, "OK键确定");
FNTDrawText(0, 0, 460, INF_TXT_TOP, "退出/返回键取消");
DrawCellFrame(cellview);
}
/*lr0,lr1复用此绘画框架,*/
static void DrawLr0Frame(void *p)
{
pLRVIEW pview = (pLRVIEW )p;
int i;
int drawstartx;
void (*DrawCellFunc)(void * ,int ,int ,int ,int ,int ,int );
drawstartx = pview->localx + LR_CELL_WIDTH / 2;
/*if(pview->OwnerDrawCell)*/
DrawCellFunc = pview->OwnerDrawCell;
#ifdef _WIN32
CDC *dc = AfxGetApp()->GetMainWnd()->GetDC();
/*绘画框架*/
dc->FillRect(CRect(pview->localx,pview->localy ,
pview->localx + pview->width,pview->localy + pview->high + 20),
&CBrush(RGB(161,161,161)));
#else
GFMDrawRectangle(pview->localx,pview->localy, pview->width, pview->high,Colors_weakpurple,1);
#endif
/*绘画单元*/
for( i = 0 ;i < pview->ospnum;i++)
{
if( i == pview->coursorx)
(*DrawCellFunc)(pview,i * LR_CELL_WIDTH + drawstartx,pview->localy + pview->high /2 - LR_CELL_HIGH / 2,/* 焦点状态CELL*/
drawstartx + (i+1) * LR_CELL_WIDTH,pview->high /2 + LR_CELL_HIGH / 2,pview->baseindex + i,0);
else if(pview->baseindex + i >= pview->cellnum)/*消除不存再的单元画面*/
GFMDrawRectangle( i * LR_CELL_WIDTH + drawstartx + 30,pview->localy + pview->high /2 - LR_CELL_HIGH / 2,/* 焦点状态CELL*/
LR_CELL_WIDTH, LR_CELL_HIGH ,Colors_weakpurple,1);
else
(*DrawCellFunc)(pview,i * LR_CELL_WIDTH + drawstartx,pview->localy + pview->high /2 - LR_CELL_HIGH / 2,/*一般状态CELL*/
drawstartx + (i+1) * LR_CELL_WIDTH, pview->high /2 + LR_CELL_HIGH / 2,pview->baseindex + i,0);
}
/*绘画指示箭头*/
if(!pview->locked )
DrawLrArows( pview);
#ifdef _WIN32
AfxGetApp()->GetMainWnd()->ReleaseDC(dc);
#endif
}
static void DrawLr0Cell(void *p,int x,int y,int right,int bottom,int index,int color)
{
pLRVIEW pview = (pLRVIEW )p;
if(pview->locked || pview->cellnum <=0 ) return ;
#ifdef _WIN32
CDC *dc = AfxGetApp()->GetMainWnd()->GetDC();
CBrush brush(color);
dc->SelectObject(brush);
dc->Rectangle(CRect(x,y,right,bottom));
#else
if(pview->cellnum <=0) return ;
if(index - pview->baseindex == pview->coursorx)
DrawLr0Text(pview,x,y, index,Colors_white);
else
DrawLr0Text(pview,x,y , index,Colors_thkblue1);
#endif
#ifdef _WIN32
AfxGetApp()->GetMainWnd()->ReleaseDC(dc);
#endif
}
static void DrawLr0Text(void *pt,int x,int y ,int index,int color)
{
pLRVIEW pview = (pLRVIEW )pt;
char *p = GetLrListData(pview,index);
char buf[3];
int startx;
int i;
#ifdef _WIN32
CDC *dc = AfxGetApp()->GetMainWnd()->GetDC();
dc->SetBkMode(0);
dc->SetTextColor(color);
if(p)
dc->TextOut(x,y,p);
#else
if(p)
FNTDrawText(color,0,x + 30,y,p);/*0:画16位字体,1:24位字体*/
else
return;
#endif
if(index - pview->baseindex == pview->coursorx)
{
memset(hzbuf,0,HZBUF_LEN);
GetHzRangeBySpell(p,hzbuf);
buf[2] = 0;
startx = x - pview->coursorx * LR_CELL_WIDTH;
for( i = 0;i < pview->ospnum;i++)
{
buf[0] = hzbuf[i*2];
buf[1] = hzbuf[i*2+ 1];
#ifdef _WIN32
dc->TextOut(startx,y + 25,buf);
#else
FNTDrawText(color,1,startx + 30,y + 25,buf);/*0:画16位字体,1:24位字体*/
#endif
startx += LR_CELL_WIDTH;
}
}
#ifdef _WIN32
AfxGetApp()->GetMainWnd()->ReleaseDC(dc);
#endif
}
static void DrawLr1Cell(void *p,int x,int y,int right,int bottom,int index,int color)
{
pLRVIEW pview = (pLRVIEW )p;
if(pview->locked || pview->cellnum <=0 ) return ;
#ifdef _WIN32
CDC *dc = AfxGetApp()->GetMainWnd()->GetDC();
CBrush brush(color);
dc->SelectObject(brush);
dc->Rectangle(CRect(x,y,right,bottom));
#else
#endif
if(pview->cellnum <=0) return ;
if(index - pview->baseindex == pview->coursorx)
DrawLr1Text(pview,x,y, index,Colors_white);
else
DrawLr1Text(pview,x,y , index,Colors_thkblue1);
#ifdef _WIN32
AfxGetApp()->GetMainWnd()->ReleaseDC(dc);
#endif
}
static void DrawLr1Text(void * pt,int x,int y ,int index,int color)
{
pLRVIEW pview = (pLRVIEW )pt;
char *p = GetLrListData(pview,index);
char buf[3];
#ifdef _WIN32
CDC *dc = AfxGetApp()->GetMainWnd()->GetDC();
dc->SetBkMode(0);
dc->SetTextColor(color);
if(p)
dc->TextOut(x,y +25,p);
#else
if(p)
{
FNTDrawText(color,1,x + 24,y+25,p);/*0:画16位字体,1:24位字体*/
sprintf(buf,"%d",index - pview->baseindex + 1);
FNTDrawText(color,0,x + 30,y,buf);/*0:画16位字体,1:24位字体*/
}
#endif
#ifdef _WIN32
AfxGetApp()->GetMainWnd()->ReleaseDC(dc);
#endif
}
/*****************************************************************************\
以下为TT逻辑函数模块,包括输入规则过滤,单词组合,验证等
\******************************************************************************/
static void AddHzToLr(pLRVIEW lr,char *str)/*把内码加入某个LR*/
{
int len = strlen(str);
char txt[4] = {0};
int i;
for(i = 0;i < len;i+=2)
{
txt[0] = str[i];
txt[1] = str[i+1];
AddToLrList(lr,txt);
}
}
static void AddPickToList(void)/*用户输入加入LR1或cellview*/
{
char txt[3] = {0};
switch(curpick[0])
{
case ' ':/*加入空格到编辑区*/
AddToCellView(cellview," ");
DrawCellFrame(cellview);
break;
case ',':
{
/*加入特殊字符到LR1*/
/*LockLrList(lrview0);*/
/*FreeStrListItems(lrview1);*/
int len = strlen(curpick);
int i,j;
FreeLrListItems(lrview1);
for(i = 0;i < len;i++)
{
if((curpick[i] & 0x80)== 0x80)
{
txt[0] = curpick[i];
i++;
txt[1] = curpick[i];
}
txt[0] = curpick[i];
txt[1] = 0;
AddToLrList(lrview1,txt);
}
#ifdef TT_DEBUT
FNTDrawText(0,rand() % 6, 60, 200, "enterned AddPickToList!case ','");
#endif
UnLockLrList(lrview1);
ShowLrList(lrview1);
}
break;
default:/*输入ABC处理*/
{
int len = strlen(curpick);
int i,j;
for(i = 0;i < len;i++)
{
txt[0] = curpick[i];
txt[1] = 0;
AddToLrList(lrview1,txt);
txt[0] -= 32;
AddToLrList(lrview1,txt);
}
}
}
}
/*
加入字母的反向操作
*/
void decopt(void)
{
picklen--;
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 400, "void decopt(void)");
#endif
if(picklen > 0)
{
memset(cmatrix[picklen],0,6);
ProcessDic();
}
else
{
picklen = 0;
tt_status = WAIT_ENTERN;
#ifdef TT_DEBUT
FNTDrawText(rand() % 6, 0, 60, 260, "decopt: tt_status = WAIT_ENTERN;");
#endif
}
}
void SetCurPick(int num)
{
if(0<=num && num <= 9)
curpick = BtnDef[num];
}
/*
type :当前输入法类型
#define HZMODE 0
#define ASCMODE 1
#define NUMMODE 2
*/
#if 0
void OkOnLrView0(int type,int status)/*发生在lrview上的OK事件处理*/
{
switch(type)
{
case HZMODE:
break;
case ASCMODE:
break;
case NUMMODE:
break;
}
}
void OkOnLrView1(int type)/*发生在lrview1上的OK事件处理*/
{
switch(type)
{
case HZMODE:
break;
case ASCMODE:
break;
case NUMMODE:
break;
}
}
#endif
/*
推测 ->求证->取码->确定
对于用户输入的拼音来讲,进行语法分析判断正确与否是最好的办法,这里采用比较笨的办法,把
应该语法分析的部分变为一个搜索过程。
1。这里要做的事情是第一是首先根据用户输入的第一组字符推断出1-2位的正确的拼音,并把它们保存到
LR列表中,然后从缓冲中取出默认的几个汉字绘画出。
2。第二次的输入处理在第一组的基础上推断出2-3位的正确输入,并把它们保存入LR列表中,此时拼音组
的范围应该减少了,重复汉字加入动作。
3。第。。。递归以上的过程,直到用户把所有的拼音输完。
4。用户在LR中选中某项按下OK键后把相应拼音的所有汉字加入LR2中,然后操作落于LR2上,用户在此选择
*/
/*词推测抛弃抛弃原则*/
/* g原则:对阶四的输入若发现上阶存在G则立即全部抛掉该输入,对三阶输入,若上层没有N则丢掉该阶的g,有N则丢掉上阶N之外的单词*/
/*n原则:2阶输入若上阶没有存在A或E立即抛掉*/
/*n原则:3阶输入若上界没有存在A,E,I,O立即抛掉*/
/*a原则:三阶输入若上阶不是H立即抛掉*/
/*i原则:三阶输入,若上阶没有E或A,C立即抛掉I*/
/*e原则:三阶输入若上阶没有i立即抛掉*/
/*o原则:三阶输入若上阶不是A或U立即抛掉*/
/*U原则:三阶输入若上阶不是o立即抛掉*/
/*阶四 :立抛原则 + g原则 */
/*阶三 :可出现在第三节的单词 + 立抛原则 */
/*可以出现第二阶的单词 + 立抛原则*/
/*阶上升原则:若经过以上规则过滤后,上阶屡空,则提升该阶到上阶*/
static int FindC(char *str,char c)
{
int len = strlen(str);
while(--len >= 0)
if(str[len] == c)
return 1;
return 0;
}
static int InCbc6(char c)
{
char cbc6[] = "g";
if(cbc6[0] == c)
return 1;
return 0;
}
static int InCbc5(char c)
{
char cbc5[] = "ing";
int i = 3;
while(--i>=0)
if(c == cbc5[i])
return 1;
return 0;
}
static int InCbc4(char c)
{
char cbc4[] = "aiougn";
int i = 6;
while(--i>=0)
if(c == cbc4[i])
return 1;
return 0;
}
static int InCbc3(char c)
{
char cbc3[] = "aeioung";
int i = 7;
while(--i>=0)
if(c == cbc3[i])
return 1;
return 0;
}
static int InCbc2(char c)
{
char cbc2[] ="aeiounh";
int i = 7;
while(--i>=0)
if(c == cbc2[i])
return 1;
return 0;
}
static int InCbc1(char c)
{
char cbc1[]= "iuv";/*不能出现在第一阶的单词*/
int i = 3;
while(--i>=0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -