📄 editlib.c
字号:
}
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 + -