📄 editlib.c
字号:
}
}
else
{
if( !(uAllowChar & EDITALLOW_SYMBOL) )
{ /*是除数字英文字符外的可打印字符,且不允许输入*/
break;
}
}
if( (uMemLen + uTempMemLen) > uDataLen )
{
break;
}
uMemLen += uTempMemLen;
uDspLen += uTempDspLen;
pData += uTempMemLen;
uFirstChar = *pData;
}
if( pMemLen != (UINT*)NULL )
{
*pMemLen = uMemLen;
}
if( pDspLen != (UINT*)NULL )
{
*pDspLen = uDspLen;
}
return bHaveExChar;
}
/****************************************************************************/
/* FUNCTION: __EditCursorToMemCol */
/* DESCRIPTION:由光标位置得到内存位置,并调整光标位置 */
/* INPUTS: hEditWin - 编辑框句柄 */
/* pCurLine - 光标行(屏幕上的行) */
/* pCurCol - 光标列(屏幕上的列) */
/* uDspCols - 编辑框一行能显示的列数 */
/* OUTPUTS: NONE */
/* RETURN: 当前光标位置字符在数据缓冲区中的位置uCursorMem */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Xie 2001-04-23 创建初始版本 */
/* gaolinhui 2005-12-21 移植ED132 */
/****************************************************************************/
UINT __EditCursorToMemCol(MEdit *hEditWin, INT *pCurLine, INT *pCurCol, UINT uDspCols)
{
UINT16 wStateOption;
UINT uCaptionLen, uStart;
UINT uLineWidth, uMemLen, uTmpMem, uTmpDsp, uCharLen;
INT nLine, nCol, i;
UINT8 *pData;
uStart = hEditWin->pmEditInfo->uStart;
wStateOption = hEditWin->pmEditInfo->wState;
uCaptionLen=__EditGetCaptionLen(hEditWin->pmEditInfo->pCaption);
if( (wStateOption & OF_EDITOR_MULTILINE) && (uStart!= 0) )
{
uCaptionLen = (UINT8)(hEditWin->pmEditInfo->uIndent);
}
uLineWidth = uDspCols - uCaptionLen;
/*整理行列号*/
nCol = *pCurCol;
if( !(wStateOption & OF_EDITOR_MULTILINE) )
{ /*如果是单行编辑*/
// nCol = *pCurCol + uStart;
if( nCol < (INT)uCaptionLen )
{
nCol = uCaptionLen;
}
}
else /*是多行编辑*/
{
/*计算出光标位置行在整个文本中实际的位置行*/
nLine = *pCurLine + (UINT16)uStart; /*加上显示开始行前面的行数*/
if( nCol >= (INT)uDspCols )
{
nCol = uDspCols-1;
}
if( nLine < 0 )
{
nLine = 0;
}
if( nLine == 0 && nCol < (INT)uCaptionLen )
{
nCol = uCaptionLen;
}
else if( nLine > 0 && nCol < (UINT8)hEditWin->pmEditInfo->uIndent )
{
nCol = (UINT8)hEditWin->pmEditInfo->uIndent;
}
else if( nLine >= (UINT16)(hEditWin->pmEditInfo->uDataLines) )
{
nLine = (UINT16)(hEditWin->pmEditInfo->uDataLines-1);
nCol = (UINT16)(uDspCols-1);
}
}
pData = hEditWin->pmEditInfo->pScrnStart; /*初始化参数*/
uMemLen = pData - hEditWin->pmEditInfo->pBuf;
if( wStateOption & OF_EDITOR_MULTILINE)
{ /*对于多行编辑, 要除去当前之前的行占用的内存*/
uTmpMem = 0;
for( i=uStart; i<nLine; i++ )
{ /*得到一行的内存长度*/
uTmpDsp = uLineWidth;
uTmpMem = __EditDspPosToMem( hEditWin->pmEditInfo->wFontID ,pData, &uTmpDsp );
if( pData[uTmpMem] == CHAR_RETURN && uTmpDsp < uLineWidth )
{
uTmpMem++;
}
uMemLen += uTmpMem;
pData += uTmpMem;
uCaptionLen = (UINT8)(hEditWin->pmEditInfo->uIndent);
uLineWidth = uDspCols - uCaptionLen;
}
}
/*单行编辑与多行编辑都要处理当前光标行*/
/*计算当前行中光标位置*/
if( !(wStateOption & OF_EDITOR_MULTILINE))
{ /*是单行编辑,只有一行*/
nCol -= uCaptionLen;
uMemLen += __EditDspPosToMem( hEditWin->pmEditInfo->wFontID,pData,&nCol );
/* *pCurCol = nCol + uCaptionLen - uStart; /返回在屏幕上的行和列*/
*pCurCol = nCol + uCaptionLen; /*返回在屏幕上的行和列*/
*pCurLine = 0;
hEditWin->pmEditInfo->m_CurSor.uCursorMem = uMemLen;
}
else
{ /*是多行编辑,*/
nCol -= uCaptionLen;
uTmpMem = __EditDspPosToMem( hEditWin->pmEditInfo->wFontID ,pData, &nCol );
__EditGetCharLength(hEditWin->pmEditInfo->wFontID, &pData[uTmpMem], (UINT*)NULL, &uCharLen);
if( nCol + uCharLen > uLineWidth )
{ /*如果光标位置在行尾未能显示的字符上,则光标应该停在最后能显示的字符上*/
nCol -= 1;
uTmpMem = __EditDspPosToMem( hEditWin->pmEditInfo->wFontID,pData, &nCol );
}
*pCurLine = nLine - uStart;
*pCurCol = nCol + uCaptionLen;
hEditWin->pmEditInfo->m_CurSor.uCursorMem = uMemLen + uTmpMem;
}
hEditWin->pmEditInfo->m_CurSor.wCurLine = *pCurLine;
hEditWin->pmEditInfo->m_CurSor.wCurCol = *pCurCol;
if( wStateOption & OF_EDITOR_MULTILINE )
{ /*如果是多行编辑,uStart是起始行*/
hEditWin->pmEditInfo->m_CurSor.wCurLine = *pCurLine + hEditWin->pmEditInfo->uStart;
}
else
{ /*如果是单行编辑,uStart是起始列*/
hEditWin->pmEditInfo->m_CurSor.wCurCol = *pCurCol + hEditWin->pmEditInfo->uStart;
}
return hEditWin->pmEditInfo->m_CurSor.uCursorMem;
}
/****************************************************************************/
/* FUNCTION: __EditMemColToCursor */
/* DESCRIPTION:由内存位置得到光标位置 */
/* INPUTS: hEditWin - 编辑框句柄 */
/* uMemCol - 内存缓冲区位置 */
/* bChangeCursor - 标志是否改变编辑框中的光标行列位置 */
/* bScrnStart - 标志是否可以从当前屏幕起始位置开始计算 */
/* OUTPUTS: pCurLine - 光标行 */
/* pCurCol - 光标列 */
/* RETURN: NONE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Xie 2001-04-23 创建初始版本 */
/****************************************************************************/
VOID __EditMemColToCursor(MEdit *hEditWin,UINT uMemCol, INT *pCurLine, INT *pCurCol, BOOL bChangeCursor,BOOL bScrnStart)
{
INT nDspLine;
UINT uStart, uPreLen, uCols, uDspLen, uMemLen, uTemp, uLineWidth;
UINT8 *pData;
UINT16 wStateOption;
wStateOption = hEditWin->pmEditInfo->wState ;
uStart = hEditWin->pmEditInfo->uStart;
/*标题字符串长度*/
uPreLen = __EditGetCaptionLen(hEditWin->pmEditInfo->pCaption);
pData = hEditWin->pmEditInfo->pBuf;
if( bScrnStart && (uMemCol >= (UINT)(hEditWin->pmEditInfo->pScrnStart - pData)) )
{
if( ( wStateOption & OF_EDITOR_MULTILINE) && (uStart!= 0) )
{
uPreLen = hEditWin->pmEditInfo->uIndent;
}
pData = hEditWin->pmEditInfo->pScrnStart;
uStart = 0;
uMemCol = uMemCol - (pData - hEditWin->pmEditInfo->pBuf);
}
if(!(wStateOption & OF_EDITOR_MULTILINE))
{ /*单行编辑*/
*pCurLine = 0;
/*得出实际在内存中的列*/
*pCurCol = __EditMemLenToDsp( hEditWin->pmEditInfo->wFontID , pData, &uMemCol);
/*得出在屏幕上的列*/
*pCurCol = (INT16)(*pCurCol - uStart + uPreLen);
}
else
{ /*多行编辑*/
nDspLine = 0;
uCols = hEditWin->uWidth / __EditGetAsciiFontWidth(hEditWin->pmEditInfo->wFontID);
uLineWidth = uCols - uPreLen;
uDspLen = uLineWidth;
uMemLen = __EditDspPosToMem(hEditWin->pmEditInfo->wFontID, pData, &uDspLen );
if( uMemLen > uMemCol )
{
uMemLen = uMemCol;
uDspLen = __EditMemPosToDsp( hEditWin->pmEditInfo->wFontID, pData, &uMemLen );
uMemCol = uMemLen;
}
while( (uMemLen < uMemCol) || (uDspLen == uLineWidth) )
{
if( (pData[uMemLen] == CHAR_RETURN) && (uDspLen < uLineWidth) )
{
uMemLen++;
}
if( uMemLen == 0 )
{
break;
}
nDspLine++;
pData += uMemLen;
uMemCol -= uMemLen;
uPreLen = hEditWin->pmEditInfo->uIndent;
uLineWidth = uCols - uPreLen;
uDspLen = uLineWidth;
uMemLen = __EditDspPosToMem( hEditWin->pmEditInfo->wFontID, pData, &uDspLen );
if( uMemLen > uMemCol )
{
uMemLen = uMemCol;
uDspLen = __EditMemPosToDsp( hEditWin->pmEditInfo->wFontID, pData, &uMemLen );
uMemCol = uMemLen;
}
}
pData += uMemLen;
__EditGetCharLength( hEditWin->pmEditInfo->wFontID, pData,(UINT*)NULL, &uTemp);
if( (uDspLen + uTemp > uLineWidth) && (uTemp > 1) )
{ /*光标在上一行末尾处不能完整显示的字符处*/
nDspLine++;
uPreLen = hEditWin->pmEditInfo->uIndent;
uDspLen = 0;
}
nDspLine -= uStart;
*pCurLine = nDspLine;
*pCurCol = uDspLen + uPreLen;
}
if( bChangeCursor )
{
hEditWin->pmEditInfo->m_CurSor.wCurLine = *pCurLine;
hEditWin->pmEditInfo->m_CurSor.wCurCol = *pCurCol;
if( wStateOption & OF_EDITOR_MULTILINE )
{ /*如果是多行编辑,uStart是起始行*/
hEditWin->pmEditInfo->m_CurSor.wCurLine = *pCurLine + (INT16)(hEditWin->pmEditInfo->uStart);
}
else
{ /*如果是多行编辑,uStart是起始列*/
hEditWin->pmEditInfo->m_CurSor.wCurCol = *pCurCol + (INT16)(hEditWin->pmEditInfo->uStart);
}
}
}
/****************************************************************************/
/* FUNCTION: __EditGetSel */
/* DESCRIPTION:得到编辑控件(多域编辑中当前编辑域)中选择块的起始和结尾位置 */
/* INPUTS: hEditor-编辑控件句柄 */
/* OUTPUTS: pStartChar - 选择块的起始位置 */
/* pEndChar - 选择块的结尾位置 */
/* RETURN: 有选择块,返回True;否则返回False */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Xie 2001-04-23 创建初始版本 */
/****************************************************************************/
BOOL __EditGetSel(MEdit *hEditor, UINT *pStartChar, UINT *pEndChar)
{
UINT uStart, uEnd;
UINT uHead,uTail;
uHead = hEditor->pmEditInfo->m_Block.uBlkHead;
uTail = hEditor->pmEditInfo->m_Block.uBlkTail;
if( uHead == uTail )
{ /*没有选择块*/
return FALSE;
}
else
{ /*有选择块,返回值*/
if( uHead < uTail )
{
uStart = uHead;
uEnd = uTail;
}
else
{
uStart = uTail;
uEnd = uHead;
}
*pStartChar = uStart;
*pEndChar = uEnd;
return TRUE;
}
}
/****************************************************************************/
/* FUNCTION: __EditFlushSelBlock */
/* DESCRIPTION:取消选择块 */
/* INPUTS: hEditWin - 编辑框句柄 */
/* OUTPUTS: NONE */
/* RETURN: NONE */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* Xie 2001-04-23 创建初始版本 */
/****************************************************************************/
void __EditFlushSelBlock(MEdit *hEditWin)
{
UINT uBlockHead, uBlockTail;
uBlockHead = hEditWin->pmEditInfo->m_Block.uBlkHead;
uBlockTail = hEditWin->pmEditInfo->m_Block.uBlkTail;
if( uBlockHead == uBlockTail )
{
return;
}
/*正常显示选择块*/
__EditDispBlockStr(hEditWin, uBlockHead, uBlockTail, FALSE);
hEditWin->pmEditInfo->m_Block.uBlkHead = 0;
hEditWin->pmEditInfo->m_Block.uBlkTail = 0;
g_mEdtCmdEx.uType = CMEX_EDITOR_CANCELMARK;
g_mEdtCmdEx.pEditHdl = (APGUI_STRUCT_MODEL*)hEditWin;
g_mEditCmdParam.wCmdType = EVENT_CMDEXP_EDT;
g_mEditCmdParam.pCmdExp = &g_mEdtCmdEx;
MsgPost( GetApHandle(), EVENT_CMDEXP, (INT)&g_mEditCmdParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -