📄 uikbd_py.c
字号:
/*********************************************************************/
// 文 件 名: uiKbd_PY.cpp
// 程序说明: 拼音键盘
// 程序设计: 党德华
// 2001.11.05 设计完成 说明文档:R004-S243-0001
// 程序审查: 宋军霞
// 2002.01.22 审查完成 说明文档:R004-S243-0001
// 项目编号: R004-S243
// 版 本: V1.0
// 版 权: Reality Plus Technology (ShenZhen) Co.,Ltd.
/*********************************************************************/
#include <uiWnd.h>
#include <uiSw_Kbd.h>
#include <uiKbd_PY.h>
#include <uiKbd_PY.res>
#include <uiIme_PY.h>
#include <uiIcon_Img.h>
#include <uiSound.h>
#include <uiGui_Cfg.h>
#include <TypeDefine.h>
// 反显拼音键盘中的一个矩形区
#define KBD_PY_INVERT(handle,i)\
guiInvertRect(handle, KBDCOOR_PY[i].left+1,KBDCOOR_PY[i].top+1,\
KBDCOOR_PY[i].right-1,KBDCOOR_PY[i].bottom-1);
/*********************************************************************/
//dest: 恢复一个已按下的按键到正常显示状态
//para:
// handle: 键盘控件的handle值
// num: 候选字区中可显示的候选字个数
//return:void
/*********************************************************************/
void _guiKbd_PY_Release(HNDL handle,int num)
{
TGuiSw_Kbd *pControl;
pControl=(TGuiSw_Kbd *)handle;
if(pControl->SelPos < 0) // 是否有选中位置
return;
switch(KBDCOOR_PY[pControl->SelPos].code)
{
case KEY_IMECODE:
case KEY_CANDIDATE: // 拼音代码或候选字区不需要进行处理
break;
case KEY_LEFT:
if(pControl->StartPos != 0) // 是否存在左箭头
guiPutImage(handle,PL_START,PH_START-13,PL_START+7,PH_START-2,icon_Gui_LeftArrow8X12_UP);
break;
case KEY_RIGHT:
if(pControl->StartPos+num<pControl->TotalNum) // 是否存在右箭头
guiPutImage(handle,PR_START,PH_START-13,PR_START+7,PH_START-2,icon_Gui_RightArrow8X12_UP);
break;
default:
KBD_PY_INVERT(handle,pControl->SelPos); // 反显选中的按键
break;
}
pControl->SelPos = -1;
}
/*********************************************************************/
//dest: 拼音键盘开始
//para: void
//return:void
/*********************************************************************/
void guiSwKbd_startPY( HNDL handle )
{
return;
}
/*********************************************************************/
//dest: 拼音键盘结束
//para: void
//return:void
/*********************************************************************/
void guiSwKbd_endPY( HNDL handle )
{
return;
}
/*********************************************************************/
//dest: 拼音键盘对笔点消息的响应
//para:
// handle: 键盘控件的handle值
// message:笔点消息类型
// x,y: 笔点位置座标
//return:void
/*********************************************************************/
void guiSwKbd_actionPY(HNDL handle, WORD message, WORD x, WORD y)
{
TGuiSw_Kbd *pControl;
WORD code;
int result,len;
int iTotalNum,iSelPos,iWordWidth;
DWORD Offset;
WORD toReadCount,ReadCount;
WORD wText[20];
guiEnterWCS();
pControl=(TGuiSw_Kbd *)handle;
guiPushFont(pControl->base.font);
iWordWidth=guiGetWordWidth(); // 候选字的字宽
toReadCount=(PL_START-PC_START)/(iWordWidth+1); // 候选字的个数
//转换成相对于控件的坐标
x -= pControl->base.left;
y -= pControl->base.top;
result=guiSwKbd_SearchPos(KBDCOOR_PY,x, y); // 搜索笔点位置
if(result == -1) // 是否点在有效区域内
{
_guiKbd_PY_Release(handle,toReadCount); // 取消原选中位置
guiPopFont();
guiExitWCS();
return;
}
code=KBDCOOR_PY[result].code; // 被选中位置的代码
switch(message)
{
case PENUP:
_guiKbd_PY_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_CHINESE_WB);
guiSwKbd_SetType(handle,KBD_CHINESE_MAKEWORD);
guiPenSound();
break;
case KEY_CANDIDATE: // 选中候选字区
iSelPos=(x-PC_START)/(iWordWidth+1); // 选中第几个候选字
if(pControl->StartPos+iSelPos<pControl->TotalNum) // 该位置是否有字
{
guiGetCandidate_py(pControl->Offset,pControl->TotalNum,pControl->StartPos+iSelPos,1,wText);
guiKbd_SendMsg(handle,wText[0],INPUT_MODE_ADD); // 将选中的字送到系统
pControl->First_Stroke1=1; // 设置已经选择候选字标志
guiPenSound();
}
break;
case KEY_LEFT:
if(pControl->StartPos != 0) // 是否存在左箭头
{
pControl->StartPos-=toReadCount;
ReadCount=guiGetCandidate_py(pControl->Offset,pControl->TotalNum,
pControl->StartPos,toReadCount,wText); // 取下一页候选字
wText[ReadCount]=0; // 设置字符串结束标志
guiClearBlock(handle,PC_START,1,158,PH_START-1,GUI_WHITE,0); // 清除原来的显示信息
guiShowString(handle,(char *)wText,PC_START+1,2,GUI_BLACK,0); // 显示候选字
if(pControl->StartPos != 0) // 前面是否还有候选字
guiPutImage(handle,PL_START,PH_START-13,PL_START+7,PH_START-2,icon_Gui_LeftArrow8X12_UP);
guiPutImage(handle,PR_START,PH_START-13,PR_START+7,PH_START-2,icon_Gui_RightArrow8X12_UP); // 后面一定还有候选字
guiPenSound();
}
break;
case KEY_RIGHT:
if((pControl->StartPos + toReadCount) < pControl->TotalNum) // 是否存在右箭头
{
pControl->StartPos+=toReadCount;
ReadCount=guiGetCandidate_py(pControl->Offset,pControl->TotalNum,
pControl->StartPos,toReadCount,wText); // 取下一页候选字
wText[ReadCount]=0; // 设置字符串结束标志
guiClearBlock(handle,PC_START,1,158,PH_START-1,GUI_WHITE,0);
guiShowString(handle,(char *)wText,PC_START+1,2,GUI_BLACK,0); // 显示候选字
guiPutImage(handle,PL_START,PH_START-13,PL_START+7,PH_START-2,icon_Gui_LeftArrow8X12_UP); // 前面一定有候选字
if((pControl->StartPos + toReadCount) < pControl->TotalNum) // 后面是否还有候选字
guiPutImage(handle,PR_START,PH_START-13,PR_START+7,PH_START-2,icon_Gui_RightArrow8X12_UP);
guiPenSound();
}
break;
case KEY_BACKSPACE:
guiClearBlock(handle,1,1,158,PH_START-1,GUI_WHITE,0); // 清除显示区
len=strlen(pControl->InputStr);
if(pControl->First_Stroke1 == 1 || len == 0) // 已选择过汉字或者没有候选字时
{
strcpy(pControl->InputStr,""); // 复位相关参数
pControl->Offset=0;
pControl->StartPos=0;
pControl->TotalNum=0;
pControl->First_Stroke2=-1;
guiKbd_SendMsg(handle,KEY_BACKSPACE,INPUT_MODE_ADD); // 输入一个BackSpace键
}
// 没有选择过候选区中的汉字时
else if(len == 1) // 编码只有一个字符
{
strcpy(pControl->InputStr,""); // 复位相关参数
pControl->Offset=0;
pControl->StartPos=0;
pControl->TotalNum=0;
}
else // 编码大于一个字符
{
pControl->InputStr[len-1]='\0'; // 删除最后一个字符
guiShowString(handle,pControl->InputStr,2,2,GUI_BLACK,0); // 显示新的编码
iTotalNum=guiIme_py(pControl->InputStr, &Offset); // 取候选字开始位置和总数
pControl->Offset=Offset;
pControl->StartPos=0;
pControl->TotalNum=iTotalNum;
ReadCount=guiGetCandidate_py(Offset,iTotalNum,0,toReadCount,wText); // 取候选字
wText[ReadCount]=0;
guiShowString(handle,(char *)wText,PC_START+1,2,GUI_BLACK,0); //显示候选字
if((pControl->StartPos + toReadCount) < pControl->TotalNum) // 后面是否还有候选字
guiPutImage(handle,PR_START,PH_START-13,PR_START+7,PH_START-2,icon_Gui_RightArrow8X12_UP);
}
pControl->First_Stroke1=-1; // 设置没有选择过候选字标志
guiPenSound();
break;
case KEY_IMECODE:
break; // 拼音代码区时,不需要进行处理
default:
if(code >= 'a' && code <= 'z') // 输入编码
{
if(pControl->First_Stroke1 == 1) // 已选择过汉字时
{
guiClearBlock(handle,1,1,158,PH_START-1,GUI_WHITE,0);
strcpy(pControl->InputStr,""); // 复位相关参数
pControl->Offset=0;
pControl->StartPos=0;
pControl->TotalNum=0;
pControl->First_Stroke1 = -1;
pControl->First_Stroke2 = -1;
}
len=strlen(pControl->InputStr);
if(len < MAX_INPUT_STR_NUM) // 编码是否已达最大长度
{
pControl->InputStr[len]=(char)code;
pControl->InputStr[len+1]=0;
iTotalNum=guiIme_py(pControl->InputStr, &Offset); // 取候选字开始位置和总数
if(iTotalNum > 0) // 该编码是否存在
{
guiClearBlock(handle,1,1,158,PH_START-1,GUI_WHITE,0);
guiShowString(handle,pControl->InputStr,2,2,GUI_BLACK,0); // 显示编码
pControl->Offset=Offset;
pControl->StartPos=0;
pControl->TotalNum=iTotalNum;
ReadCount=guiGetCandidate_py(Offset,iTotalNum,0,toReadCount,wText); // 取候选字
wText[ReadCount]=0;
guiShowString(handle,(char *)wText,PC_START+1,2,GUI_BLACK,0); // 显示候选字
if((toReadCount) < iTotalNum) // 后面是否还有候选字
guiPutImage(handle,PR_START,PH_START-13,PR_START+7,PH_START-2,icon_Gui_RightArrow8X12_UP);
pControl->First_Stroke1=-1; // 设置没有选择过候选字标志
}
else
pControl->InputStr[len]=0;
}
}
else
{
strcpy(pControl->InputStr,""); // 复位相关参数
pControl->Offset=0;
pControl->StartPos=0;
pControl->TotalNum=0;
pControl->First_Stroke1=-1;
pControl->First_Stroke2=-1;
guiClearBlock(handle,1,1,158,PH_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_PY_Release(handle,toReadCount); // 取消原选中位置
switch(code) // 设置新显示位置
{
case KEY_IMECODE:
case KEY_CANDIDATE: // 从拼音代码或候选字区域移出时,不需进行显示处理
break;
case KEY_LEFT:
if(pControl->StartPos != 0) // 是否存在左箭头
guiPutImage(handle,PL_START,PH_START-13,PL_START+7,PH_START-2,icon_Gui_LeftArrow8X12_DOWN);
break;
case KEY_RIGHT:
if(pControl->StartPos+toReadCount<pControl->TotalNum) // 是否存在右箭头
guiPutImage(handle,PR_START,PH_START-13,PR_START+7,PH_START-2,icon_Gui_RightArrow8X12_DOWN);
break;
default:
KBD_PY_INVERT(handle,result); // 反显选中的按键
break;
}
pControl->SelPos=result;
break;
case PENREMOVE:
_guiKbd_PY_Release(handle,toReadCount); // 取消原选中位置
break;
}
guiPopFont();
guiExitWCS();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -