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