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

📄 afce_zi.c

📁 用于嵌入式系统的输入法程序 里面有完整的系统实现原码
💻 C
📖 第 1 页 / 共 5 页
字号:
        agshLoadParameter(AG_PINYIN_DATA,chiContext_p->currentPyBsh,AGHO_UPDATE_DATA);
        
        
        if (chiContext_p->imeState == IME_STATE_SE_INPUT)
        {
            
            agdmDisplayPopup(AG_HANZI_SENGLISH_INPUT_TEMPLATE);
            /*画竖线*/
        	abs.x  = 0,
	        abs.y  = 122,
	        abs2.x = 0,
	        abs2.y = 141;     
	        gddiDrawLine(&abs, &abs2);
	         /*将选中的SE反显*/
             /*得到反显区域之前有几个英文单词*/
	        blankcount =
	           chiContext_p->currentPyOrSEGroupInfo.currentPosInLib-chiContext_p->currentPyOrSEGroupInfo.firstPosInLib;
	        xInvertPos = 2; /*反显区的X坐标初试值*/
	        i=0;
	        while (blankcount>0)/*计算反显区的开始点*/
	        {
	         
	            if	(chiContext_p->currentPyBsh[i]==0x20)
	                blankcount--;
                xInvertPos += GetGlyphWidth(chiContext_p->currentPyBsh[i])+1;/*加1是考虑字间距*/
	            i++;
  	        }
  	        /*计算反显区的长度*/
  	        clipRect.topLeft.x = xInvertPos;
            clipRect.topLeft.y = 124;
	        for (xInvertPos=2;chiContext_p->currentPyBsh[i]!=0x20;i++)
	        {
	            xInvertPos += GetGlyphWidth(chiContext_p->currentPyBsh[i])+1;
	        }
        
            xInvertPos += GetGlyphWidth(0x20); /*选中的单词的长度*/
	     
            clipRect.width     = xInvertPos-1;
            clipRect.height    = 15;
            /*反显*/
            gddiSetClippingRect(&clipRect);
            gddiInvert(TRUE);
            gddiSetClippingRect(NULL);
        }
        
        else
        {   
            /*显示候选汉字*/
            agshLoadParameter(AG_HANZI_DATA,
                              chiContext_p->currentHzGroupInfo.currentSelHz,
                              AGHO_UPDATE_DATA);
            
            
            if (chiContext_p->imeState == IME_STATE_ASSOCIATION_SELECT)
            {
            	agdmDisplayPopup(AG_HANZI_ASSOCIATION_INPUT_TEMPLATE);
            }           
            else if (chiContext_p->imeState == IME_STATE_BISHUN_INPUT)
            {
            	agdmDisplayPopup(AG_BH_INPUT_TEMPLATE);
            }
            else
            {
            	if (chiContext_p->imeState == IME_STATE_PY_HZ_SELECT)
            	{
            		agshLoadParameter(AG_ARROW_HOLE,PNULL,AGHO_UPDATE_DATA);
            	}
            	/*拼音或者汉字选择状态*/
                agdmDisplayPopup(AG_CE_INPUT_TEMPLATE);
            }
            /*划横线*/        
	        abs.x  = 1,
	        abs.y  = 121,
	        abs2.x = 128,
	        abs2.y = 121;     
	        gddiDrawLine(&abs, &abs2);
             
            /*画竖线*/
            abs.x  = 0,
	        abs.y  = 102,
	        abs2.x = 0,
	        abs2.y = 143;     
	        gddiDrawLine(&abs, &abs2);
	        
            /* 反显候选拼音区域*/	    
	        if (chiContext_p->imeState == IME_STATE_PY_INPUT)
            {
                /*得到反显区域的长度和大小*/
                blankcount = 
                   chiContext_p->currentPyOrSEGroupInfo.currentPosInLib-chiContext_p->currentPyOrSEGroupInfo.firstPosInLib;
                xInvertPos = 2;
                i=0;
                while (blankcount>0)
                {
                
                    if	(chiContext_p->currentPyBsh[i]==0x20)
                        blankcount--;
                    xInvertPos += GetGlyphWidth(chiContext_p->currentPyBsh[i])+1;/*加1是考虑字间距*/
                    i++;
                
                }
  	            clipRect.topLeft.x = xInvertPos;
                clipRect.topLeft.y = 104;
              
	            for (xInvertPos = 2;chiContext_p->currentPyBsh[i] != 0x20;i++)
	     	        xInvertPos += GetGlyphWidth(chiContext_p->currentPyBsh[i])+1;
                xInvertPos += GetGlyphWidth(0x20);
	    	  
                clipRect.width     = xInvertPos;
                clipRect.height    = 15;
                gddiSetClippingRect(&clipRect);
                gddiInvert(TRUE);
                gddiSetClippingRect(NULL);
            }
        
            else
         	{
                
                /* 反显候选汉字区域,汉字比较简单,宽度是固定的*/
                /*应该将箭头提示去掉*/
                agshLoadParameter(AG_HANZI_DATA,PNULL,AGHO_UPDATE_DATA);
                agshLoadParameter(AG_ARROW_HOLE,PNULL,AGHO_UPDATE_DATA);
                blankcount = 
                   chiContext_p->currentHzGroupInfo.currentHzIndex-chiContext_p->currentHzGroupInfo.beginHzInLib;
                clipRect.topLeft.x = 2 + blankcount*15;
                clipRect.topLeft.y = 123;
	            clipRect.width     = 15;
                clipRect.height    = 17;
                gddiSetClippingRect(&clipRect);
                gddiInvert(TRUE);
                gddiSetClippingRect(NULL);   
         	}
        }	    
        /* Update the display */
       
        agshLoadElement(AG_CHINESE_INPUT_EVENTS);
        
    }
        /* AFCE_ZI004肯定要刷新屏幕,为了防止快速按键的时候updateFlag可以发生错误,所以这里相当于强制刷新*/
    while ((refreshFlag=agdmGetUpdateFlag())!=0 )
    {
        agdmSetDoUpdate (TRUE);
    }
    chiContext_p->updateCompleted = TRUE;
}


/***************************************************************************
 * 所有按键的处理函数
 ***************************************************************************/
static void
afImeEvents ( chiEditContext   *chiContext_p, SignalBuffer  *signalBuffer_p)
{
    AgshEventInd      *eventInd_p;    
    //Int8               hzIndex;
    //Int8               maxIndex;  
    Boolean            bDoBeep = TRUE;
    L1AmTone           keyTone = L1AM_MMI_VALID;  
    Boolean            keyValid;
    Int8		       i;
    //Int8               tempIndex;
    
    eventInd_p = &signalBuffer_p->sig->agshEventInd;
    
  /* 输入的是数字键 */
    if (AG_EVENT_IS_CHAR_CODE(eventInd_p->event) == TRUE && (AG_EVENT_IS_NUM_CODE(eventInd_p->event)==TRUE))
    {
        /*输入事件,调用输入的函数*/
        keyValid = afImeInputEvents(chiContext_p,eventInd_p);
    }
    else /* 输入的不是数字键 */               
    {           
        if(eventInd_p->isCommitted ==FALSE)
        {          
	        bDoBeep = FALSE;     /*commit只处理一个TRUE就行了*/
        }    
        else  /*isCommitted = TRUE*/
        {  /* Now do other event processing */
            
            if (eventInd_p->event == AG_CLEAR_EVENT||eventInd_p->event == AG_ERASE_LINE_EVENT)
            {       
                    keyValid = afImeClearEvent(chiContext_p,signalBuffer_p);
                    /*清除以后,无效按键组合重新启动*//* AFCE_ZI004*/
                    if (keyValid == TRUE)
                    {
                    	for (i=0; i<10; i++)
    	                {
                            chiContext_p->invalidSEkeyTable[i] = 0;
                        }
                    }
            }
           
            else
            {
                    /*假如没有刷新完屏幕,就不再处理以下的按键信号,防止刷新屏幕慢的问题*/
                if (chiContext_p->updateCompleted!=TRUE)
                {                         
    	            return;
                }
                switch (eventInd_p->event)
                {  
                  case AG_SELECT_EVENT:  /*press "OK", here take it as "select"*/
                  /*选择以后,无效按键组合重新启动*//* AFCE_ZI004*/
                      for (i=0; i<10; i++)
    	              {
                          chiContext_p->invalidSEkeyTable[i] = 0;
                      }
                      keyValid = afImeSelectEvent(chiContext_p,signalBuffer_p);
                      break; 
           
                case  AG_SCROLL_UP_EVENT:
                    keyValid = afImeScrollUpEvent(chiContext_p,signalBuffer_p);
                    break;
                    
                 case AG_SCROLL_DOWN_EVENT:
                    keyValid = afImeScrollDownEvent(chiContext_p,signalBuffer_p);                    
                    break;
	               			 
                case  AG_SCROLL_LEFT_EVENT:
                    keyValid = afImeScrollLeftEvent(chiContext_p,signalBuffer_p);
                    break; 
                
                case  AG_SCROLL_RIGHT_EVENT: 
                    keyValid = afImeScrollRightEvent(chiContext_p,signalBuffer_p);
                    break;
                
                  /*按了这几个键,退出输入法,并且将keyEvent返回给EDITOR处理*/
                case AG_OK_EVENT:     
                case AG_QUIT_EVENT: 
                case AG_SIGN_INPUT_EVENT:
                case AG_HASH_EVENT:
                    hzExitDataBody.handlerIsUnloaded = TRUE;
                    hzExitDataBody.inputChineseFlag = TRUE;
                   /*afglSendHandlerExitSig(chiContext_p->myHandlerId,
                                   chiContext_p->parentHandlerId,
                                   sizeof(AfHzExitDataBody),
                                   &hzExitDataBody);      */
                    afshUnloadHandler(chiContext_p->myHandlerId);
       	            afshSignalHandledFlagSet (FALSE);  
                    break;
                  
                  
                  
                 default:
                     keyValid = FALSE;		
                     break;
            }        /* end switch */
        }
    }
    }
    /*记录KEYVALID决定是否刷新*/
    chiContext_p->keyValid = keyValid;
     
    /* AFCE_ZI004*/
    if (chiContext_p->keyValid == TRUE)
    {
    chiContext_p->updateCompleted=FALSE;
    afshRedisplayFlagSet ();
    }
    else
    {
    	chiContext_p->updateCompleted=TRUE;         
    }
    

    /*afChineseInputRefresh (chiContext_p);*/
    if(keyValid == FALSE)
    {
        #if defined (UPGRADE_AUDIO_MANAGER)
            keyTone = L1AM_MMI_INVALID;
	    #else
	        eventResp = AG_EVENT_INVALID;
	    #endif
	} 

    if (bDoBeep)
    {
        #if defined (UPGRADE_AUDIO_MANAGER)
            agauPlayTone(keyTone);
	    #else
	        agshLoadElement(AG_EVENT_INVALID);
        #endif
    }
}

/*输入事件的处理,也就是按了数字键*/
static Boolean  afImeInputEvents      ( chiEditContext   *chiContext_p,
                                        AgshEventInd      *eventInd_p)
{
    Boolean keyValid = TRUE;
    Int8 i;
    
     /*如果这个按键已经在无效按键库里,就不要在费时去库里取值了*/
    if (chiContext_p->inputSerial >= 1)
    {
        for (i=0; i<10; i++)
        {
        	if (chiContext_p->invalidSEkeyTable[i] == eventInd_p->event)  
        	{
        		keyValid = FALSE;
        		return keyValid;
        	}
        }	
    }
    
    /*如果处于联想状态,而且必须是有效的数字键,才重新进入输入函数,重新初始化,并重设状态*/
    if (chiContext_p->imeState == IME_STATE_ASSOCIATION_SELECT||
        chiContext_p->imeState == IME_STATE_PY_HZ_SELECT)
    {
    	    
    	    
    	    //afInitContext(chiContext_p);
            //chiContext_p->inputValue[0] = (AgCharCode)eventInd_p->event;
            //chiContext_p->inputSerial=1;             
             
            for (i=0; i<10; i++)
    	    {
                 chiContext_p->invalidSEkeyTable[i] = 0;
            }
            

⌨️ 快捷键说明

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