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

📄 editdsp.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 2 页
字号:
                uTmp1 = __EditDspPosToMem(pEdit->pmEditInfo->wFontID, &pData[uDataLen], &uTmp2);    /*/得到一行的内存长度*/
                uDataLen += uTmp1;
                if( pData[uDataLen] == CHAR_RETURN && uTmp2 < uLineLen )
                {   /*下一字符是回车符而且本行未满行,则回车符是本行字符*/
                    uDataLen++;
                }
                uLineLen = uCols - uIndent;
            }
        }
        else
        {
            uDataLen = pScrnStart - pData;
        }
    }
    else
    {   /*否则显示第一行内容*/
        if( uCapLen > 0 )
        {   /*显示标题*/
            GraphDrawText(xBase+0, yBase+y0, pEdit->uWidth, uCharHeight, pCaption);
			if(pEdit->pmEditInfo->wState & OF_EDITOR_INSERSECAP)
			{//标题反显
				uTmp1 = FontGetStringWidth(pEdit->pmEditInfo->wFontID, pCaption);
				GraphInvertRect(xBase, yBase+y0, xBase+uTmp1-1,
							yBase+y0+uCharHeight-1);
			}

        }
        /*显示第一行的编辑数据*/
        uTmp1 = uCols - uCapLen;
        uCapLen *= uCharWidth;
        if( pEdit->pmEditInfo->wState  & OF_EDITOR_PASSWORD )
        {
            byPassword = pEdit->pmEditInfo->byPassword;
            memset(strBak, byPassword, 40);
            uTmp2 = __EditGetStrLength(pEdit->pmEditInfo->wFontID, pData, TRUE);
            if( uTmp2 > uTmp1 )
            {
                uTmp2 = uTmp1;
            }
            strBak[uTmp2] = 0;
            uDataLen += __EditDispOneLineText(pEdit, strBak, 0, uCapLen, y0, uTmp1, 0, 0);
        }
        else
        {
            uDataLen += __EditDispOneLineText(pEdit, pData, uDataLen, uCapLen, y0, uTmp1, uBlockHead, uBlockTail);
        }
        y0 += uLineHeight;
        uTmpLine++;
    }

    /*显示第二行以后的内容*/
    uTmp1 = uCols - uIndent;
    uCapLen = uIndent*uCharWidth;
    while( pData[uDataLen] != 0  && uTmpLine < uLines )
    {
        yn = y0 + uCharHeight - 1;
        uDataLen += __EditDispOneLineText(pEdit, pData, uDataLen, uCapLen, y0, uTmp1, uBlockHead, uBlockTail);
        y0 += uLineHeight;
        uTmpLine++;
    }

	/*清除未显示的空白行*/
	if(!(pEdit->pmEditInfo->wState & OF_EDITOR_NOBACKGRND) )
	{	//只有在用户没有选择不画背景的情况下才清除空白行
		xn = uCols * uCharWidth - 1;
		for( ; uTmpLine < uLines; uTmpLine++ )
		{
			yn = y0 + uCharHeight - 1;
			GraphClearRect(xBase+0, yBase+y0, xBase+xn, yBase+yn );
			y0 += uLineHeight;
		}
	}
}


/****************************************************************************/
/* FUNCTION:   __EditDispBlockStr                                          */
/* DESCRIPTION:显示块字符串                                                */
/* INPUTS:     pEidt - 编辑框句柄                                          */
/*              nHead - MARK块块头位置                                      */
/*              nTail - MARK块块尾位置                                      */
/*              bIsRev - 是否反白                                           */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  gaolinhui  2006-01-10          创建初始版本                            */
/****************************************************************************/
void __EditDispBlockStr(MEdit *pEdit,UINT uHead, UINT uTail, BOOL bIsRev)
{
    UINT16  wStateOption;
    UINT8   *pData;
    INT     nLine0, nCol0, nLineN, nColN;   /*选择块头尾的光标位置*/
    UINT    uRowSpace;
    UINT    x, y;
    UINT    uCapLen, uWidth, uHeight, uLines;
    UINT    uMemCol0, uMemColN, uTemp1, uTemp2; /*选择块头尾的内存位置*/
    UINT    uLine0Save, uCols;              /*保存的块头行号,一行能显示的列数*/

    if(uHead == uTail)
    {   /*没有MARK块,则不作操作*/
        return;
    }

    uRowSpace = pEdit->pmEditInfo->uRowSpace;
    wStateOption = pEdit->pmEditInfo->wState;
    uWidth = __EditGetAsciiFontWidth(pEdit->pmEditInfo->wFontID);
    uHeight = FontGetHeight(pEdit->pmEditInfo->wFontID);

    /*编辑器一屏能显示的行数,和一行能显示的列数*/
    uLines = (pEdit->uHeight + pEdit->pmEditInfo->uRowSpace)/(uHeight + uRowSpace);
    uCols = pEdit->uWidth / uWidth;
    uCapLen = __EditGetCaptionLen(pEdit->pmEditInfo->pCaption);

    uMemCol0 = (uHead<uTail)? uHead : uTail;        /*选择块在内存中的开始位置*/
    uMemColN = (uHead<uTail)? uTail : uHead;        /*选择块在内存中的结束位置*/
    uTemp1 = pEdit->pmEditInfo->pScrnStart - pEdit->pmEditInfo->pBuf;
    if( uMemCol0 < uTemp1 )
    {
        uMemCol0 = uTemp1;
    }
    /*计算选择块头的光标位置(在屏幕上的行列号)*/
    __EditMemColToCursor( pEdit,uMemCol0, &nLine0, &nCol0, FALSE,TRUE);
    uLine0Save = nLine0;
    /*计算选择块尾的光标位置(在屏幕上的行列号)*/
    __EditMemColToCursor(pEdit,uMemColN, &nLineN, &nColN, FALSE,TRUE);

    if( !(wStateOption & OF_EDITOR_MULTILINE) )   /*判断是单行编辑还是多行编辑*/
    {   /*是单行编辑*/
        pData = pEdit->pmEditInfo->pBuf+uMemCol0;
        if( nCol0 < (INT16)uCapLen )
        {
            uTemp2 = (INT16)uCapLen - nCol0;
            uTemp1 = __EditDspPosToMem( pEdit->pmEditInfo->wFontID, pData, &uTemp2 );
            nCol0 = (INT16)uCapLen;
        }
        else
        {
            uTemp1 = 0;
        }
        if( nColN > (INT)uCols )
        {
            nColN = uCols;
        }
        if( nCol0 < nColN )
        {
            x = nCol0 * uWidth;
            y = 0;
            if( bIsRev )
            {
                uTemp2 = uMemColN - uMemCol0;
            }
            else
            {
                uTemp2 = 0;
            }
            __EditDispOneLineText( pEdit, pData, uTemp1, x, y, (UINT16)(nColN - nCol0), 0, uTemp2);
        }
    }
    else
    {   /*是多行编辑*/
        while( nLine0 <= nLineN )
        {
            pData = pEdit->pmEditInfo->pBuf + uMemCol0;
            if( nLine0 >=0 && nLine0 < (INT)uLines )
            {   /*显示在屏幕上可见的行*/
                if( (nLine0 + pEdit->pmEditInfo->uStart) != 0 )
                {
                    uCapLen = pEdit->pmEditInfo->uIndent;
                }
                x = nCol0 * uWidth;
                y = nLine0 * (uHeight + uRowSpace);
                if( uLine0Save == (UINT)nLineN )
                {   /*块头块尾在同一行*/
                    uMemCol0 += __EditDispLimitLenStr(pEdit, x, y, pData, (UINT16)(nColN-nCol0), bIsRev );
                }
                else if( nLine0!=nLineN )
                {   /*块头块尾不在同一行且还没MARK到块尾行*/
                    uMemCol0 += __EditDispLimitLenStr(pEdit, x, y, pData, (UINT16)(uCols-nCol0), bIsRev );
                }
                else
                {   /*块头块尾不在同一行已MARK到块尾行*/
                    uMemCol0 += __EditDispLimitLenStr(pEdit, x, y, pData, (UINT16)(nColN-uCapLen), bIsRev );
                }
            }
            else
            {   /*不可见的行处理*/
                uTemp2 = uCols-nCol0;
                uTemp1 = __EditDspPosToMem( pEdit->pmEditInfo->wFontID, pData, &uTemp2 );
                if( (pData[uTemp1] == CHAR_RETURN) && (uTemp2 < uCols-nCol0) )
                {
                    uTemp1++;
                }
                uMemCol0 += uTemp1;
            }
            nCol0 = pEdit->pmEditInfo->uIndent;
            nLine0++;
        }
    }
}



/****************************************************************************/
/* FUNCTION:   __EditDispLineSpace                                         */
/* DESCRIPTION:画编辑控件中的行分隔线和清除行与行之间的空白区              */
/* INPUTS:     pEdit -  编辑器的句柄                                       */
/*              uWidth - 画图区宽度                                         */
/*              uHeight - 画图区高度                                        */
/*              wStateOption - 当前编辑窗口的属性参数                       */
/*              uSpace - 行间距。                                           */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  gaolinhui         2006-01-07          创建初始版本                            */
/****************************************************************************/
void __EditDispLineSpace(MEdit *pEdit, UINT uWidth, UINT uHeight, UINT16 wStateOption, UINT uSpace)
{
    UINT    uFontHeight, uLineHeight;
    UINT    y0, xn;     /*显示的开始和结束坐标*/

    uFontHeight = FontGetHeight(pEdit->pmEditInfo->wFontID);
    uLineHeight = uFontHeight + uSpace;/*一行的高度*/

    xn = uWidth - 1;
	if(!(pEdit->pmEditInfo->wState & OF_EDITOR_NOBACKGRND))
	{
		GraphClearRect(pEdit->uX, pEdit->uY, pEdit->uX+pEdit->uWidth-1, pEdit->uY+pEdit->uHeight-1);
	}
    /*对于多行编辑才有行分隔线,才需要清除行与行之间的空白区*/
    if( wStateOption & OF_EDITOR_MULTILINE )
    {
        if( (wStateOption & OF_EDITOR_LINETHREAD) && (uSpace > 0) )
        {   /*如果需要画行分隔线,则画行分隔线*/
            for( y0 = uLineHeight - 1; y0 < uHeight; y0 += uLineHeight )
            {
                GraphDrawLine(pEdit->uX, pEdit->uY+y0, pEdit->uX+xn, pEdit->uY+y0 );
            }
        }

    }
}



⌨️ 快捷键说明

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