📄 uikbd_hand.c
字号:
#include <uiWnd.h>
#include <uiKbd_Hand.h>
#include <uiKbd_Hand.res>
#include <uiHandWrite.h>
#include <uiSound.h>
#include <uiUtility.h>
extern int gLanguage;
TSwKbd_Coor *KBDCOOR_HAND;
#define KBD_HAND_INVERT(handle,i) \
guiInvertRect(handle, KBDCOOR_HAND[i].left+1,KBDCOOR_HAND[i].top+1,\
KBDCOOR_HAND[i].right-1,KBDCOOR_HAND[i].bottom-1);
/*********************************************************************/
//dest: 恢复一个已按下的按键到正常显示状态
//para:
// handle: 键盘控件的handle值
// num: 候选字区中可显示的候选字个数
//return:void
/*********************************************************************/
void _guiKbd_Hand_Release(HNDL handle)
{
TGuiSw_Kbd *pControl;
pControl=(TGuiSw_Kbd *)handle;
if(pControl->SelPos < 0) // 是否有选中位置
return;
switch(KBDCOOR_HAND[pControl->SelPos].code)
{
case KEY_CANDIDATE: // 候选字区不需要进行处理
case KEY_CANDIDATE2:
case KEY_HANDREGION:
break;
default:
KBD_HAND_INVERT(handle,pControl->SelPos); // 反显选中的按键
break;
}
pControl->SelPos = -1;
}
/*********************************************************************/
//dest: 手写键盘开始
//para: void
//return:void
/*********************************************************************/
void guiSwKbd_startHand( HNDL handle )
{
TGuiControl *pControl;
int left,top;
THWR_Region tHWR_Region[HWR_REGION_NUMBER];
char langType;
langType = guiQueryLanguageType();
if(langType>2)
langType = LANGUAGE_CHS;
if(langType==LANGUAGE_CHT)
{
KBDCOOR_HAND = (struct tagSwKbd_Coor *)KBDCOOR_HAND_CHT;
}
else
{
KBDCOOR_HAND = (struct tagSwKbd_Coor *)KBDCOOR_HAND_CHS;
}
pControl=(TGuiControl *)handle;
left=pControl->left;
top=pControl->top;
tHWR_Region[0].left=left+HAND_X;
tHWR_Region[0].top=top+HAND_Y;
tHWR_Region[0].right=tHWR_Region[0].left+HAND_W-1;
tHWR_Region[0].bottom=top+HAND_Y+HAND_H-1;
tHWR_Region[1].left=tHWR_Region[0].right+2;
tHWR_Region[1].top=top+HAND_Y;
tHWR_Region[1].right=tHWR_Region[1].left+HAND_W-1;
tHWR_Region[1].bottom=top+HAND_Y+HAND_H-1;
if(HWR_REGION_NUMBER>2)
{
#ifdef __WIN32__
tHWR_Region[2].left = 20;
tHWR_Region[2].top = 170;
tHWR_Region[2].right = 140;
tHWR_Region[2].bottom = 230;
#else
tHWR_Region[2].left = 20;
tHWR_Region[2].top = 172;
tHWR_Region[2].right = 140;
tHWR_Region[2].bottom = 233;
#endif
}
guiHWR_Begin(handle,tHWR_Region);
return;
}
/*********************************************************************/
//dest: 手写键盘结束
//para: void
//return:void
/*********************************************************************/
void guiSwKbd_endHand( HNDL handle )
{
guiHWR_End();
return;
}
void guiSwKbd_showHand(HNDL handle,int region,WORD *buffer)
{
TGuiSw_Kbd *pControl;
int iWordNum;
short sendCode;
// if( (region != 0) && (region != 1) ) // 参数错误
// return;
if( (region != 0) && (region != 1) && (region != 2)) // 参数错误
return;
guiEnterWCS();
pControl=(TGuiSw_Kbd *)handle;
guiPushFont(pControl->base.font) ;
iWordNum=HAND_W/(guiGetWordWidth()+1); // 可显示的候选字数
guiPopFont();
if(region == 2) // 手写识别区3
{
if(*buffer)
{ // 有识别结果
//pControl->HWR_Buf3_Num=(*buffer>iWordNum?iWordNum:*buffer);
buffer++;
//strncpy(pControl->HWR_Buf3,(char *)buffer,pControl->HWR_Buf2_Num*2);
//pControl->HWR_Buf3[pControl->HWR_Buf3_Num*2]='\0';
sendCode=*buffer;
//sendCode = 0xb2a3; //"2"
guiKbd_SendMsg(handle,sendCode,INPUT_MODE_ADD);
guiClearBlock(handle, HAND_X, 1, HAND_X+HAND_W-1, 14, GUI_WHITE, 0);
guiClearBlock(handle, HAND_X+HAND_W+1, 1, HAND_X+HAND_W*2, 14, GUI_WHITE, 0);
pControl->HWR_Buf1[0]='\0';
pControl->HWR_Buf2[0]='\0';
pControl->HWR_Buf1_Num=0;
pControl->HWR_Buf2_Num=0;
pControl->First_Stroke1=-1;
pControl->First_Stroke2=-1;
}
}
else if(region == 0)
{ // 手写识别区1
if(*buffer)
{ // 有识别结果
pControl->HWR_Buf1_Num=(*buffer>iWordNum?iWordNum:*buffer);
buffer++;
strncpy(pControl->HWR_Buf1,(char *)buffer,pControl->HWR_Buf1_Num*2);
pControl->HWR_Buf1[pControl->HWR_Buf1_Num*2]='\0';
sendCode=*buffer;
guiKbd_SendMsg(handle,sendCode,INPUT_MODE_ADD); // 在光标位置增加一个字符
guiClearBlock(handle, HAND_X, 1, HAND_X+HAND_W-1, 14, GUI_WHITE, 0);
guiShowString(handle,pControl->HWR_Buf1,HAND_X+1,2,GUI_BLACK,0); // 显示候选字
pControl->First_Stroke1=1;
if(pControl->First_Stroke2 == 1)
pControl->First_Stroke2=2;
else
{
guiClearBlock(handle, HAND_X+HAND_W+1, 1, HAND_X+HAND_W*2, 14, GUI_WHITE, 0);
pControl->HWR_Buf2[0]='\0';
pControl->HWR_Buf2_Num=0;
pControl->First_Stroke2=-1;
}
}
else // 无识别结果
{
guiClearBlock(handle, HAND_X, 1, HAND_X+HAND_W-1, 14, GUI_WHITE, 0);
guiShowString(handle,RES_STR_NOFOUNDWORD[gLanguage],HAND_X+1,2,GUI_BLACK,0); // 显示候选字 // "无此字"
pControl->HWR_Buf1[0]='\0';
pControl->HWR_Buf1_Num=0;
pControl->First_Stroke1=-1;
if(pControl->First_Stroke2 != 1)
{
guiClearBlock(handle, HAND_X+HAND_W+1, 1, HAND_X+HAND_W*2, 14, GUI_WHITE, 0);
pControl->HWR_Buf2[0]='\0';
pControl->HWR_Buf2_Num=0;
pControl->First_Stroke2=-1;
}
}
}
else // 手写识别区2
{
if(*buffer)
{ // 有识别结果
pControl->HWR_Buf2_Num=(*buffer>iWordNum?iWordNum:*buffer);
buffer++;
strncpy(pControl->HWR_Buf2,(char *)buffer,pControl->HWR_Buf2_Num*2);
pControl->HWR_Buf2[pControl->HWR_Buf2_Num*2]='\0';
sendCode=*buffer;
guiKbd_SendMsg(handle,sendCode,INPUT_MODE_ADD);
guiClearBlock(handle, HAND_X+HAND_W+1, 1, HAND_X+HAND_W*2, 14, GUI_WHITE, 0);
guiShowString(handle,pControl->HWR_Buf2,HAND_X+HAND_W+2,2,GUI_BLACK,0);
pControl->First_Stroke2=1;
if(pControl->First_Stroke1 == 1)
pControl->First_Stroke1=2;
else
{
guiClearBlock(handle, HAND_X, 1, HAND_X+HAND_W-1, 14, GUI_WHITE, 0);
pControl->HWR_Buf1[0]='\0';
pControl->HWR_Buf1_Num=0;
pControl->First_Stroke1=-1;
}
}
else // 无识别结果
{
guiClearBlock(handle, HAND_X+HAND_W+1, 1, HAND_X+HAND_W*2, 14, GUI_WHITE, 0);
guiShowString(handle,RES_STR_NOFOUNDWORD[gLanguage],HAND_X+HAND_W+2,2,GUI_BLACK,0);
pControl->HWR_Buf2[0]='\0';
pControl->HWR_Buf2_Num=0;
pControl->First_Stroke2=-1;
if(pControl->First_Stroke1 != 1)
{
guiClearBlock(handle, HAND_X, 1, HAND_X+HAND_W-1, 14, GUI_WHITE, 0);
pControl->HWR_Buf1[0]='\0';
pControl->HWR_Buf1_Num=0;
pControl->First_Stroke1=-1;
}
}
}
guiPenSound();
guiExitWCS();
}
/*********************************************************************/
//para: sw_kbd handle ,pen message and it's coordinate
//dest: process hand type sw_kbd when the pen stroke it
//return:void
/*********************************************************************/
void guiSwKbd_actionHand(HNDL handle, WORD message, WORD x, WORD y)
{
TGuiSw_Kbd *pControl;
WORD code;
int result;
int iWordWidth,iSelPos,iWordNum;
short sendCode;
short langType;
langType = guiQueryLanguageType();
guiEnterWCS();
pControl=(TGuiSw_Kbd *)handle;
if(message==KBD_RESET)
{
guiClearBlock(handle, HAND_X, 1, HAND_X+HAND_W-1, 14, GUI_WHITE, 0);
guiClearBlock(handle, HAND_X+HAND_W+1, 1, HAND_X+HAND_W*2, 14, GUI_WHITE, 0);
pControl->HWR_Buf1[0]='\0';
pControl->HWR_Buf2[0]='\0';
pControl->HWR_Buf3[0]='\0';
pControl->HWR_Buf1_Num=0;
pControl->HWR_Buf2_Num=0;
pControl->HWR_Buf3_Num=0;
pControl->First_Stroke1=-1;
pControl->First_Stroke2=-1;
pControl->First_Stroke3=-1;
guiSwKbd_startHand( handle );
guiExitWCS();
return;
}
//转换成相对于控件的坐标
x -= pControl->base.left;
y -= pControl->base.top;
result=guiSwKbd_SearchPos(KBDCOOR_HAND,x, y); // 搜索笔点位置
if(result == -1)
{
_guiKbd_Hand_Release(handle);
guiExitWCS();
return;
}
guiPushFont(pControl->base.font) ;
iWordWidth=guiGetWordWidth();
guiPopFont();
code=KBDCOOR_HAND[result].code;
switch(message)
{
case PENUP:
_guiKbd_Hand_Release(handle); // 取消原选中位置
switch(code)
{
case KEY_ENGLISH: // 切换到英文键盘
guiSwKbd_SwitchClass(handle,KBDCLASS_ENGLISH);
guiPenSound();
break;
case KEY_CHINESE: // 切换到中文键盘
//guiSwKbd_SwitchClass(handle,KBDCLASS_CHINESE);
if(langType==LANGUAGE_CHT)
guiSwKbd_SwitchClass(handle,KBDCLASS_CHT);
else
guiSwKbd_SwitchClass(handle,KBDCLASS_CHINESE);
guiPenSound();
break;
case KEY_SYMBOL: // 切换到符号键盘
guiSwKbd_SwitchClass(handle,KBDCLASS_SYMBOL);
guiPenSound();
break;
case KEY_HAND: // 切换到下一个手写键盘
guiSwKbd_SwitchToNextInType(handle);
guiPenSound();
break;
case KEY_CANDIDATE: // 选中候选字区1
iSelPos=(x-HAND_X)/(iWordWidth+1); // 选中第几个候选字
if(iSelPos >= pControl->HWR_Buf1_Num)
break;
sendCode=((short *)pControl->HWR_Buf1)[iSelPos]; // 选中的候选字
if(pControl->First_Stroke1 == 1) // 用选中的字替换光标前第一个字符
guiKbd_SendMsg(handle,sendCode,INPUT_MODE_REPLACE_1);
else if(pControl->First_Stroke1 == 2) // 用选中的字替换光标前第二个字符
guiKbd_SendMsg(handle,sendCode,INPUT_MODE_REPLACE_2);
guiPenSound();
break;
case KEY_CANDIDATE2: // 选中候选字区2
iSelPos=(x-HAND_X-HAND_W-1)/(iWordWidth+1); // 选中第几个候选字
if(iSelPos >= pControl->HWR_Buf2_Num)
break;
sendCode=((short *)pControl->HWR_Buf2)[iSelPos]; // 选中的候选字
if(pControl->First_Stroke2 == 1)
guiKbd_SendMsg(handle,sendCode,INPUT_MODE_REPLACE_1); // 将选中的字送到系统
else if(pControl->First_Stroke2 == 2)
guiKbd_SendMsg(handle,sendCode,INPUT_MODE_REPLACE_2); // 将选中的字送到系统
guiPenSound();
break;
case KEY_HANDREGION:
break;
default:
guiKbd_SendMsg(handle,code,INPUT_MODE_ADD);
guiClearBlock(handle, HAND_X, 1, HAND_X+HAND_W-1, 14, GUI_WHITE, 0);
guiClearBlock(handle, HAND_X+HAND_W+1, 1, HAND_X+HAND_W*2, 14, GUI_WHITE, 0);
pControl->HWR_Buf1[0]='\0';
pControl->HWR_Buf2[0]='\0';
pControl->HWR_Buf1_Num=0;
pControl->HWR_Buf2_Num=0;
pControl->First_Stroke1=-1;
pControl->First_Stroke2=-1;
guiPenSound();
break;
}
break;
case PENMOVE:
if(pControl->SelPos == result)
break;
case PENREENTER:
case PENDOWN:
_guiKbd_Hand_Release(handle); // 取消原选中位置
switch(code)
{
case KEY_CANDIDATE:
case KEY_CANDIDATE2:
case KEY_HANDREGION:
break;
default:
KBD_HAND_INVERT(handle,result);
break;
}
pControl->SelPos=result;
break;
case PENREMOVE:
_guiKbd_Hand_Release(handle); // 取消原选中位置
break;
}
guiExitWCS();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -