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

📄 imecomm.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Kernel.h"
#include "ImeIn.h"

/*************************************************************************/
/* FUNCTION:   _ImDichSearch											 */
/* DESCRIPTION:根据输入内容查找输出内容的索引							 */
/* INPUTS:     startNum,开始序号								         */
/*			    endNum,结束的序号										 */
/*			    searchFunc,比较函数										 */
/* OUTPUTS:    NONE													 */
/* RETURN:     NONE													 */
/*************************************************************************/
/*  NAME           DATE               REMARKS                            */
/* ==========  ============   ===========================================*/
/*  Qorse		2003-03-25     创建初始版本                              */
/*************************************************************************/
FOR_IME_ALL
INT _ImDichSearch(UINT startNum, UINT endNum, INT (*searchFunc)(UINT))
{
    UINT middleNum;
    BOOL find;
    INT  sign;
    
    find = FALSE;
    if (startNum > endNum)
    {
        return FALSE;
    }
    while ((startNum <= endNum) && (!find))
    {
        middleNum = (startNum + endNum) / 2;
        sign = searchFunc(middleNum);
        if (sign == 0)
        {
            find = TRUE;
        }
        else if (sign < 0)
        {
            endNum = middleNum - 1;
        }
        else
        {
            startNum = middleNum + 1;
        }
    }	
    if (find)
    {
        return middleNum;
    }
    else
    {
        return -1;
    }
}

/*************************************************************************/
/* FUNCTION:   __IMEGetChar											 */
/* DESCRIPTION:将未处理按键以字符输出									 */
/* INPUTS:     pEvent,按键消息											 */
/* OUTPUTS:    pEvent													 */
/* RETURN:     NONE													 */
/*************************************************************************/
/*  NAME           DATE               REMARKS                            */
/* ==========  ============   ===========================================*/
/*  Qorse		2003-04-04     创建初始版本                              */
/*************************************************************************/
FOR_IME_ALL
VOID __IMEGetChar(UINT *pEvent, UINT *pParam)
{
    UINT16 wMsgX;
    
    wMsgX = (UINT16)(*pParam);
    if (*pEvent == EVENT_KEY)
    {
        if (wMsgX >= 0x20 && wMsgX <= 0x7e)
        {
            *pEvent = EVENT_CHAR;
        }
    }
}

VOID __ImeConvertCase(UINT *pEvent, UINT *pParam)
{
    UINT16 wMsgX;
    
    wMsgX = (UINT16)(*pParam);
    if (*pEvent == EVENT_CHAR)
    {
        if ((wMsgX >= 'A') && (wMsgX <= 'Z'))
        {
            *pParam = wMsgX + 0x20;
        }
    }
}

/*************************************************************************/
/* FUNCTION:   _imOutputData											 */
/* DESCRIPTION:输出数据												 */
/* INPUTS:     index,用户选择的字符的相对编号	                         */
/*			    getedzi,输出字符										 */
/*			    pEvent,变更消息											 */
/* OUTPUTS:    pEvent													 */
/* RETURN:     NONE													 */
/*************************************************************************/
/*  NAME           DATE               REMARKS                            */
/* ==========  ============   ===========================================*/
/*  Qorse		2003-03-25     创建初始版本                              */
/*************************************************************************/
FOR_IME_ALL
BOOL _imOutputData(UINT16 index, UINT16 *getedzi, UINT *pEvent)
{
    UINT16  wIndex;
    UINT8   *pCodeSource;
    
    if (index)
    {
        index --;
    }
    else
    {
        index = 9;
    }
    if (g_pIMECandiPos + index >= g_pIMEWordNum)    //无法再翻页
    {
        return FALSE;
    }
    
    wIndex = g_pIMECandiPos + index;				//下一页的索引
    pCodeSource = g_pIMEDataAddr + wIndex * 2;		//下一页的数据
    g_pIMEOutWordBuf[0] = pCodeSource[0];
    g_pIMEOutWordBuf[1] = pCodeSource[1];
    g_pIMEOutWordBuf[2] = 0;
	
    WRITE_WORD(getedzi, MAKEWORD(pCodeSource[1], pCodeSource[0]));			
	MsgPost((APGUI_STRUCT_MODEL* )NULL, EVENT_IMESTR,  (UINT)g_pIMEOutWordBuf);
	*pEvent = EVENT_NOTHING;	
    return TRUE;
}

/*************************************************************************/
/* FUNCTION:   _ImGetAssociation										 */
/* DESCRIPTION:根据输入内容获取联想字									 */
/* INPUTS:     code,字符内码											 */
/* OUTPUTS:    NONE													 */
/* RETURN:     TRUE:找到联想字											 */
/*************************************************************************/
/*  NAME           DATE               REMARKS                            */
/* ==========  ============   ===========================================*/
/*  Qorse		2003-03-25     创建初始版本                              */
/*************************************************************************/
FOR_IME_ALL
BOOL _ImGetAssociation(UINT16 code) //取联想字
{
    UINT16  charIdx;
    UINT8   *addr;
    UINT32  imAssStart, imAssEnd;
    IMEGUI_STRUCT *pApGui;
		
    pApGui = (IMEGUI_STRUCT *)GetApHandle();
    if (pApGui == NULL)
    {
        return FALSE;
    }
    if (pApGui->wImeOption & IME_OPTION_NOASSOC)
    {
        return FALSE;
    }
    g_pIMEAssocNum = 0;
    if ((HIBYTE(code) < 0xB0) || (HIBYTE(code) > 0xF7)
        || (LOBYTE(code) < 0xA1))
    {
        return FALSE;
    }
    charIdx = HIBYTE(code);
    charIdx -= 0xb0;
    charIdx *= 94;
    charIdx += LOBYTE(code);
    charIdx -= 0xa1;
    addr = (UINT8*)(LX_ADDRESS + charIdx * 3);
    imAssStart = 0;
    imAssEnd = 0;
    memmove(&imAssStart, addr, 3);
    memmove(&imAssEnd, addr + 3, 3);
    if (imAssStart == imAssEnd)
    {
        return FALSE;
    }
    g_pIMEWordNum = (UINT16)(imAssEnd - imAssStart) / 2;
    g_pIMEDataAddr = (UINT8*)(LX_ADDRESS + imAssStart);
    g_pIMECandiPos = 0;
    g_pIMEWordTypeNum = HZ_PER_PAGE;
    
    return TRUE;
}

/*************************************************************************/
/* FUNCTION:   _imLeftRight											 */
/* DESCRIPTION:翻动候选字												 */
/* INPUTS:     pEvent,按键消息											 */
/* OUTPUTS:    pEvent													 */
/* RETURN:     TRUE:有效操作											 */
/*************************************************************************/
/*  NAME           DATE               REMARKS                            */
/* ==========  ============   ===========================================*/
/*  Qorse		2003-03-25     创建初始版本                              */
/*************************************************************************/
FOR_IME_ALL
BOOL _imLeftRight(UINT *pEvent, UINT *pParam)
{
    if (*pParam == MVK_LEFT)
    {
        if (g_pIMECandiPos >= g_pIMEWordTypeNum)
        {
            g_pIMECandiPos -= g_pIMEWordTypeNum;
            return TRUE;
        }
    }
    else
    {
        if (g_pIMECandiPos + g_pIMEWordTypeNum < g_pIMEWordNum)
        {
            g_pIMECandiPos += g_pIMEWordTypeNum;
            return TRUE;
        }
    }
    
    return FALSE;
}

/*************************************************************************/
/* FUNCTION:   _IMEGetSelectWord										 */
/* DESCRIPTION:处理用户选择了备选字									 */
/* INPUTS:     pEvent,消息结构											 */
/* OUTPUTS:    pEvent													 */
/* RETURN:     TRUE:有效选择											 */
/*************************************************************************/
/*  NAME           DATE               REMARKS                            */
/* ==========  ============   ===========================================*/
/*  Qorse		2003-04-04     创建初始版本                              */
/*************************************************************************/
FOR_IME_ALL
BOOL _IMEGetSelectWord(UINT *pEvent, UINT *pParam)  //用户选择了输出
{
    UINT16 getedzi;

    //获得新字符
    if (_imOutputData((UINT16)(*pParam - '0'), &getedzi, pEvent))
    {
        if (_ImGetAssociation(getedzi))
            g_mInputBox.state = IM_INPUT_LX;
        else
        {
            memset(g_pIMEInBuffer, 0, IM_INBUFF_LEN);
            g_pIMEInputednum = 0;
            g_mInputBox.state = IM_INPUT_NULL;
        }
        return TRUE;
    }
    
    return FALSE;
}
/*************************************************************************/
/* FUNCTION:   _imBihuaGetData											 */
/* DESCRIPTION:笔画输入法取数据函数									 */
/* INPUTS:     NONE													 */
/* OUTPUTS:    TRUE/FALSE												 */
/*************************************************************************/
FOR_IME_BIHUA
BOOL _imBihuaGetData(void)
{
    UINT16  index, i, number1, number2;
    UINT32  addr;
    UINT8   num;
    
    if (g_pIMEInBuffer[1] == 0)
    {
        index = g_pIMEInBuffer[0] - '0';
    }
    else
    {
        index = (g_pIMEInBuffer[0] - '0') * 10 + g_pIMEInBuffer[1] - '0';
    }
    
    for (i = 0; i < IMBUHUATOTAL; i++)
    {
        addr = (UINT32)BIHUA_ADDRESS + i * 3;
        memcpy((UINT8 *)&num, (UINT8 *)addr, 1);
        
        if (num == index)
        {
            addr = (UINT32)BIHUA_ADDRESS + (i * 3 + 1);
            memcpy((UINT8 *)&number1, (UINT8 *)addr, sizeof(UINT16));
            
            if (i == IMBUHUATOTAL - 1)
            {
                number2 = BIHUA_LENGTH;
            }
            else
            {
                i++;
                addr = (UINT32)BIHUA_ADDRESS + (i * 3 + 1);
                memcpy((UINT8 *)&number2, (UINT8 *)addr, sizeof(UINT16));
            }
            
            g_pIMEWordNum = (number2 - number1) / 2;
            g_pIMEDataAddr = (UINT8 *)BIHUA_ADDRESS + number1;
            g_pIMECandiPos = 0;
            g_pIMEBushouWordLen = 2;
			g_pIMEWordTypeNum = HZ_PER_PAGE;
			
            return TRUE;
        }
    }
    
    return FALSE;
}
/*************************************************************************/
/*                      GET部首和难检数据的地址                          */
/*************************************************************************/
FOR_IME_BUSHOU
void ImGetBiShouDataAddr(void)
{
    UINT32 pAddr;
    
    pAddr = (UINT32)BUSHOU_ADDRESS + 3;
    memcpy((UINT8 *)(&g_pIMEBushou_bhbh), (UINT8 *)pAddr, 2);
    pAddr = pAddr + 3;
    memcpy((UINT8 *)(&g_pIMEBushou_bsb), (UINT8 *)pAddr, 2);
    pAddr = pAddr + 3;
    memcpy((UINT8 *)(&g_pIMEBushou_bs), (UINT8 *)pAddr, 2);
    pAddr = pAddr + 3;
    memcpy((UINT8 *)(&g_pIMEBushou_bh), (UINT8 *)pAddr, 2);
    pAddr = pAddr + 3;
    memcpy((UINT8 *)(&g_pIMEBushou_hz), (UINT8 *)pAddr, 2);
}

/*************************************************************************/
/* FUNCTION:   _imBushouGetData										 */
/* DESCRIPTION:部首输入法取数据函数									 */
/* INPUTS:     NONE													 */
/* OUTPUTS:    T/F														 */
/*************************************************************************/
FOR_IME_BUSHOU
BOOL _imBushouGetData(void)
{
    UINT16 pIndex, pNumber1, pNumber2;
    UINT32 pAddr;
    UINT16 pNumno1, pNumno2, pIndex1, pIndex2, i;
    
    if (g_pIMEInBuffer[1] == 0)
    {
        pIndex = g_pIMEInBuffer[0] - '0';
    }
    else
    {
        pIndex = (g_pIMEInBuffer[0] - '0') * 10 + g_pIMEInBuffer[1] - '0';
    }
    
//  if (!g_bSecond) {			//MODIFIED BY JU
	if (!g_pIMEBushouState){
		if ((pIndex > 12) || (pIndex == 0))
        {
            return FALSE;
        }
        else {
            pAddr = (UINT32)BUSHOU_ADDRESS + g_pIMEBushou_bhbh + pIndex - 1;
            memcpy((UINT8 *)(&pNumno1), (UINT8 *)pAddr, 2);
            pNumber1 = (UINT8)pNumno1;
            pNumber2 = (UINT8)(pNumno1 >> 8);
            g_pIMEWordNum = pNumber2 - pNumber1;
            pNumno1 = (UINT16)pNumber1 * 3;
            if (g_pIMEWordNum == 0) 
            {
                return FALSE;
            }
            
            g_pIMEDataAddr
                = (UINT8 *)(BUSHOU_ADDRESS + g_pIMEBushou_bsb + pNumno1);
            g_pIMECandiPos = 0;
            g_pIMEBushouWordLen = 3;
            g_pIMEWordTypeNum =HZ_PER_PAGE;
				return TRUE;
        }
    }
    else{
//        pAddr = (UINT32)g_pBushouAddr + g_pIMEBushouWordIndex * 3 + 2; ???
        pAddr = (UINT32)g_pIMEDataAddr + g_pIMEBushouWordIndex * 3 + 2;
        pNumber1 = 0;
        memcpy((UINT8 *)(&pNumber1), (UINT8 *)pAddr, 1);
        pAddr = (UINT32)BUSHOU_ADDRESS + g_pIMEBushou_bs + pNumber1 * 4;
        memcpy((UINT8 *)(&pIndex1), (UINT8 *)(pAddr + 2), 2);
        pAddr += 6;
        memcpy((UINT8 *)(&pIndex2), (UINT8 *)pAddr, 2);
        pNumno1 = pIndex2 - pIndex1;
        pAddr = (UINT32)BUSHOU_ADDRESS + g_pIMEBushou_bh + pIndex1 * 4;
        
        for (i = 0; i < pNumno1; i++) {
            memcpy((UINT8 *)(&pNumno2), (UINT8 *)pAddr, 2);
            pNumber1 = (UINT8)pNumno2;
            pNumber2 = (UINT8)((pNumno2 >> 8) & 0xff);
            
            if (pNumno1 == 1 && pNumber1 == 0 && pNumber2 == 0)
            {
                pIndex=0;
            }
            
            if (pIndex == pNumber1
                || pIndex >= pNumber1 && pIndex <= pNumber2)
            {
                memcpy((UINT8 *)(&pIndex1), (UINT8 *)(pAddr + 2), 2);
                pAddr += 6;
                memcpy((UINT8 *)(&pIndex2), (UINT8 *)pAddr, 2);
                g_pIMEWordNum = pIndex2 - pIndex1;
                if (g_pIMEWordNum == 0) 
                {
                    return FALSE;
                }
                
                pNumno2 = (UINT16)pIndex1 * 2;
                g_pIMEDataAddr
                    = (UINT8 *)(BUSHOU_ADDRESS + g_pIMEBushou_hz + pNumno2);
                g_pIMECandiPos = 0;
                g_pIMEBushouWordLen = 2;
                return TRUE;
            }
            pAddr += 4;
        }
        
        return FALSE;
    }
}
/*************************************************************************/
/*                      GET难检数据				                         */
/*************************************************************************/
FOR_IME_NANJIAN
void _imNanjianGetData(void)
{
    UINT16 pIndex, pNumber1, pNumber2;
    UINT32 pAddr, pAddr1, pAddr2;
    
    if (g_pIMEInBuffer[1] == 0)
    {
        pIndex = g_pIMEInBuffer[0] - '0';
    }
    else
    {
        pIndex = (g_pIMEInBuffer[0] - '0') * 10 + g_pIMEInBuffer[1] - '0';
    }
    
    if (pIndex > 32 || pIndex == 0)
    {
        g_mInputBox.state = IM_INPUT_ERROR;        
        return;
    }
    
    if (pIndex > 20)
    {
        pIndex = 20;
    }
    pAddr = (UINT32)NJZ_ADDRESS + pIndex * 4 - 4;
    pAddr1 = pAddr + 2;
    pAddr2 = pAddr + 6;
    memcpy((UINT8 *)(&pNumber1), (UINT8 *)pAddr1, 2);
    memcpy((UINT8 *)(&pNumber2), (UINT8 *)pAddr2, 2);
    g_pIMEWordNum = (pNumber2 - pNumber1) / 2;
    
    g_pIMECandiPos = 0;
    g_pIMEDataAddr = (UINT8*)(NJZ_ADDRESS + pNumber1);
    g_pIMEBushouWordLen = 2;

	g_mInputBox.state = IM_INPUT_ZC;
	g_pIMEWordTypeNum = HZ_PER_PAGE;
	
}
/*****************************拼音五笔共用部分****************************/

BOOL _PyWbGetData(UINT uType)
{
    BOOL retval;
    
    if (uType == IME_WUBI)
    {
        retval = _ImWbGetWord();
    }
    else
    {
        retval = __ImPyGetWord();
    }
    if (!retval)
    {
        g_pIMEWordNum = 0;
        g_pIMECandiPos = 0;
    }    
    
    return retval;
}

/*************************************************************************/
/* FUNCTION:   _ImWbGetWord											 */
/* DESCRIPTION:五笔输入法取数据										 */
/* INPUTS:     NONE													 */

⌨️ 快捷键说明

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