📄 editdsp.c
字号:
/**************************************************************************
Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD
FILE NAME: EditDsp.C
MODULE NAME: Edit
DESCRIPTION: 编辑器显示相关的函数
对外函数声明:
内部函数声明:
编辑器显示mark块
void __EditDispBlockStr(MEdit *pEdit,UINT uHead, UINT uTail, BOOL bIsRev);
按限定长度显示字符串
UINT __EditDispLimitLenStr(MEdit *pEdit, UINT x, UINT y, UINT8 *pStr, UINT uMaxLen, BOOL bIsRev);
显示行分割线
void __EditDispLineSpace(MEdit *pEdit, UINT uWidth, UINT uHeight, UINT16 wStateOption, UINT uSpace);
显示一行数据,还可以指定是否显示mark
UINT __EditDispOneLineText(MEdit* pEdit, UINT8 *pData, UINT uMem, UINT x0, UINT y0, UINT uWidth, UINT uBlockHead, UINT uBlockTail);
显示一屏数据
void __EditDispScrText(MEdit* pEdit, UINT8 *pCaption, UINT8 *pData, UINT8 *pScrnStart, UINT y0, UINT uStartLine, UINT uLines, UINT uCols, UINT uSpace, UINT uIndent, UINT uBlockHead, UINT uBlockTail);
**************************************************************************
DTAE AUTHOR VERSION REMARKS
=========== ========== ========= ======================================
2006-12-31 gaolinhui V1.0 create
***************************************************************************/
#include "Kernel.h"
#include "EditIn.h"
extern MEditFace g_mEditFace;
/***************************************************************************
FUNCTION: __EditDispLimitLenStr
DESCRIPTION:按限定长度显示字符串
INPUTS: pEdit - 要显示的编辑器句柄
x - 显示起始点横坐标
y - 显示起始点列坐标
pStr - 数据缓冲区指针
uMaxLen - 最大显示列数
bIsRev - 是否反白(为TRUE表反白显示,为FALSE表正常显示)
OUTPUTS: NONE
RETURN: 显示字符占用内存长度
**************************************************************************
NAME DATE REMARKS
========== ============ ==============================================
gaolinhui 2005-12-20 移植ED132
***************************************************************************/
UINT __EditDispLimitLenStr(MEdit *pEdit, UINT x, UINT y, UINT8 *pStr, UINT uMaxLen, BOOL bIsRev)
{
INT nMemLen, nDspLen;
UINT uWidth, uHeight, uTemp, uNewStartMem;
UINT8 byFirstChar;
BOOL bHaveDisp;
INT16 x0 = pEdit->uX, y0 = pEdit->uY;
/*变量初始化*/
uWidth = __EditGetAsciiFontWidth(pEdit->pmEditInfo->wFontID);
uHeight = FontGetHeight(pEdit->pmEditInfo->wFontID);
nDspLen = 0;
nMemLen = 0;
uNewStartMem = 0;
bHaveDisp = TRUE;
while( nDspLen < (INT)uMaxLen )
{
byFirstChar = pStr[nMemLen];
if( !byFirstChar )
{ /*是结尾符,返回*/
break;
}
else if( byFirstChar == CHAR_RETURN )
{ /*是回车符,返回,但回车符应该作为本行的字符*/
nMemLen++;
break;
}
else if( byFirstChar & 0x80 )
{ /*是全角字符,要从字库中查询其显示长度(如果能确定自定义字符的编码范围,还可以细分,从而提高速度)*/
UINT16 wChar;
FontInfo mFiTemp; /*字符信息*/
wChar = MAKEWORD(pStr[nMemLen+1], byFirstChar);
if( FontGetCharInfo(pEdit->pmEditInfo->wFontID, wChar, &mFiTemp, 0L ) )
{ /*在字库中找得到的字符*/
uTemp = mFiTemp.wFontWidth / uWidth;
}
else
{ /*在字库中找不得到的字符,显示长度固定给两个ASCII的长度*/
uTemp = 2;
}
if( nDspLen + uTemp > uMaxLen )
{ /*显示长度超出*/
break;
}
nDspLen += uTemp;
nMemLen += 2;
bHaveDisp = FALSE;
}
else
{ /*其它字符均为ASCII字符*/
nDspLen++;
nMemLen++;
bHaveDisp = FALSE;
}
}
uTemp = nDspLen*uWidth;
if( !bHaveDisp )
{
GraphDrawText(x0+x, y0+y, uTemp, uHeight,
pStr + uNewStartMem );
if(bIsRev) //如果需要反显的,将显示区域反显.
{
GraphInvertRect(x0+x, y0+y, x0+x+uTemp-1, y0+y+uHeight-1);
}
}
if( nDspLen < (int)uMaxLen )
GraphClearRect( x0+ x+nDspLen*uWidth, y0+y, x0+x+ uMaxLen*uWidth-1, y0+y + uHeight-1);
return nMemLen;
}
/****************************************************************************/
/* FUNCTION: __EditDispOneLineText */
/* DESCRIPTION:显示一行编辑数据 */
/* INPUTS: pEdit - 要显示的Edit的句柄 */
/* pData - 数据缓冲区指针 */
/* uMem - 显示数据的开始内存位置 */
/* x0 - 显示起始点横坐标 */
/* y0 - 显示起始点列坐标 */
/* uWidth - 最大显示列数 */
/* uBlockHead - 选择块头 */
/* uBlockTail - 选择块尾 */
/* OUTPUTS: NONE */
/* RETURN: 返回显示数据的内存长度 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Xie 2001-04-23 创建初始版本 */
/* gaolinhui 2005-12-20 移植ED132 */
/****************************************************************************/
UINT __EditDispOneLineText(MEdit* pEdit, UINT8 *pData, UINT uMem, UINT x0, UINT y0, UINT uWidth, UINT uBlockHead, UINT uBlockTail)
{
UINT uCharWidth, uHead, uTail, uMaxLen,uMemLen, uDspLen, uTemp;
if( uBlockHead < uBlockTail )
{
uHead = uBlockHead;
uTail = uBlockTail;
}
else
{
uTail = uBlockHead;
uHead = uBlockTail;
}
uCharWidth = __EditGetAsciiFontWidth(pEdit->pmEditInfo->wFontID);
uDspLen = uWidth;
uMaxLen = __EditDspPosToMem(pEdit->pmEditInfo->wFontID, &pData[uMem], &uDspLen);
if( (uMem >= uTail) || ((uMem + uMaxLen) <= uHead) )
{ /*要显示数据不在MARK块内*/
uMemLen = __EditDispLimitLenStr(pEdit, x0, y0, &pData[uMem], uWidth, FALSE);
}
else if( (uMem >= uHead) && ((uMem + uMaxLen) <= uTail) )
{ /*要显示数据全部在MARK块内*/
uMemLen = __EditDispLimitLenStr(pEdit, x0, y0, &pData[uMem], uWidth, TRUE);
}
else
{
if( uMem <= uHead )
{ /*要显示数据的后半部分或中间部分在MARK块内*/
uMemLen = uHead - uMem;
uDspLen = __EditMemPosToDsp(pEdit->pmEditInfo->wFontID, &pData[uMem], &uMemLen);
__EditDispLimitLenStr(pEdit, x0, y0, &pData[uMem], uDspLen, FALSE);
x0 += uDspLen * uCharWidth;
uWidth -= uDspLen;
uMem += uMemLen;
uMaxLen -= uMemLen;
}
else
{
uMemLen = 0;
}
if( (uMem + uMaxLen) < uTail )
{ /*要显示数据的后半部分在MARK块内*/
uMemLen += __EditDispLimitLenStr(pEdit, x0, y0, &pData[uMem], uWidth, TRUE);
}
else
{ /*要显示数据的中间部分在MARK块内*/
uTemp = uTail - uMem;
uDspLen = __EditMemPosToDsp(pEdit->pmEditInfo->wFontID, &pData[uMem], &uTemp);
uMemLen += __EditDispLimitLenStr(pEdit, x0, y0, &pData[uMem], uDspLen, TRUE);
x0 += uDspLen * uCharWidth;
uMemLen += __EditDispLimitLenStr(pEdit, x0, y0, &pData[uTail], (UINT16)(uWidth-uDspLen), FALSE);
}
}
return uMemLen;
}
/****************************************************************************/
/* FUNCTION: __EditDispScrText */
/* DESCRIPTION:显示一屏字符串 */
/* INPUTS: pEdit - 要显示的编辑器句柄 */
/* pCaption - 本显示域的标题地址 */
/* pData - 要显示数据的缓冲区地址 */
/* pScrnStart - 本屏数据的起始地址 */
/* y0 - 显示区域的纵向起始坐标 */
/* uStartLine - 要显示数据在总数据中的起始行号 */
/* uLines - 要显示的总行数 */
/* uCols - 屏幕能显示的总列数 */
/* uSpace - 行间隔 */
/* uIndent - 悬挂缩进字符数 */
/* uBlockHead - MARK块块头位置 */
/* uBlockTail - MARK块块尾位置 */
/* OUTPUTS: NONE */
/* RETURN: NONE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Xie 2001-04-23 创建初始版本 */
/* gaolinhui 2005-12-20 移植ED132 */
/****************************************************************************/
void __EditDispScrText(MEdit* pEdit, UINT8 *pCaption, UINT8 *pData, UINT8 *pScrnStart, UINT y0, UINT uStartLine, UINT uLines, UINT uCols, UINT uSpace, UINT uIndent, UINT uBlockHead, UINT uBlockTail)
{
UINT i, uLineLen, uTmpLine, uTmp1, uTmp2;
UINT uCharWidth, uCharHeight, uLineHeight, uCapLen, uDataLen;
UINT8 byPassword;
INT xn, yn;
UINT8 strBak[41];
INT16 xBase = pEdit->uX, yBase = pEdit->uY;
uCharWidth = __EditGetAsciiFontWidth(pEdit->pmEditInfo->wFontID );/*字符的宽度*/
uCharHeight = FontGetHeight(pEdit->pmEditInfo->wFontID); /*字符的高度*/
uLineHeight = uCharHeight + uSpace; /*行宽*/
uCapLen = __EditGetCaptionLen(pCaption); /*标题的长度*/
if( uCapLen > uCols )
{
uCapLen = uCols;
}
uTmpLine = 0;
uDataLen = 0;
if( uStartLine > 0 )
{ /*如果不是从第一行开始显示,则指针向后移*/
if( pScrnStart == (UINT8*)NULL )
{
uLineLen = uCols - uCapLen;
for( i=0; i<uStartLine; i++ )
{
uTmp2 = uLineLen;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -