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

📄 editlib.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************
                                                                          
              Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD                   
                                                                          
 FILE NAME:   EditLib.C                                                   
 MODULE NAME: Edit                                                        
 DESCRIPTION: 一套为Edit控件使用的内部函数集合
 
 外部函数声明:

 内部函数声明:
 //根据显示位置得到内存位置
UINT	__EditDspPosToMem(UINT16  wFontID, UINT8 *pStr, UINT *pDspLen);
//由显示长度得到内存长度(遇回车符不返回)
UINT	__EditDspLenToMem(UINT16 wFontID, UINT8 *pStr, UINT *pDspLen);
//由内存长度得到显示长度(遇回车符不返回) 
UINT	__EditMemLenToDsp(UINT16 wFontID, UINT8 *pStr, UINT *pMemLen);
//由内存位置到显示位置,并调整内存位置(遇回车符则返回)
UINT	__EditMemPosToDsp(UINT16 wFontID, UINT8 *pStr, UINT *pMemLen);
//得到ASCII字符的显示长度
UINT	__EditGetAsciiFontWidth(UINT16 wFontID);
//得到指定高度能显示字符串的行数 
UINT	__EditGetRectLineNum(UINT16 wFontID,UINT uHeight, UINT uRowSpace);
//得到指定宽度能显示的ASCII字符个数 
UINT	__EditGetRectRowNum(UINT16 wFontID, UINT uWidth);
//得到一个字符的显示长度或内存长度
VOID	__EditGetCharLength(UINT16 wFontID, UINT8 *pStr, UINT *pMemLen, UINT *pDspLen);
//根据内存位置得到前一字符的内存长度
UINT	__EditGetPreCharMemLen(UINT16 wFontID, UINT8 *pData, UINT uMem);
//根据显示位置得到前一字符的显示长度
UINT	__EditGetPreCharDspLen(UINT16 wFontID, UINT8 *pStr, UINT uStartPos);
//计算标题的显示长度(资源或字符串)  
UINT	__EditGetCaptionLen(UINT8 *pCaption);
//得到字符串中的字符长度(显示长度或内存长度)
UINT	__EditGetStrLength( UINT16 wFontID, UINT8 *pData, BOOL bRetDspLen );
//得到字符串所需的显示行数  
UINT	__EditGetStrLineNum(UINT16 wFontID, UINT uWidth, UINT8 *pCaption, UINT8 *pData, UINT uIndent, BOOL bScrnStartPtr);
//重新计算编辑器buffer中开始显示的内存位置
VOID	__EditGetScrnStart(MEdit* hEditWin, UINT uOldStart);
//判断合法数据的长度
BOOL	__EditStrValidLenCheck(UINT16 wFontID, UINT uAllowChar, UINT8 *pData, UINT uDataLen, UINT *pDspLen, UINT *pMemLen);
//根据内存位置低到光标位置
VOID	__EditMemColToCursor(MEdit *hEditWin,UINT uMemCol, INT *pCurLine, INT *pCurCol, BOOL bChangeCursor,BOOL bScrnStart);
//根据光标位置得到内存位置
UINT	__EditCursorToMemCol(MEdit *hEditWin, INT *pCurLine, INT *pCurCol, UINT uDspCols);
//返回当前块首和块尾的位置
BOOL	__EditGetSel(MEdit *hEditor, UINT *pStartChar, UINT *pEndChar);
//取消块
void	__EditFlushSelBlock(MEdit *hEditWin);
**************************************************************************
    DTAE       AUTHOR     VERSION                 REMARKS                 
 =========== ==========  =========  ======================================
 2006-12-31    gaolinhui    V1.0		create                 
***************************************************************************/


#include "kernel.h"
#include "EditIn.h"

extern EdtCmdEx    g_mEdtCmdEx;		//编辑器的扩展命令类型
extern CMDEXP		g_mEditCmdParam;

/****************************************************************************/
/* FUNCTION:   __EditDspPosToMem                                           */
/* DESCRIPTION:由显示位置得到内存位置(遇回车符则返回)                      */
/* INPUTS:     wFontID - 字库ID号                                          */
/*              pStr - 数据缓冲区指针                                       */
/* OUTPUTS:    pDspLen - 数据显示位置                                      */
/* RETURN:     数据内存位置(将根据合法性调整显示位置)                      */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/****************************************************************************/
UINT __EditDspPosToMem(UINT16  wFontID, UINT8 *pStr, UINT *pDspLen)
{
    UINT    uMemLen, uTmpDspLen, uTmpLen1, uTmpLen2;

    uMemLen = 0;
    uTmpDspLen = 0;
    uTmpLen1 = 0;
    uTmpLen2 = 0;
    while( (pStr[uMemLen]!=0x00)  && (uTmpDspLen<(*pDspLen)) )
    {
        if( pStr[uMemLen] == CHAR_RETURN )
        {
            break;
        }
        __EditGetCharLength( wFontID, pStr+uMemLen, &uTmpLen1, &uTmpLen2);
        if( (uTmpLen1 == 0) || ((uTmpDspLen + uTmpLen2) > *pDspLen) )
        {   /*显示长度不够,返回*/
            break;
        }
        uTmpDspLen += uTmpLen2;
        uMemLen += uTmpLen1;
    }

    *pDspLen = uTmpDspLen;
    return uMemLen;
}



/****************************************************************************/
/* FUNCTION:   __EditDspLenToMem                                           */
/* DESCRIPTION:由显示长度得到内存长度(遇回车符不返回)                      */
/* INPUTS:     hDc - 控件句柄                                              */
/*              pStr - 数据缓冲区指针                                       */
/* OUTPUTS:    pDspLen - 数据显示长度                                      */
/* RETURN:     数据内存长度(将根据合法性调整显示长度)                      */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/****************************************************************************/
UINT __EditDspLenToMem(UINT16 wFontID, UINT8 *pStr, UINT *pDspLen)
{
    UINT    uMemLen,uTmpLen,uTmpDspLen,uTmp1,uTmp2;

    uMemLen = 0;
    uTmpDspLen = 0;
    uTmpLen = 0;
    uTmp2 = 0;
    while( (pStr[uMemLen]!=0x00) && (uTmpDspLen < *pDspLen) )
    {
        __EditGetCharLength( wFontID, pStr+uMemLen, &uTmpLen, &uTmp1);
        if( (uTmp1+uTmp2) > (*pDspLen) )
        {   /*显示长度不够,返回*/
            break;
        }
        uTmp2 += uTmp1;
        uMemLen += uTmpLen;
    }
    *pDspLen = uTmp2;
    return uMemLen;
}


/****************************************************************************/
/* FUNCTION:   __EditMemLenToDsp											*/
/* DESCRIPTION:由内存长度得到显示长度(遇回车符不返回)                      */
/* INPUTS:     wFontID - 字库ID号                                          */
/*              pStr - 数据缓冲区指针                                       */
/* OUTPUTS:    pMemLen - 数据内存位置指针                                  */
/* RETURN:     数据显示长度(将根据合法性调整内存位置)                      */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/****************************************************************************/
UINT __EditMemLenToDsp(UINT16 wFontID, UINT8 *pStr, UINT *pMemLen)
{
    UINT    uDspLen,uTmpMemLen;
    UINT    uTmp1,uTmp2;

    uDspLen = 0;
    uTmpMemLen = 0;
    while( (pStr[uTmpMemLen]!=0x00) && (uTmpMemLen<*pMemLen) )
    {
        __EditGetCharLength( wFontID, pStr+uTmpMemLen, &uTmp1, &uTmp2);
        if( uTmpMemLen + uTmp1 > *pMemLen )
        {
            break;
        }
        uDspLen += uTmp2;
        uTmpMemLen += uTmp1;
    }
    *pMemLen = uTmpMemLen;
    return uDspLen;
}


/****************************************************************************/
/* FUNCTION:   __EditMemPosToDsp                                           */
/* DESCRIPTION:由内存位置到显示位置,并调整内存位置(遇回车符则返回)         */
/* INPUTS:     wFontID - 字库ID号                                          */
/*              pStr - 数据缓冲区指针                                       */
/* OUTPUTS:    pMemLen - 数据内存位置指针                                  */
/* RETURN:     数据显示长度(将根据合法性调整内存位置)                      */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/****************************************************************************/
UINT __EditMemPosToDsp(UINT16 wFontID, UINT8 *pStr, UINT *pMemLen)
{
    UINT    uDspLen,uTmpMemLen,uTmpLen1,uTmpLen2;

    uDspLen = 0;
    uTmpMemLen = 0;
    uTmpLen1 = 0;
    uTmpLen2 = 0;
    while( (pStr[uTmpMemLen]!=0x00)  && (uTmpMemLen < *pMemLen) )
    {
        if( pStr[uTmpMemLen] == CHAR_RETURN )
        {
            break;
        }
        __EditGetCharLength( wFontID, pStr+uTmpMemLen,&uTmpLen2, &uTmpLen1);
        if( (uTmpMemLen + uTmpLen2) > *pMemLen )
        {
            break;
        }
        uDspLen += uTmpLen1;
        uTmpMemLen += uTmpLen2;
    }

    *pMemLen = uTmpMemLen;
    return uDspLen;
}


/****************************************************************************/
/* FUNCTION:   __EditGetAsciiFontWidth                                     */
/* DESCRIPTION:得到ASCII字符的显示长度                                     */
/* INPUTS:     wFontID - 字库ID号                                          */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     ASCII字符宽度                                               */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/* gaolinhui    2005-12-19			移植ED132								*/
/****************************************************************************/
UINT __EditGetAsciiFontWidth(UINT16 wFontID)
{
    FontInfo    mFiAsciiInfo;
    FontGetCharInfo(wFontID, 0x30, &mFiAsciiInfo,0L);    /*计算出ASCII的字符信息*/
    return (UINT)(mFiAsciiInfo.wFontWidth);
}

/****************************************************************************/
/* FUNCTION:   __EditGetRectLineNum                                        */
/* DESCRIPTION:得到指定高度能显示字符串的行数                              */
/* INPUTS:     wFontID - 字库												*/
/*				uHeight - 区域高度                                          */
/*              uRowSpace - 行间距                                          */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     返回行数                                                    */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/* gaolinhui    2005-12-19			移植ED132								*/
/****************************************************************************/
UINT __EditGetRectLineNum(UINT16 wFontID,UINT uHeight, UINT uRowSpace)
{
    UINT    uLines;

    uLines = (uHeight + uRowSpace) / (FontGetHeight(wFontID)+uRowSpace);
    return uLines;
}

/****************************************************************************/
/* FUNCTION:   __EditGetRectRowNum                                         */
/* DESCRIPTION:得到指定宽度能显示的ASCII字符个数                           */
/* INPUTS:     wFontID - 字库                                              */
/*              uWidth - 显示宽度                                          */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     ASCII字符列数                                               */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/* gaolinhui    2005-12-19			移植ED132								*/
/****************************************************************************/
UINT __EditGetRectRowNum(UINT16 wFontID, UINT uWidth)
{
    return ( uWidth /__EditGetAsciiFontWidth(wFontID) );
}

/****************************************************************************/
/* FUNCTION:   __EditGetCharLength                                         */
/* DESCRIPTION:得到一个字符的显示长度或内存长度                            */
/* INPUTS:     wFontID - 字库ID                                            */
/*              pStr - 数据缓冲区指针                                       */
/* OUTPUTS:    pMemLen - 内存长度                                          */
/*              pDspLen - 显示长度                                          */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/* gaolinhui    2005-12-19			移植ED132								*/
/****************************************************************************/
VOID __EditGetCharLength(UINT16 wFontID, UINT8 *pStr, UINT *pMemLen, UINT *pDspLen)
{
    FontInfo    mFiSbcCharInfo;
    UINT        uDspLen, uMemLen, uFirstChar;

    uFirstChar = *pStr;
    uDspLen = 1;
    uMemLen = 1;
    if( uFirstChar & 0x80 )
    {
        uDspLen = 2;
        if( FontGetCharInfo(wFontID,
            (UINT16)MAKEWORD(pStr[1], uFirstChar), &mFiSbcCharInfo, 0L ) )
        {
            uDspLen = mFiSbcCharInfo.wFontWidth / __EditGetAsciiFontWidth(wFontID);
        }
        uMemLen = 2;
    }
    else if(  uFirstChar == 0 )
    {
        uDspLen = 0;
        uMemLen = 0;
    }

    if( pMemLen != (UINT*)NULL )
        *pMemLen = uMemLen;
    if( pDspLen != (UINT*)NULL )
        *pDspLen = uDspLen;
}

/****************************************************************************/
/* FUNCTION:   __EditGetPreCharMemLen                                      */
/* DESCRIPTION:根据内存位置得到前一字符的内存长度                          */
/* INPUTS:     wFontID - 字库ID                                            */
/*              pData - 数据缓冲区指针                                      */
/*              uMem - 要查找字符的内存位置                                 */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     前一字符的内存长度                                          */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/* gaolinhui    2005-12-19			移植ED132								*/
/****************************************************************************/
UINT __EditGetPreCharMemLen(UINT16 wFontID, UINT8 *pData, UINT uMem)
{
    UINT        uLen, uRetLen;

    if( uMem == 0 )
    {
        return 0;
    }
    uLen = 0;
    /*从前往后计算*/
    __EditGetCharLength( wFontID, pData, &uRetLen, (UINT*)NULL);
    while( uLen + uRetLen < uMem )
    {
        uLen += uRetLen;
        __EditGetCharLength( wFontID,  &pData[uLen], &uRetLen, (UINT*)NULL);

⌨️ 快捷键说明

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