⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uikbd_hand.c

📁 嵌入工linux开发的源码
💻 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 + -