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

📄 editlib.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 3 页
字号:
    }
    return uRetLen;
}

/****************************************************************************/
/* FUNCTION:   __EditGetPreCharDspLen                                      */
/* DESCRIPTION:根据显示位置得到前一字符的显示长度                          */
/* INPUTS:     wFontID - 字库ID号                                          */
/*              pStr - 字符串所在的地址                                     */
/*              uStartPos - 指定字符位置                                    */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     前一字符的显示长度                                          */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/* gaolinhui    2005-12-19			移植ED132								*/
/****************************************************************************/
UINT __EditGetPreCharDspLen(UINT16 wFontID, UINT8 *pStr, UINT uStartPos)
{
    UINT    uRetLen, uMemLen;

    if( uStartPos == 0 )
    {
        return 0;
    }

    uMemLen = 0;
    uRetLen = 0;
    /*从前往后计算*/
    do
    {
        uStartPos -= uRetLen;
        pStr += uMemLen;
        __EditGetCharLength( wFontID, pStr, &uMemLen, &uRetLen);
    }while( uRetLen < uStartPos );

    return uRetLen;
}

/****************************************************************************/
/* FUNCTION:   __EditGetCaptionLen                                         */
/* DESCRIPTION:计算标题的显示长度(资源或字符串)                            */
/* INPUTS:     pCaption - 标题字符串地址(或资源ID号)                       */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     标题的显示长度                                              */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/****************************************************************************/
UINT __EditGetCaptionLen(UINT8 *pCaption)
{
    UINT  uRet;
    UINT8   *pBak;
    UINT32  dwLen;
    
    uRet = 0;
    pBak = NULL;

    if (pCaption)
    {
        if (IS_ID(pCaption))
        {
			dwLen = ResGetString(GET_ID(pCaption), &pBak);
            if (dwLen != 0)
            {
				uRet = (UINT16)dwLen - 1;
            }
        }
        else
        {
            uRet = strlen((char*)pCaption);
        }
    }

    return uRet;
}

/****************************************************************************/
/* FUNCTION:   __EditGetStrLength                                          */
/* DESCRIPTION:得到字符串中的字符长度(显示长度或内存长度)                  */
/* INPUTS:     wFontID - 字库的ID号                                        */
/*              pData -                                           */
/*              bRetDspLen - 为字符串指针“1”表返回显示长度;为“0”表返回内存长度   */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     显示长度或内存长度                                          */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/* gaolinhui    2005-12-19			移植ED132								*/
/****************************************************************************/
UINT __EditGetStrLength( UINT16 wFontID, UINT8 *pData, BOOL bRetDspLen )
{
    UINT        uDspLen, uMemLen, uAsciiCharLen, uFirstChar;
    UINT8       *pStr;
    FontInfo    mFiSbcCharInfo;         /*全角字符信息*/

    pStr = pData;
    uAsciiCharLen = __EditGetAsciiFontWidth(wFontID);
    uMemLen = 0;
    uDspLen = 0;

    uFirstChar = pStr[uMemLen];
    while( uFirstChar != 0x00 )
    {
        if( uFirstChar & 0x80 )         /*是全角编码字符*/
        {
            if( bRetDspLen )
            {   /*在需要显示长度的时候才需要计算,为提高速度,增加此判断 Xie 2002.6.26*/
                if( FontGetCharInfo(wFontID,
                    (UINT16)MAKEWORD(pStr[uMemLen+1], pStr[uMemLen]),
                    &mFiSbcCharInfo, 0L) )
                {
                    uDspLen += mFiSbcCharInfo.wFontWidth / uAsciiCharLen;
                }
                else
                {
                    uDspLen += 2;
                }
            }
            uMemLen += 2;
        }
        else if( uFirstChar == CHAR_RETURN )    /*回车符*/
        {
            uDspLen += 1;   /*2001.12.11 change: 回车符算一个显示长度*/
            uMemLen += 1;
        }
        else    /*是ASCII字符*/
        {
            uMemLen += 1;
            uDspLen += 1;
        }
        uFirstChar = pStr[uMemLen];
    }

    if(bRetDspLen)
    {
        return uDspLen;
    }
    else
    {
        return uMemLen;
    }
}

/****************************************************************************/
/* FUNCTION:   __EditGetStrLineNum                                         */
/* DESCRIPTION:得到字符串所需的显示行数                                    */
/* INPUTS:     wFontID - 字库的ID号                                        */
/*              uWidth - 显示屏幕宽度                                       */
/*              pCaption - 标题字符串(或资源ID号)                           */
/*              pData - 数据指针                                            */
/*              uIndent - 缩进列数                                          */
/*              bScrnStartPtr - 标志是否可从当前屏幕起始位置开始计算        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     返回行数                                                    */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/* gaolinhui    2005-12-19			移植ED132								*/
/****************************************************************************/
UINT __EditGetStrLineNum(UINT16 wFontID, UINT uWidth, UINT8 *pCaption, UINT8 *pData, UINT uIndent, BOOL bScrnStartPtr)
{
    UINT    uDspLen,uTmpLen;
    UINT    uCols,uPreLen,uTemp,uLines,uMemLen, uLineWidth;
    BOOL    bLastReturn;

    uLines = 0;
    uCols = __EditGetRectRowNum( wFontID, uWidth );
    if( bScrnStartPtr )
    {
        uPreLen = uIndent;
    }
    else
    {
        uPreLen = __EditGetCaptionLen(pCaption);
    }
    uLineWidth = uCols - uPreLen;       /*实际一行能显示的列数*/
    uTmpLen = (INT16)uPreLen;
    do
    {
        bLastReturn = FALSE;
        uLines += 1;
        uTemp = uLineWidth;
        uMemLen = __EditDspPosToMem( wFontID, pData, &uTemp );/*得到一行的内存长度*/
        if( pData[uMemLen] == CHAR_RETURN && uTemp < uLineWidth )
        {   /*回车符特殊处理*/
            uMemLen++;
            bLastReturn = TRUE;
        }
        uDspLen = uTemp;
        pData += uMemLen;
        uPreLen = uIndent;
        uLineWidth = uCols - uPreLen;
    }while( *pData != 0 );

    if( (uLines==1)&&(uDspLen==(uCols - uTmpLen)) )
    {   /*实际的数据恰好占整行,没有不满行的数据,所以换行,加1*/
        uLines += 1;
    }
    else if( (uLines > 1) && (uDspLen == (uCols - uPreLen)) )
    {   /*实际的数据恰好占整行,没有不满行的数据,所以换行,加1*/
        uLines += 1;
    }
    else if( bLastReturn )
    {   /*最后一个字符是回车符*/
        uLines += 1;
    }
    return uLines;
}

/****************************************************************************/
/* FUNCTION:   __EditGetScrnStart                                          */
/* DESCRIPTION:重新计算编辑器buffer中开始显示的内存位置                    */
/* INPUTS:     hEditWin - 句柄                                             */
/*              uOldStart - 数据改变前的起始显示行(列)位置                  */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/* gaolinhui    2005-12-20			移植ED132								*/
/****************************************************************************/
VOID __EditGetScrnStart(MEdit* hEditWin, UINT uOldStart)
{
    UINT16	wState;
    UINT    uShiftLen, uStart, uPreLen;
    UINT8   *pData;

    pData = hEditWin->pmEditInfo->pBuf;
    uStart = hEditWin->pmEditInfo->uStart;
    wState = hEditWin->pmEditInfo->wState;
    uPreLen = __EditGetCaptionLen(hEditWin->pmEditInfo->pCaption);
    if( (uOldStart != 0) && (uOldStart <= uStart) )
    {
        pData = hEditWin->pmEditInfo->pScrnStart;
        uStart -= uOldStart;
        uPreLen = hEditWin->pmEditInfo->uIndent;
    }
    if( !(wState & OF_EDITOR_MULTILINE) )
    {
        uShiftLen = __EditDspLenToMem( hEditWin->pmEditInfo->wFontID , pData, &uStart);
    }
    else
    {
        UINT    uTemp, i;
        UINT    uLineWidth, uCols, uTmpMem, uTmpDsp;
        uShiftLen = 0;
        uCols = hEditWin->uWidth / __EditGetAsciiFontWidth(hEditWin->pmEditInfo->wFontID);
        uLineWidth = uCols - uPreLen;
        for( i=0; i<uStart; i++ )
        {
            uTmpDsp = uLineWidth;
            uTmpMem = __EditDspPosToMem(hEditWin->pmEditInfo->wFontID, &pData[uShiftLen], &uTmpDsp );
            uTemp = pData[uShiftLen + uTmpMem];
            if( uTemp == 0 && uTmpDsp < uLineWidth )
            {
                hEditWin->pmEditInfo->uStart = i;
                break;
            }
            if( pData[uShiftLen + uTmpMem] == CHAR_RETURN && uTmpDsp < uLineWidth  )
            {
                uTmpMem += 1;
                uTmpDsp += 1;
            }
            uShiftLen += uTmpMem;
            uLineWidth = uCols - (UINT16)(hEditWin->pmEditInfo->uIndent);
        }
    }
    hEditWin->pmEditInfo->pScrnStart = pData + uShiftLen;
}

/****************************************************************************/
/* FUNCTION:   __EditStrValidLenCheck                                      */
/* DESCRIPTION:判断合法数据的长度                                          */
/* INPUTS:     wFontID - 字库ID                                            */
/*              uAllowChar - 允许字符类型                                   */
/*              uDataLen - 数据长度(为零表示取整个字符串)                   */
/*				pData    - 数据起始指针										*/
/* OUTPUTS:    pDspLen - 显示长度                                          */
/*              pMemLen - 内存长度                                          */
/* RETURN:     是否有扩展字符                                              */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/****************************************************************************/
BOOL __EditStrValidLenCheck(UINT16 wFontID, UINT uAllowChar, UINT8 *pData, UINT uDataLen, UINT *pDspLen, UINT *pMemLen)
{
    FontInfo    mFiSbcCharInfo;         /*全角字符信息*/
    UINT        uMemLen, uDspLen, uWidth, uTempMemLen, uTempDspLen;
    BOOL        bHaveExChar;
    UINT8       uFirstChar;

    if( uDataLen == 0 )
    {
        uDataLen = 0xffff;
    }
    bHaveExChar = FALSE;
    uMemLen = 0;
    uDspLen = 0;
    uWidth = __EditGetAsciiFontWidth(wFontID);
    uFirstChar = *pData;
    while( uFirstChar != 0x00 )
    {
        uTempMemLen = 1;
        uTempDspLen = 1;
        if( (uFirstChar >= '0') && (uFirstChar <= '9') )
        {
            if( !(uAllowChar & EDITALLOW_NUMBER) )
            {   /*是数字,且不允许输入数字*/
                break;
            }
        }
        else if( ((uFirstChar >= 'a') && (uFirstChar <= 'z')) || ((uFirstChar >= 'A') && (uFirstChar <= 'Z')) )
        {
            if( !(uAllowChar & EDITALLOW_ENCHAR) )
            {   /*是英文字符,且不允许英文字符*/
                break;
            }
        }
        else if( uFirstChar & 0x80 )
        {
            if( !(uAllowChar & EDITALLOW_SBCCASE) )
            {   /*是全角字, 且不允许输入全角字符*/
                break;
            }
            uTempDspLen = 2;
            if (FontGetCharInfo(wFontID,
                (UINT16)MAKEWORD(pData[1], uFirstChar), &mFiSbcCharInfo, 0L))
            {
                uTempDspLen = mFiSbcCharInfo.wFontWidth / uWidth;
            }
            uTempMemLen = 2;
        }
        else if( uFirstChar == CHAR_RETURN )
        {
            if( !(uAllowChar & EDITALLOW_ENTER) )
            {   /*回车符, 且不允许输入回车符*/
                break;

⌨️ 快捷键说明

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