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

📄 editdsp.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
                                                                          
              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 + -