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