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

📄 editwinproc.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 4 页
字号:
                }
            }
            bHaveProc = TRUE;   //已经处理向下键
            break;
        case MVK_PAGEUP:  //这里只处理同时按了SHIFT键时的翻页键
            if( !bShiftDown )
                break;
            bHaveProc = TRUE;   //标志一定处理了向上翻页键
            if( uOldStart > 0 )
            {
                uTemp = (uOldStart > uDspLines )? uDspLines : uOldStart;
                hEditWin->pmEditInfo->uStart = uOldStart - uTemp;
                __EditGetScrnStart( hEditWin, uOldStart);
            }
            else if( nCurLine > 0 ) /*否则,如果不能上翻页,则将光标上移到第一行*/
            {
                nCurLine = 0;
            }
            //else
            //    hEditWin->uCursorMem = 0; //不能前翻页,则移到第一个字符
            __EditCursorToMemCol(hEditWin, &nCurLine, &nCurCol, uDspCols);
            break;
        case MVK_PAGEDOWN:    //这里只处理同时按了SHIFT键时的翻页键
            if( !bShiftDown )
                break;
            bHaveProc = TRUE;   //标志一定处理了向下翻页键
            if( (uOldStart + 2*uDspLines) <= uDataLines )
                uTemp = uDspLines;
            else if( uOldStart + uDspLines < uDataLines )
                uTemp = uDataLines - uOldStart - uDspLines;
            else
                uTemp = 0;

            if( uTemp > 0 )
            {   /*如果能下翻,则下翻一页*/
				hEditWin->pmEditInfo->uStart = uOldStart + uTemp;
                __EditGetScrnStart( hEditWin, uOldStart);
            }
            //else    //不能前翻页,则移到最后一个之后
            //    hEditWin->uCursorMem = __EditGetStrLength((MDC*)hEditWin, pData, FALSE);

            __EditCursorToMemCol(hEditWin, &nCurLine, &nCurCol, uDspCols);
            break;
        default:
            break;
        }
    }

    if( bHaveProc ) /*只在当前按键已经被处理了的情况下,才需要进行下面的操作*/
    {   //重新给临时变量赋值
        pData = hEditWin->pmEditInfo->pBuf;
        uCursorMem = hEditWin->pmEditInfo->m_CurSor.uCursorMem;

        if( bCanEdit )
        {   //可编辑状态,是连续MARK操作
            hEditWin->pmEditInfo->m_Block.uBlkTail = uCursorMem;
            __EditLineRowChange(hEditWin, hEditWin->pmEditInfo->uUseDspLen + 1, TRUE,TRUE);
        }
        else
        {
            uTemp = hEditWin->pmEditInfo->m_Block.uBlkHead;
            if( !bShiftDown )   //如果是单个字符的MARK操作
                hEditWin->pmEditInfo->m_Block.uBlkHead = uCursorMem;
            else if( hEditWin->pmEditInfo->m_Block.uBlkTail < uTemp )
            {   //如果块尾在前,则可能需要调整块头位置
                if( uCursorMem >= uTemp )
                {   //当由向前MARK改为向后MARK时
                    //uPreLen = __EditGetPreCharMemLen((MDC*)hEditWin,
                    //    pData + hEditWin->uBlockTail, uTemp - hEditWin->uBlockTail);
                    uPreLen = __EditGetPreCharMemLen(wFontID, pData, uTemp);
                    hEditWin->pmEditInfo->m_Block.uBlkHead = uTemp - uPreLen;
                }
            }
            else    //当块头在前时
            {
                __EditGetCharLength( wFontID, pData + uTemp, &uPreLen, NULL );
                //if( (hEditWin->uBlockTail == (uTemp + uPreLen)) && (uCursorMem < uTemp) )
                if( uCursorMem < uTemp )
                {
                    hEditWin->pmEditInfo->m_Block.uBlkHead = uTemp + uPreLen;
                }
            }

            if( uCursorMem  < hEditWin->pmEditInfo->m_Block.uBlkHead )
                uTemp = 0;  //当是往左MARK字符串时,要特殊处理
            else
                __EditGetCharLength( wFontID, pData + uCursorMem, &uTemp, NULL );
            hEditWin->pmEditInfo->m_Block.uBlkTail = uCursorMem + uTemp;
            __EditLineRowChange(hEditWin, hEditWin->pmEditInfo->uUseDspLen + 1, TRUE,TRUE);
        }
		nRet = 1;
    }

    return nRet;
}

/***************************************************************************
 FUNCTION:   __EditKeyProcess											
 DESCRIPTION:处理编辑窗口中的按键移动操作                                
 INPUTS:     pEdit - 编辑窗口句柄						
              uKey - 要处理的虚按键                                       
              bCanEdit - 是否可编辑                                       
 OUTPUTS:    NONE                                                        
 RETURN:     处理了此按键则返回TRUE,否则返回FALSE                       
**************************************************************************
  NAME           DATE               REMARKS                               
 ==========  ============   ==============================================
 gaolinhui       2006-01-12          创建初始版本                            
***************************************************************************/
BOOL __EditKeyProcess(MEdit* pEdit, UINT uKey, BOOL bCanEdit)
{
    MEdit   *hEdit;
    UINT    uDspLines, uDspCols;    //每屏可显示的行数和每行可显示的列数
    INT     nCurLine, nCurCol;      //光标所在的行、列
    UINT    uCharWidth, uCharHeight;//ASCII字符的宽度和高度
    UINT    uCursorMem;             //记忆原来的光标位置
    UINT8   *pData;
    UINT    uOldStart;              //记忆起始位置
    UINT    uOldDspLen;             //记忆原来总的显示长度
    UINT    uDataLines;             //记忆原来总的数据行数
	UINT	uKeyValue;

    UINT    wStateOption;
    UINT    uTempMemLen, uTempDspLen, uTemp;    //临时操作使用的变量
    BOOL    bIsMarking;     /*是否已经有MARK块*/
    BOOL    bHaveProc;


    hEdit = pEdit;
	uKeyValue = READKB_VALUE(uKey);
    wStateOption = hEdit->pmEditInfo->wState ;
    bIsMarking = (hEdit->pmEditInfo->m_Block.uBlkHead != hEdit->pmEditInfo->m_Block.uBlkTail);
    uCursorMem = hEdit->pmEditInfo->m_CurSor.uCursorMem;  /*光标内存位置*/
    pData = hEdit->pmEditInfo->pBuf;
    uOldStart = hEdit->pmEditInfo->uStart;
    uOldDspLen = hEdit->pmEditInfo->uUseDspLen + 1;

    uCharWidth = __EditGetAsciiFontWidth(hEdit->pmEditInfo->wFontID);   /*ASCII字符的宽度*/
    uCharHeight = FontGetHeight(hEdit->pmEditInfo->wFontID);         /*ASCII字符的高度*/
    uDspLines = __EditGetRectLineNum(hEdit->pmEditInfo->wFontID, hEdit->uHeight, hEdit->pmEditInfo->uRowSpace );
                                                            /*每屏能显示的行数*/
    uDspCols = hEdit->uWidth / uCharWidth;					/*编辑器一行能显示的列数*/
    uDataLines = hEdit->pmEditInfo->uDataLines;

    nCurLine = hEdit->pmEditInfo->m_CurSor.wCurLine;
    nCurCol = hEdit->pmEditInfo->m_CurSor.wCurCol;
    if( wStateOption & OF_EDITOR_MULTILINE )
        nCurLine -= uOldStart;
    else
        nCurCol -= uOldStart;


    // 先隐藏隐藏光标
    if( bCanEdit )
        __EditCursorHide(hEdit);

    bHaveProc = FALSE;//初始化为没有处理
    if( !(wStateOption & OF_EDITOR_MULTILINE) )
    {   //对于单行编辑,只能处理左右键,不能处理上下、翻页键
        UINT    uNameLen;       /*标题的显示长度*/

        uNameLen = __EditGetCaptionLen(hEdit->pmEditInfo->pCaption);
        switch( uKeyValue )
        {
        case MVK_LEFT:
            if( !bCanEdit )
                nCurCol = uNameLen;
            __EditFlushSelBlock(hEdit);  //取消MARK块
            /*计算光标处前一字符的显示长度*/
            uTemp = __EditGetPreCharDspLen(hEdit->pmEditInfo->wFontID, pData, (UINT)(nCurCol+uOldStart-uNameLen) );
            if( uTemp > 0 )
            {
                if( nCurCol >= (INT)(uNameLen + uTemp) )
                    nCurCol -= (INT)uTemp;
                else if( uOldStart >= uTemp )
                {   /*移开始显示位置*/
                    hEdit->pmEditInfo->uStart = uOldStart - uTemp;
                    __EditGetScrnStart(hEdit, uOldStart);
                }
                if( bCanEdit )
                    hEdit->pmEditInfo->m_CurSor.uCursorMem = __EditCursorToMemCol( hEdit, &nCurLine, &nCurCol, uDspCols );
                bHaveProc = TRUE;//已经处理左键
            }
            else if( bIsMarking )
                bHaveProc = TRUE;//已经处理左键
            break;
        case MVK_RIGHT:
            if( bCanEdit )
                pData += uCursorMem;
            else
                pData = hEdit->pmEditInfo->pScrnStart;
            __EditFlushSelBlock(hEdit);  //取消MARK块
            __EditGetCharLength( hEdit->pmEditInfo->wFontID, pData, &uTempMemLen, &uTempDspLen);
            if( uTempMemLen > 0 )
            {
                if( bCanEdit )
                    hEdit->pmEditInfo->m_CurSor.uCursorMem += uTempMemLen;
                else if( (uOldStart + uDspCols) <= uOldDspLen )
                    break;
                else
                {   /*移开始显示位置*/
                    hEdit->pmEditInfo->uStart = uOldStart + uTempDspLen;
                    hEdit->pmEditInfo->pScrnStart = pData + uTempMemLen;
                }
                bHaveProc = TRUE;//已经处理右键
            }
            else if( bIsMarking )
                bHaveProc = TRUE;//已经处理右键
            break;
        default:            //其它按键都不予处理
            break;
        }

        if( bHaveProc )
        {
            MsgSend2( (APGUI_STRUCT_MODEL*)hEdit, EVENT_COMMAND, CM_EDITINNER_ROWCHANGED );
            __EditLineRowChange(hEdit, uOldDspLen, TRUE,TRUE);
        }
    }
    else    //否则对于多行编辑,可以处理左、右、上、下、翻页键
    {
        // 先取消MARK块
        __EditFlushSelBlock(hEdit);
        switch( uKeyValue )
        {
        case MVK_LEFT:
            if( !bCanEdit ) //只有在可编辑状态下才处理左光标键
                break;
            uTemp = __EditGetPreCharMemLen( hEdit->pmEditInfo->wFontID, pData, uCursorMem );
            if( uTemp > 0 )
            {
                hEdit->pmEditInfo->m_CurSor.uCursorMem -= uTemp;
                if( hEdit->pmEditInfo->m_CurSor.uCursorMem < (UINT)(hEdit->pmEditInfo->pScrnStart - pData) )
                {
                    hEdit->pmEditInfo->uStart = uOldStart - 1;
                    __EditGetScrnStart(hEdit, uOldStart);
                }
                bHaveProc = TRUE;//已经处理左键
            }
            else if( bIsMarking ) 
                bHaveProc = TRUE;//已经处理左键
            break;
        case MVK_RIGHT:
            if( !bCanEdit ) //只有在可编辑状态下才处理右光标键
                break;
            pData += uCursorMem;
            __EditGetCharLength( hEdit->pmEditInfo->wFontID, pData, &uTempMemLen, NULL);
            if( uTempMemLen > 0 )
            {
                hEdit->pmEditInfo->m_CurSor.uCursorMem += uTempMemLen;
                bHaveProc = TRUE;//已经处理右键
            }
            else if( bIsMarking )
                bHaveProc = TRUE;//已经处理右键
            break;
        case MVK_UP:   /*上移一行*/
            if( !bCanEdit )
                nCurLine = 0;
            if( nCurLine > 0 )
            {   /*如果光标能上移一行*/
                nCurLine -= 1;
                __EditCursorToMemCol(hEdit, &nCurLine, &nCurCol, uDspCols);
                __EditShowCursor(hEdit);
                return TRUE;
            }
            else if( uOldStart > 0 )
            {   /*否则,如果光标在第一行,则上翻一行*/
                hEdit->pmEditInfo->uStart = uOldStart - 1;
                __EditGetScrnStart( hEdit, uOldStart);
                bHaveProc = TRUE;//已经处理此键
            }
            else if( bIsMarking )
                bHaveProc = TRUE;//已经处理此键
            break;
        case MVK_DOWN:   /*下移一行*/
            if( !bCanEdit )
                nCurLine = uDspLines-1;
            if( nCurLine < (INT)(uDspLines-1) )
            {   /*如果光标能下移一行*/
                nCurLine += 1;
                __EditCursorToMemCol(hEdit, &nCurLine, &nCurCol, uDspCols);

⌨️ 快捷键说明

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