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

📄 uikbd_cj.c

📁 嵌入工linux开发的源码
💻 C
字号:
#include <uiWnd.h>
#include <uiSw_Kbd.h>
#include <uiKbd_CJ.h>
#include <uiKbd_CJ.res>
#include <uiIme_CJ.h>
#include <uiIcon_Img.h>
#include <uiSound.h>

#define KBD_CJ_INVERT(handle,i)\
	guiInvertRect(handle, KBDCOOR_CJ[i].left+1,KBDCOOR_CJ[i].top+1,\
					KBDCOOR_CJ[i].right-1,KBDCOOR_CJ[i].bottom-1);	

unsigned short gpBig5Code[MAX_CJ_REPEAT_COUNT];
/*********************************************************************/
//dest: 恢复一个已按下的按键到正常显示状态
//para: 
//	handle:	键盘控件的handle值
//  num:	候选字区中可显示的候选字个数
//return:void
/*********************************************************************/
void _guiKbd_CJ_Release(HNDL handle,int num)
{
	TGuiSw_Kbd *pControl;

	pControl=(TGuiSw_Kbd *)handle;
	if(pControl->SelPos < 0)		// 是否有选中位置
		return;

	switch(KBDCOOR_CJ[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_CJ_INVERT(handle,pControl->SelPos);			// 反显选中的按键
		break;
	}
	pControl->SelPos = -1;
}

/*********************************************************************/
//dest: 拼音键盘开始
//para: void
//return:void
/*********************************************************************/
void guiSwKbd_startCJ( HNDL handle )
{
	return;
}

/*********************************************************************/
//dest: 拼音键盘结束
//para: void
//return:void
/*********************************************************************/
void guiSwKbd_endCJ( HNDL handle )
{
	return;
}

/*********************************************************************/
//dest: 拼音键盘对笔点消息的响应
//para: 
//	handle:	键盘控件的handle值
//	message:笔点消息类型
//	x,y:	笔点位置座标
//return:void
/*********************************************************************/
void guiSwKbd_actionCJ(HNDL handle, WORD message, WORD x, WORD y)
{		
	TGuiSw_Kbd *pControl;
	WORD    code, bigWord;
	int		result,len;
	int     iTotalNum,iSelPos,iWordWidth;
	DWORD   Offset;
	WORD    toReadCount,ReadCount;
	//WORD    wText[20];                          
	//unsigned short gpBig5Code[MAX_CJ_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_CJ,x, y);	// 搜索笔点位置
	if(result == -1)		// 是否点在有效区域内
	{
		_guiKbd_CJ_Release(handle,toReadCount);	// 取消原选中位置
		guiPopFont();
		guiExitWCS();
		return;
	}

	code=KBDCOOR_CJ[result].code;		// 被选中位置的代码
	switch(message)
	{
	case PENUP:
		_guiKbd_CJ_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_MAKEWORD);
			guiPenSound();
			break;

		case KEY_CANDIDATE:						// 选中候选字区
			iSelPos=(x-WC_START)/(iWordWidth+1);	// 选中第几个候选字
			if(pControl->StartPos+iSelPos<pControl->TotalNum)	// 该位置是否有字
			{
				//guiGetCandidate_cj(pControl->Offset,pControl->TotalNum,pControl->StartPos+iSelPos,1,wText);
				//guiKbd_SendMsg(handle,wText[0],INPUT_MODE_ADD);	// 将选中的字送到系统
/*
#ifdef __WIN32__
				bigWord = gpBig5Code[iSelPos];
#else
				bigWord = SwapWord(gpBig5Code[iSelPos]);
#endif
*/                                            
				bigWord = gpBig5Code[iSelPos];
				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_cj(pControl->Offset,pControl->TotalNum,pControl->StartPos,toReadCount,wText);
				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_cj(pControl->Offset,pControl->TotalNum,pControl->StartPos,toReadCount,wText);
				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 CJ_KEY_BACKSPACE:
			guiClearBlock(handle,1,1,158,WH_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;
				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					// 编码大于一个字符
			{   
				unsigned short etymonStr[6];

				pControl->InputStr[len-1]='\0';		// 删除最后一个字符
				//guiShowString(handle,pControl->InputStr,2,2,GUI_BLACK,0);	// 显示新的编码
				ConvertNumberToCode(pControl->InputStr, etymonStr);
				guiShowString(handle, (char *)etymonStr, 2, 2, GUI_BLACK, 0);	// 显示编码

				//iTotalNum=guiIme_cj(pControl->InputStr, &Offset);	// 取候选字开始位置和总数
                iTotalNum=guiIme_cj(pControl->InputStr, gpBig5Code);	// 取候选字开始位置和总数

				pControl->Offset=Offset;
				pControl->StartPos=0;
				pControl->TotalNum=iTotalNum;
				//ReadCount=guiGetCandidate_cj(Offset,iTotalNum,0,toReadCount,wText);	// 取候选字
				//wText[ReadCount]=0;
				//guiShowString(handle,(char *)wText,WC_START+1,2,GUI_BLACK,0);		//显示候选字
                guiShowString(handle,(char *)gpBig5Code,WC_START+1,2,GUI_BLACK,0);	//显示候选字
				/*
				if((pControl->StartPos + toReadCount) < pControl->TotalNum)	// 后面是否还有候选字
					guiPutImage(handle,WR_START,WH_START-13,WR_START+7,WH_START-2,icon_Gui_RightArrow8X12_UP);
				*/
			}
			pControl->First_Stroke1=-1;	// 设置没有选择过候选字标志
			guiPenSound();
			break;
		case KEY_IMECODE:
			break;
		default:
			//if(code >= 'a' && code <= 'z')	// 输入编码
			if(KeyIsCJCode(code))
			{
				if(pControl->First_Stroke1 == 1)	// 已选择过汉字时
				{
					guiClearBlock(handle,1,1,158,WH_START-1,GUI_WHITE,0);
					strcpy(pControl->InputStr,"");	// 复位相关参数
					pControl->Offset=0;
					pControl->StartPos=0;
					pControl->TotalNum=0;
					pControl->First_Stroke1 = -1;
				}                   

				len=strlen(pControl->InputStr);
				//if(len < MAX_INPUT_STR_NUM)		// 编码是否已达最大长度 
				pControl->InputStr[len]=(char)code;
				pControl->InputStr[len+1]=0;

				if(len < MAX_CJ_CODE_LEN)
				{
					//pControl->InputStr[len]=(char)code;
					//pControl->InputStr[len+1]=0;
					//iTotalNum=guiIme_cj(pControl->InputStr, &Offset);	// 取候选字开始位置和总数
					iTotalNum=guiIme_cj(pControl->InputStr, gpBig5Code);
					if(iTotalNum > 0)	// 该编码是否存在
					{               
						unsigned short etymonStr[6];

						guiClearBlock(handle,1,1,158,WH_START-1,GUI_WHITE,0);
						
						//guiShowString(handle,pControl->InputStr,2,2,GUI_BLACK,0);	// 显示编码
                        ConvertNumberToCode(pControl->InputStr, etymonStr);
						guiShowString(handle, (char *)etymonStr, 2, 2, GUI_BLACK, 0);	// 显示编码

						pControl->Offset=Offset;
						pControl->StartPos=0;
						pControl->TotalNum=iTotalNum;
						//ReadCount=guiGetCandidate_cj(Offset,iTotalNum,0,toReadCount,wText);	// 取候选字
						//wText[ReadCount]=0;
						//guiShowString(handle,(char *)wText,WC_START+1,2,GUI_BLACK,0);		// 显示候选字
                          
						guiShowString(handle,(char *)gpBig5Code,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==CJ_KEY_DELETE)
					code = KEY_DELETE;
				
				if(code==CJ_KEY_ENTER)
					code = KEY_ENTER;

				strcpy(pControl->InputStr,"");	// 复位相关参数
				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_CJ_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_CJ_INVERT(handle,result);			// 反显选中的按键
			break;
		}
		pControl->SelPos=result;
		break;
	case PENREMOVE:
		_guiKbd_CJ_Release(handle,toReadCount);	// 取消原选中位置
		break;
	}
	guiPopFont();
	guiExitWCS();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -