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

📄 editwinproc.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 4 页
字号:
/***************************************************************************
                                                                          
              Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD                   
                                                                          
 FILE NAME:   EditWinProc.C                                                   
 MODULE NAME: Edit                                                        
 DESCRIPTION: 编辑器按键和字符输入的处理函数                            
 对外函数声明:

 内部函数声明: 
		编辑器字符串(字符)输入操作
		VOID __EditAddStringProc(MEdit *hEditWin, UINT8* pData, UINT uDataLen);
        删除字符(mark)子程序
		VOID __EditDeleteProc(MEdit* hEditWin, BOOL bSendDataChange );
		按键消息处理
		BOOL __EditKeyProcess(MEdit* pEdit, UINT uKey, BOOL bCanEdit);
		处理编辑器行列变化的子程序
		VOID __EditLineRowChange(MEdit *hEditWin,UINT uOldDspLen,BOOL bScrnStart,BOOL bReDraw);

**************************************************************************
    DTAE       AUTHOR     VERSION                 REMARKS                 
 =========== ==========  =========  ======================================
 2006-11-31    gaolinhui    V1.0     create                                
***************************************************************************/

#include "kernel.h"
#include "EditIn.h"

extern		EdtCmdEx    g_mEdtCmdEx;		//编辑器的扩展命令类型
extern		CMDEXP		g_mEditCmdParam;

/****************************************************************************/
/* FUNCTION:   __EditBeforCanMarkMemDist                                   */
/* DESCRIPTION:找到前一可MARK字符/单词的位置                               */
/* INPUTS:     pEdit - 编辑器句柄                                          */
/*              pData - 整个字符串的起始地址                                */
/*              uPos - 要搜索的起始地址                                     */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     返回距离当前位置的距离                                      */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/****************************************************************************/
UINT __EditBeforCanMarkMemDist(MEdit* pEdit, UINT8 *pData, UINT uPos)
{
    UINT    uLen, uWordLen, uPreCanMarkPos;
    BOOL    bPreIsLetter;

    if( uPos == 0 )
    {
        return 0;
    }
    uLen = 0;
    uWordLen = 0;
    uPreCanMarkPos = uPos;
    bPreIsLetter = FALSE;
    do
    {
        uLen += uWordLen;
        if( pData[uLen] != CHAR_RETURN )
            uPreCanMarkPos = uLen;

        __EditGetCharLength(pEdit->pmEditInfo->wFontID, &pData[uLen], &uWordLen, (UINT*)NULL);
        /*if( uWordLen == 0 )
            break;*/
    }while( uLen + uWordLen < uPos );

    return (uPos - uPreCanMarkPos);
}

/****************************************************************************/
/* FUNCTION:   __EditAfterCanMarkMemPos                                    */
/* DESCRIPTION:找到后一可MARK字符/单词的位置                               */
/* INPUTS:     pEdit - 编辑器句柄                                          */
/*              pData - 整个字符串的起始地址                                */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     返回距离当前位置的距离                                      */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/****************************************************************************/
UINT __EditAfterCanMarkMemPos(MEdit *pEdit, UINT8 *pData)
{
    UINT    uLen, uWordLen, uPreCanMarkPos;
    BOOL    bPreIsLetter;

    uLen = 0;
    uWordLen = 0;
    uPreCanMarkPos = 0;
    bPreIsLetter = FALSE;
    while( pData[uLen] != 0 )
    {
        __EditGetCharLength(pEdit->pmEditInfo->wFontID, &pData[uLen], &uWordLen, (UINT*)NULL);
        bPreIsLetter = FALSE;
        uLen += uWordLen;
        if( (pData[uLen] != CHAR_RETURN) && (pData[uLen] != 0)  )
        {
            return uLen;
        }
    }

    return 0;
}

/****************************************************************************/
/* FUNCTION:   __EditWinProcKeyMark                                        */
/* DESCRIPTION:处理按键的MARK块操作                                        */
/* INPUTS:     hEditWin - 编辑窗口句柄                                     */
/*              pEvent - 要处理的按键消息                                   */
/*              bCanEdit - 是否可编辑                                       */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     设置成功返回TRUE,否则返回FALSE                             */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/****************************************************************************/
INT __EditWinProcKeyMark(MEdit *hEditWin, UINT uKey, BOOL bCanEdit)
{
    BOOL    bShiftDown;

    UINT8   *pData;
    UINT    uCursorMem;
    UINT    uPreLen, uTemp,uKeyValue;
	UINT16  wFontID;

    BOOL    bIsMarking, bMultiLine;
    UINT8   byTempChar;
    BOOL    bHaveProc;
	INT		nRet = 0;

    if( hEditWin->pmEditInfo->wState & OF_EDITOR_NOMARK )
        return nRet;  //如果不允许MARK操作,则不继续进行下面的操作
    if( hEditWin->pmEditInfo->wState & OF_EDITOR_PASSWORD )
        return nRet;  //密码编辑中不允许MARK操作,则不继续进行下面的操作
	
	uKeyValue = READKB_VALUE(uKey);
	bShiftDown = READKB_SHIFTMASK(uKey);	
	wFontID = hEditWin->pmEditInfo->wFontID;
    bIsMarking = (hEditWin->pmEditInfo->m_Block.uBlkHead != hEditWin->pmEditInfo->m_Block.uBlkTail);
    uCursorMem = hEditWin->pmEditInfo->m_CurSor.uCursorMem;  /*光标内存位置*/

    if( bCanEdit )
    {
        if( !bShiftDown )
            return nRet;  //可编辑状态下只有当同时按下了SHIFT键时,才能进行MARK操作;
        if( !bIsMarking )
        {   /*如果为开始MARK状态,即之前不是MARK状态,则表示从当前光标位置开始MARK*/
            hEditWin->pmEditInfo->m_Block.uBlkHead = uCursorMem;
            hEditWin->pmEditInfo->m_Block.uBlkTail = uCursorMem;
        }
    }
    else 
    {	
		if( !bIsMarking )
		{
			if( !bShiftDown || (uKeyValue != MVK_RIGHT) )
				return nRet;
		}
    }

    pData = hEditWin->pmEditInfo->pBuf;
    bMultiLine = (hEditWin->pmEditInfo->wState & OF_EDITOR_MULTILINE);

    bHaveProc = FALSE;
    //处理左移方向键
    if( uKeyValue == MVK_LEFT )
    {   /*计算光标处前一字符的显示长度*/
        if( uCursorMem > 0 )
        {
            uPreLen = __EditGetPreCharMemLen(wFontID, pData, uCursorMem);
            hEditWin->pmEditInfo->m_CurSor.uCursorMem = uCursorMem - uPreLen;
            bHaveProc = TRUE;
        }
        else// if( bShiftDown ) //如果所有的左移键都清除,则光标是第一个字符时左移也不取消MARK块
            bHaveProc = TRUE;
    }
    //处理右移方向键
    else if( uKeyValue == MVK_RIGHT )
    {
        if( !bCanEdit && !bIsMarking )  //只读非MARK状态,则开始MARK;
        {
            //pData = hEditWin->pScrnStart;
            hEditWin->pmEditInfo->m_CurSor.uCursorMem = (UINT)(hEditWin->pmEditInfo->pScrnStart - hEditWin->pmEditInfo->pBuf);
            bHaveProc = TRUE;
        }
        else
        {
            pData += uCursorMem;
            /*当当前位置字符不是结尾字符时,才有移动的可能*/
            while( *pData != 0 )
            {   //计算新的光标位置
                //先得到当前光标位置字符的内存长度
                __EditGetCharLength( wFontID, pData, &uTemp, NULL );
                if( !bCanEdit )
                {
                    byTempChar = *(pData + uTemp);
                    if( byTempChar == 0 )
                        break;  //只读状态不能移到最后一个字符之后
                }
                hEditWin->pmEditInfo->m_CurSor.uCursorMem = uCursorMem + uTemp;
                bHaveProc = TRUE;
                break;
            }
        }
        //if( bShiftDown )
        //    pEvent->dwMsgType = EV_NOTHING;
    }
    //对于上、下、翻页键,只有多行编辑时才能处理
    else if( bMultiLine )
    {   /*只有多行编辑才有对上下按键的操作*/
        UINT    uDspLines, uDspCols;/*每屏可显示的行数和每行可显示的列数*/
        UINT    uOldStart, uDataLines;
        INT     nCurLine, nCurCol;

        //// 2003.11.20 ////
        INT    nCurLineBak;
        ////////////////////

        uDspCols = (hEditWin->uWidth / __EditGetAsciiFontWidth(wFontID));
                            /*编辑器一行能显示的列数*/
        uDspLines = __EditGetRectLineNum(wFontID, hEditWin->uHeight, hEditWin->pmEditInfo->uRowSpace );/*每屏能显示的行数*/
        uOldStart = hEditWin->pmEditInfo->uStart;
        uDataLines = hEditWin->pmEditInfo->uDataLines;
        __EditMemColToCursor(hEditWin, uCursorMem, &nCurLine, &nCurCol, FALSE, TRUE);
        //// 2003.11.20 ////
        nCurLineBak = nCurLine;
        ////////////////////
        switch( uKeyValue )
        {
        case MVK_UP:
            if( (nCurLine == 0) && (uOldStart == 0 ) )
            {
                if( bShiftDown )
					break;   /*光标在第一行,不能往上移动*/
            }

            bHaveProc = TRUE;   //否则一定可以处理向上键
            if( nCurLine > 0 )  //如果光标能上移一行,则优先移光标
                nCurLine -= 1;
            else //if( uOldStart > 0 )
            {   /*否则,如果光标在第一行,则上翻一行*/
                hEditWin->pmEditInfo->uStart = uOldStart - 1;
                __EditGetScrnStart(hEditWin, uOldStart);
            }
            __EditCursorToMemCol(hEditWin, &nCurLine, &nCurCol, uDspCols);
            break;
        case MVK_DOWN:
            if( (nCurLine < (INT)(uDspLines-1)) && (uOldStart + nCurLine + 1 < uDataLines) )
            {   /*如果光标能下移一行*/
                nCurLine += 1;
            }
            else if( uOldStart + uDspLines < uDataLines )
            {   /*否则,如果光标在最后一行,则下翻一行*/
                hEditWin->pmEditInfo->uStart = uOldStart + 1;
                __EditGetScrnStart(hEditWin, uOldStart);
            }
            else    //???这里是否需要判断由连续MARK转为单个MARK的情况,则此时需要处理
            {
                break;
            }

            __EditCursorToMemCol(hEditWin, &nCurLine, &nCurCol, uDspCols);
            if( !bCanEdit )
            {
                byTempChar = *(pData + hEditWin->pmEditInfo->m_CurSor.uCursorMem);
                if( byTempChar == 0)
                {  //只读状态不能移到最后一个字符之后
                    uTemp = __EditGetPreCharMemLen( wFontID,
                        pData + uCursorMem, hEditWin->pmEditInfo->m_CurSor.uCursorMem - uCursorMem );
                    hEditWin->pmEditInfo->m_CurSor.uCursorMem  -= uTemp;
                    //// 2003.11.20 ////
                    if( (uTemp == 1) && (pData[hEditWin->pmEditInfo->m_CurSor.uCursorMem] == CHAR_RETURN) &&
                        (nCurLineBak == (INT)(uDspLines-2)) )
                    {
                        //__EditMemColToCursor(hEditWin, hEditWin->uCursorMem, &nCurLine, &nCurCol, FALSE, TRUE);
                        break;
                    }
                    ////////////////////

⌨️ 快捷键说明

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