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

📄 uikbd_zy.c

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