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

📄 editlib.c

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