📄 uikbd_zy.c
字号:
#include <uiWnd.h>
#include <uiSw_Kbd.h>
#include <uiKbd_ZY.h>
#include <uiKbd_ZY.res>
#include <uiIme_ZY.h>
#include <uiIcon_Img.h>
#include <uiSound.h>
#define KBD_ZY_INVERT(handle,i)\
guiInvertRect(handle, KBDCOOR_ZY[i].left+1,KBDCOOR_ZY[i].top+1,\
KBDCOOR_ZY[i].right-1,KBDCOOR_ZY[i].bottom-1);
unsigned short gpBig5Code_ZY[MAX_ZY_REPEAT_COUNT];
static unsigned char gBPMFCount = 0;
/*********************************************************************/
//dest: 恢复一个已按下的按键到正常显示状态
//para:
// handle: 键盘控件的handle值
// num: 候选字区中可显示的候选字个数
//return:void
/*********************************************************************/
void _guiKbd_ZY_Release(HNDL handle,int num)
{
TGuiSw_Kbd *pControl;
pControl=(TGuiSw_Kbd *)handle;
if(pControl->SelPos < 0) // 是否有选中位置
return;
switch(KBDCOOR_ZY[pControl->SelPos].code)
{
case KEY_IMECODE:
case KEY_CANDIDATE: // 五笔代码或候选字区不需要进行处理
break;
case KEY_LEFT:
if(pControl->StartPos != 0) // 是否存在左箭头
guiPutImage(handle,WL_START,WH_START-13,WL_START+7,WH_START-2,icon_Gui_LeftArrow8X12_UP);
break;
case KEY_RIGHT:
if(pControl->StartPos+num<pControl->TotalNum) // 是否存在右箭头
guiPutImage(handle,WR_START,WH_START-13,WR_START+7,WH_START-2,icon_Gui_RightArrow8X12_UP);
break;
default:
KBD_ZY_INVERT(handle,pControl->SelPos); // 反显选中的按键
break;
}
pControl->SelPos = -1;
}
/*********************************************************************/
//dest: 拼音键盘开始
//para: void
//return:void
/*********************************************************************/
void guiSwKbd_startZY( HNDL handle )
{
return;
}
/*********************************************************************/
//dest: 拼音键盘结束
//para: void
//return:void
/*********************************************************************/
void guiSwKbd_endZY( HNDL handle )
{
return;
}
/*********************************************************************/
//dest: 拼音键盘对笔点消息的响应
//para:
// handle: 键盘控件的handle值
// message:笔点消息类型
// x,y: 笔点位置座标
//return:void
/*********************************************************************/
void guiSwKbd_actionZY(HNDL handle, WORD message, WORD x, WORD y)
{
TGuiSw_Kbd *pControl;
WORD code, bigWord;
WORD etymonStr[5];
int result,len;
int iTotalNum,iSelPos,iWordWidth;
DWORD Offset;
WORD toReadCount,ReadCount;
char iGrp;
WORD wText[20];
//unsigned short gpBig5Code_ZY[MAX_ZY_REPEAT_COUNT];
guiEnterWCS();
pControl=(TGuiSw_Kbd *)handle;
guiPushFont(pControl->base.font);
iWordWidth=guiGetWordWidth(); // 候选字的字宽
toReadCount=(WL_START-WC_START)/(iWordWidth+1); // 候选字的个数
//转换成相对于控件的坐标
x -= pControl->base.left;
y -= pControl->base.top;
result=guiSwKbd_SearchPos(KBDCOOR_ZY,x, y); // 搜索笔点位置
if(result == -1) // 是否点在有效区域内
{
_guiKbd_ZY_Release(handle,toReadCount); // 取消原选中位置
guiPopFont();
guiExitWCS();
return;
}
code=KBDCOOR_ZY[result].code; // 被选中位置的代码
switch(message)
{
case PENUP:
_guiKbd_ZY_Release(handle,toReadCount); // 取消原选中位置
switch(code)
{
case KEY_ENGLISH: // 切换到英文键盘
guiSwKbd_SwitchClass(handle,KBDCLASS_ENGLISH);
guiPenSound();
break;
case KEY_CHINESE: // 切换到下一个中文键盘
guiSwKbd_SwitchToNextInType(handle);
guiPenSound();
break;
case KEY_SYMBOL: // 切换到符号键盘
guiSwKbd_SwitchClass(handle,KBDCLASS_SYMBOL);
guiPenSound();
break;
case KEY_HAND: // 切换到手写键盘
guiSwKbd_SwitchClass(handle,KBDCLASS_HAND);
guiPenSound();
break;
case KEY_CAPSLOCK: // 切换到五笔键盘
guiSwKbd_SetType(handle, KBD_CHT_CJ);
guiPenSound();
break;
case KEY_CANDIDATE: // 选中候选字区
iSelPos=(x-WC_START)/(iWordWidth+1); // 选中第几个候选字
if(pControl->StartPos+iSelPos<pControl->TotalNum) // 该位置是否有字
{
ReadCount = guiGetCandidate_zy(iTotalNum, 1, pControl->StartPos+iSelPos, wText, gpBig5Code_ZY);
wText[ReadCount]=0;
//bigWord = gpBig5Code_ZY[iSelPos];
bigWord = wText[0];
guiKbd_SendMsg(handle,bigWord,INPUT_MODE_ADD); // 将选中的字送到系统
pControl->First_Stroke1=1; // 设置已经选择候选字标志
guiPenSound();
}
break;
case KEY_LEFT:
if(pControl->StartPos != 0) // 是否存在左箭头
{
pControl->StartPos-=toReadCount;
//ReadCount=guiGetCandidate_zy(pControl->Offset,pControl->TotalNum,pControl->StartPos,toReadCount,wText);
ReadCount = guiGetCandidate_zy(iTotalNum, toReadCount, pControl->StartPos, wText, gpBig5Code_ZY);
wText[ReadCount]=0;
guiClearBlock(handle,WC_START,1,158,WH_START-1,GUI_WHITE,0); // 清除原来的显示信息
guiShowString(handle,(char *)wText,WC_START+1,2,GUI_BLACK,0); // 显示候选字
if(pControl->StartPos != 0) // 前面是否还有候选字
guiPutImage(handle,WL_START,WH_START-13,WL_START+7,WH_START-2,icon_Gui_LeftArrow8X12_UP);
guiPutImage(handle,WR_START,WH_START-13,WR_START+7,WH_START-2,icon_Gui_RightArrow8X12_UP); // 后面一定还有候选字
guiPenSound();
}
break;
case KEY_RIGHT:
if((pControl->StartPos + toReadCount) < pControl->TotalNum) // 是否存在右箭头
{
pControl->StartPos+=toReadCount;
//ReadCount=guiGetCandidate_zy(pControl->Offset,pControl->TotalNum,pControl->StartPos,toReadCount,wText);
ReadCount = guiGetCandidate_zy(iTotalNum, toReadCount, pControl->StartPos, wText, gpBig5Code_ZY);
wText[ReadCount]=0;
guiClearBlock(handle,WC_START,1,158,WH_START-1,GUI_WHITE,0);
guiShowString(handle,(char *)wText,WC_START+1,2,GUI_BLACK,0); // 显示候选字
guiPutImage(handle,WL_START,WH_START-13,WL_START+7,WH_START-2,icon_Gui_LeftArrow8X12_UP); // 前面一定有候选字
if((pControl->StartPos + toReadCount) < pControl->TotalNum) // 后面是否还有候选字
guiPutImage(handle,WR_START,WH_START-13,WR_START+7,WH_START-2,icon_Gui_RightArrow8X12_UP);
guiPenSound();
}
break;
case ZY_KEY_BACKSPACE:
guiClearBlock(handle,1,1,158,WH_START-1,GUI_WHITE,0); // 清除显示区
//len=strlen(pControl->InputStr);
if(pControl->First_Stroke1 == 1 || gBPMFCount == 0) // 已选择过汉字或者没有候选字时
{
//strcpy(pControl->InputStr,""); // 复位相关参数
memset(pControl->InputStr, 0x00, MAX_INPUT_STR_NUM);
gBPMFCount = 0;
pControl->Offset=0;
pControl->StartPos=0;
pControl->TotalNum=0;
guiKbd_SendMsg(handle,KEY_BACKSPACE,INPUT_MODE_ADD); // 输入一个BackSpace键
}
// 没有选择过候选区中的汉字时
//else if(len == 1) // 编码只有一个字符
else
{
pControl->InputStr[gBPMFCount-1] = 0;
while (pControl->InputStr[gBPMFCount-1] == 0 && gBPMFCount > 0)
{
gBPMFCount--;
}
if(gBPMFCount==0)
{
//strcpy(pControl->InputStr,""); // 复位相关参数
memset(pControl->InputStr, 0x00, MAX_INPUT_STR_NUM);
gBPMFCount = 0;
pControl->Offset=0;
pControl->StartPos=0;
pControl->TotalNum=0;
}
else
{
ConvertNumToCode_ZY(pControl->InputStr, etymonStr);
guiShowString(handle, (char *)etymonStr, 2, 2, GUI_BLACK, 0); // 显示编码
iTotalNum=guiIme_zy(pControl->InputStr, gpBig5Code_ZY); // 取候选字开始位置和总数
if(iTotalNum > 0) // 该编码是否存在
{
//unsigned short etymonStr[6];
pControl->Offset=Offset; // invalid
pControl->StartPos=0;
pControl->TotalNum=iTotalNum;
//ReadCount=guiGetCandidate_zy(iTotalNum,0,toReadCount,wText,gpBig5Code_ZY); // 取候选字
//wText[ReadCount]=0;
//guiShowString(handle,(char *)wText,WC_START+1,2,GUI_BLACK,0); // 显示候选字
ReadCount = guiGetCandidate_zy(iTotalNum, toReadCount, 0, wText, gpBig5Code_ZY);
wText[ReadCount]=0;
guiShowString(handle,(char *)wText,WC_START+1,2,GUI_BLACK,0); // 显示候选字
//guiShowString(handle,(char *)gpBig5Code_ZY,WC_START+1,2,GUI_BLACK,0); // 显示候选字
if((toReadCount) < iTotalNum) // 后面是否还有候选字
guiPutImage(handle,WR_START,WH_START-13,WR_START+7,WH_START-2,icon_Gui_RightArrow8X12_UP);
pControl->First_Stroke1=-1; // 设置没有选择过候选字标志
}
}
}
pControl->First_Stroke1=-1; // 设置没有选择过候选字标志
guiPenSound();
break;
case KEY_IMECODE:
break;
default:
if(BpmfKeyIsBpmfCode(code))
{
if(pControl->First_Stroke1 == 1) // 已选择过汉字时
{
guiClearBlock(handle,1,1,158,WH_START-1,GUI_WHITE,0);
//strcpy(pControl->InputStr,""); // 复位相关参数
memset(pControl->InputStr, 0x00, MAX_INPUT_STR_NUM);
gBPMFCount = 0;
pControl->Offset=0;
pControl->StartPos=0;
pControl->TotalNum=0;
pControl->First_Stroke1 = -1;
}
iGrp = BpmfGetCodeGroup(code);
//BpmfPushBPMFKeyToCmp(code, iGrp, pControl->InputStr);
pControl->InputStr[iGrp-1] = code;
if (gBPMFCount < iGrp)
gBPMFCount = iGrp;
guiClearBlock(handle,1,1,158,WH_START-1,GUI_WHITE,0);
//guiShowString(handle,pControl->InputStr,2,2,GUI_BLACK,0); // 显示编码
ConvertNumToCode_ZY(pControl->InputStr, etymonStr);
guiShowString(handle, (char *)etymonStr, 2, 2, GUI_BLACK, 0); // 显示编码
iTotalNum=guiIme_zy(pControl->InputStr, gpBig5Code_ZY);
if(iTotalNum > 0) // 该编码是否存在
{
//unsigned short etymonStr[6];
pControl->Offset=Offset; // invalid
pControl->StartPos=0;
pControl->TotalNum=iTotalNum;
//ReadCount=guiGetCandidate_zy(iTotalNum,0,toReadCount,wText,gpBig5Code_ZY); // 取候选字
//wText[ReadCount]=0;
//guiShowString(handle,(char *)wText,WC_START+1,2,GUI_BLACK,0); // 显示候选字
ReadCount = guiGetCandidate_zy(iTotalNum, toReadCount, 0, wText, gpBig5Code_ZY);
wText[ReadCount]=0;
guiShowString(handle,(char *)wText,WC_START+1,2,GUI_BLACK,0); // 显示候选字
//guiShowString(handle,(char *)gpBig5Code_ZY,WC_START+1,2,GUI_BLACK,0); // 显示候选字
if((toReadCount) < iTotalNum) // 后面是否还有候选字
guiPutImage(handle,WR_START,WH_START-13,WR_START+7,WH_START-2,icon_Gui_RightArrow8X12_UP);
pControl->First_Stroke1=-1; // 设置没有选择过候选字标志
}
// else
// pControl->InputStr[len]=0;
}
else
{
if(code==ZY_KEY_DELETE)
code = KEY_DELETE;
if(code==ZY_KEY_ENTER)
code = KEY_ENTER;
//strcpy(pControl->InputStr,""); // 复位相关参数
memset(pControl->InputStr, 0x00, MAX_INPUT_STR_NUM);
gBPMFCount = 0;
pControl->Offset=0;
pControl->StartPos=0;
pControl->TotalNum=0;
pControl->First_Stroke1=-1;
guiClearBlock(handle,1,1,158,WH_START-1,GUI_WHITE,0);
guiKbd_SendMsg(handle,code,INPUT_MODE_ADD); // 输入一个字符
}
guiPenSound();
break;
}
break;
case PENMOVE:
if( pControl->SelPos == result)
break;
case PENREENTER:
case PENDOWN:
_guiKbd_ZY_Release(handle,toReadCount); // 取消原选中位置
switch(code) // 设置新显示位置
{
case KEY_IMECODE:
case KEY_CANDIDATE: // 从拼音代码或候选字区域移出时,不需进行显示处理
break;
case KEY_LEFT:
if(pControl->StartPos != 0) // 是否存在左箭头
guiPutImage(handle,WL_START,WH_START-13,WL_START+7,WH_START-2,icon_Gui_LeftArrow8X12_DOWN);
break;
case KEY_RIGHT:
if(pControl->StartPos+toReadCount<pControl->TotalNum) // 是否存在右箭头
guiPutImage(handle,WR_START,WH_START-13,WR_START+7,WH_START-2,icon_Gui_RightArrow8X12_DOWN);
break;
default:
KBD_ZY_INVERT(handle,result); // 反显选中的按键
break;
}
pControl->SelPos=result;
break;
case PENREMOVE:
_guiKbd_ZY_Release(handle,toReadCount); // 取消原选中位置
break;
}
guiPopFont();
guiExitWCS();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -