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

📄 editwinproc.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 4 页
字号:
                __EditShowCursor(hEdit);
                return TRUE;
            }
            else if( uOldStart + uDspLines < uDataLines )
            {   /*否则,如果光标在最后一行,则下翻一行*/				
				hEdit->pmEditInfo->uStart = uOldStart + 1;
				__EditGetScrnStart( hEdit, uOldStart);
                bHaveProc = TRUE;//已经处理此键
            }
            else if( bIsMarking )
                bHaveProc = TRUE;//已经处理此键
            break;
        case MVK_PAGEUP:   /*上翻一页*/
            uTemp = (uOldStart > uDspLines )? uDspLines : uOldStart;
            if( uTemp > 0 )
            {   /*如果能上翻,则上翻一页*/
                hEdit->pmEditInfo->uStart = uOldStart - uTemp;
                __EditGetScrnStart( hEdit, uOldStart);
                bHaveProc = TRUE;//已经处理此键
            }
            /*else if( nCurLine > 0 )
            {   //否则,如果不能上翻页,则将光标上移到第一行/
                nCurLine = 0;
                __EditCursorToMemCol(hEditWin, &nCurLine, &nCurCol, uDspCols);
                __EditShowCursor(hEditWin);
                return TRUE;
            }*/
            else if( bIsMarking )
                bHaveProc = TRUE;//已经处理此键
            break;
        case MVK_PAGEDOWN:   /*下翻一页*/
            if( !bCanEdit )
                nCurLine = uDspLines-1;
            /*计算能下翻的行数*/
            if( (uOldStart + 2*uDspLines) <= uDataLines )
                uTemp = uDspLines;
            else if( (uOldStart + uDspLines) < uDataLines )
                uTemp = uDataLines - uOldStart - uDspLines;
            else
                uTemp = 0;

            if( uTemp > 0 )
            {   /*如果能下翻,则下翻一页*/
                hEdit->pmEditInfo->uStart = uOldStart + uTemp;
                __EditGetScrnStart( hEdit, uOldStart);
                bHaveProc = TRUE;//已经处理此键
            }
            else if( bIsMarking )
                bHaveProc = TRUE;//已经处理此键
            break;
        default:
            break;
        }
        if( bHaveProc )
        {
            MsgSend2((APGUI_STRUCT_MODEL*) hEdit, EVENT_COMMAND, CM_EDITINNER_LINECHANGE);
            if( (uKeyValue == MVK_LEFT) || (uKeyValue == MVK_RIGHT) )
                __EditLineRowChange(hEdit, uOldDspLen, TRUE,TRUE);
            else if( bCanEdit )   /*可编辑状态下要重新设定光标位置*/
                __EditCursorToMemCol( hEdit, &nCurLine, &nCurCol, uDspCols);
        }
    }

    if( bHaveProc && (hEdit->pmEditInfo->uStart != uOldStart) )
    {   /*开始位置改变了,则要重绘视图,*/
        //MsgPost(hEditWin, EV_DRAW, 0, 0, NULL);
        MsgSend2((APGUI_STRUCT_MODEL*)hEdit, EVENT_DRAW, 0);
    }
    else if( bCanEdit )
        __EditShowCursor(hEdit);

    return bHaveProc;
}


/****************************************************************************/
/* FUNCTION:   __EditDeleteProc                                            */
/* DESCRIPTION:删除字符的处理                                              */
/* INPUTS:     hEditWin - 控件句柄                                         */
/*              bSendDataChange - 标志是否发送数据改变的消息                */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/* gaolinhui    2005-1-6-12			为ED132修改								*/
/****************************************************************************/
VOID __EditDeleteProc(MEdit* hEditWin, BOOL bSendDataChange )
{
    UINT8   *pDataBuf;
    UINT8   *pSrc,*pDest;                   /*移动数据的源地址和目标地址*/
    UINT    uShiftLen,uDelMemLen,uDelDspLen;    /*移动数据的长度,删除数据的长度*/
    UINT    uHead, uTail, uOldDspLen;   /*选择块的内存头和尾,原来的显示长度*/
    UINT    uTemp;
    BOOL    bChange, bCancelMark,bScrnStart;

    /*初始化变量*/
    bScrnStart = FALSE;     /*用于判断hEditWin->pScrnStart之前的数据是否被改变*/
    pDataBuf = hEditWin->pmEditInfo->pBuf;
    bChange = FALSE;
	bCancelMark = FALSE;
    uOldDspLen = hEditWin->pmEditInfo->uUseDspLen + 1;
    uDelMemLen = 0;
    uDelDspLen = 0;
    uHead = hEditWin->pmEditInfo->m_Block.uBlkHead;
    uTail = hEditWin->pmEditInfo->m_Block.uBlkTail;
    if( uHead > uTail )
    {
        uHead = uTail;
        uTail = hEditWin->pmEditInfo->m_Block.uBlkHead;
    }
    if( uHead != uTail )
    {   /*如果有选择块,则删除选择块*/
        pDest = pDataBuf + uHead;
        pSrc = pDataBuf + uTail;
        uTemp = uTail - uHead;
        uDelDspLen = __EditMemLenToDsp(hEditWin->pmEditInfo->wFontID,pDest,&uTemp );
        uDelMemLen = uTail - uHead;
        uShiftLen = hEditWin->pmEditInfo->uUseMemLen - uTail;
        memmove(pDest,pSrc,uShiftLen);
        hEditWin->pmEditInfo->m_Block.uBlkHead = 0;
        hEditWin->pmEditInfo->m_Block.uBlkTail = 0;
        /*新光标位置*/
        hEditWin->pmEditInfo->m_CurSor.uCursorMem = uHead;
        bChange = TRUE;
        bCancelMark = TRUE;
        /*判断hEditWin->pScrnStart之前的数据是否被改变*/
        if( (uHead+pDataBuf) > hEditWin->pmEditInfo->pScrnStart )
        {
            bScrnStart = TRUE;
        }
    }
    else if( pDataBuf[hEditWin->pmEditInfo->m_CurSor.uCursorMem] == 0 )
    {
        return;
    }
    else
    {   /*删除当前光标字符*/
        pDest = pDataBuf + hEditWin->pmEditInfo->m_CurSor.uCursorMem;
        __EditGetCharLength(hEditWin->pmEditInfo->wFontID, pDest, &uDelMemLen, &uDelDspLen );
        pSrc = pDataBuf + hEditWin->pmEditInfo->m_CurSor.uCursorMem+uDelMemLen;
        uShiftLen = hEditWin->pmEditInfo->uUseMemLen - hEditWin->pmEditInfo->m_CurSor.uCursorMem;
        memmove(pDest,pSrc,uShiftLen);
        bChange = TRUE;
        /*判断hEditWin->pScrnStart之前的数据是否被改变*/
        if( (hEditWin->pmEditInfo->m_CurSor.uCursorMem+pDataBuf) > hEditWin->pmEditInfo->pScrnStart )
        {
            bScrnStart = TRUE;
        }
        hEditWin->pmEditInfo->m_Block.uBlkHead = 0;
        hEditWin->pmEditInfo->m_Block.uBlkTail = hEditWin->pmEditInfo->m_Block.uBlkHead;
    }
    hEditWin->pmEditInfo->uUseMemLen -= uDelMemLen;
    hEditWin->pmEditInfo->uUseDspLen = uOldDspLen - uDelDspLen - 1;

//********************************gaolinhui,06.2.14 为了单行编辑器删除时光标不动**********************************************
	if(bChange && bScrnStart && !(hEditWin->pmEditInfo->wState & OF_EDITOR_MULTILINE) )
	{
		if(hEditWin->pmEditInfo->uStart > 0)
		{
			UINT16	wFontID;
			UINT	uDspLen,uMemLen,uTmpMem;
			UINT	uSftCount;
			UINT8*	pBuf;
			UINT	uOff;
			//移动的字节数等于删除的字节数,如果行首的偏移小于删除字节数
			//移动字节数等于行首的偏移.
			uMemLen = hEditWin->pmEditInfo->pScrnStart - hEditWin->pmEditInfo->pBuf;
			uSftCount = (uMemLen >= uDelMemLen)?uDelMemLen:uMemLen;
			//初始化变量
			pBuf = hEditWin->pmEditInfo->pBuf;
			wFontID = hEditWin->pmEditInfo->wFontID;
			//从行首处开始向前计算移动的字节数
			uDspLen = 0;
			uMemLen = 0;
			uTmpMem = 0;
			uOff = hEditWin->pmEditInfo->pScrnStart - pBuf;;
			while(uMemLen+uTmpMem <= uSftCount)
			{
				uMemLen += uTmpMem;
				if(uOff == 0)
				{
					break;
				}
				uTmpMem = __EditGetPreCharMemLen(wFontID,pBuf,uOff);
				uOff -= uTmpMem;
			}
			//更新行首的起始位置
			hEditWin->pmEditInfo->pScrnStart -= uMemLen;
			//计算移动的显示长度
			uDspLen = __EditMemLenToDsp(wFontID,hEditWin->pmEditInfo->pScrnStart,&uMemLen);
			//更新起始的列号
			hEditWin->pmEditInfo->uStart -= uDspLen;

			if((hEditWin->pmEditInfo->m_CurSor.uCursorMem+pDataBuf) > hEditWin->pmEditInfo->pScrnStart)
			{
				bScrnStart = TRUE;
			}
		}
	}
//***********************************************************************************


    if( bChange )
    {
        hEditWin->pmEditInfo->wState |= SF_EDITOR_MODIFIED;
        __EditLineRowChange( hEditWin, uOldDspLen, bScrnStart,TRUE ); /*处理行列发生变化*/
        if( bSendDataChange )
        {   /*往外发送数据改变消息和是否取消选择块的消息*/
			g_mEdtCmdEx.uType = CMEX_EDITOR_DATACHANGED;
			g_mEdtCmdEx.pEditHdl = (APGUI_STRUCT_MODEL*)hEditWin;				
			g_mEditCmdParam.wCmdType = EVENT_CMDEXP_EDT;
			g_mEditCmdParam.pCmdExp = &g_mEdtCmdEx;
			MsgSend2( GetApHandle(), EVENT_CMDEXP, (UINT)&g_mEditCmdParam);
            if( bCancelMark )
            {
				g_mEdtCmdEx.uType = CMEX_EDITOR_CANCELMARK;
				g_mEdtCmdEx.pEditHdl = (APGUI_STRUCT_MODEL*)hEditWin;				
				g_mEditCmdParam.wCmdType = EVENT_CMDEXP_EDT;
				g_mEditCmdParam.pCmdExp = &g_mEdtCmdEx;
				MsgSend2( GetApHandle(), EVENT_CMDEXP, (UINT)&g_mEditCmdParam);
            }
        }
    }
}


/****************************************************************************/
/* FUNCTION:   __EditAddStringProc                                         */
/* DESCRIPTION:编辑器增加字符处理                                          */
/* INPUTS:     hEditWin - 控件句柄                                         */
/*              pData - 字符(串)指针                                        */
/*              uDataLen - 数据长度(为零表示取整个字符串)                   */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  gaolinhui         2006-01-3          创建初始版本                       */
/****************************************************************************/
VOID __EditAddStringProc(MEdit *hEditWin, UINT8* pData, UINT uDataLen)
{
    UINT8   *pBuf, *pDest, *pSrc;
    UINT16	wStateOption;
    UINT    uChange;                    /*数据是否改变标志*/
    UINT    uBlockMemLen, uBlockDspLen; /*选择块的内存和显示长度*/
    UINT    uOldMemLen, uOldDspLen;     /*编辑数据的内存和显示长度*/
    UINT    uCursorMem, uCursorMemBak;  /*光标的内存位置*/
    UINT    uHead, uTail, uTemp;
    UINT    uDataDspLen, uDataMemLen, uLeaveMemLen, uLeaveDspLen;
    BOOL    bScrnStart, bHaveBlock;

    wStateOption = hEditWin->pmEditInfo->wState;

    /*判断字符的合法性*/
    __EditStrValidLenCheck(hEditWin->pmEditInfo->wFontID , hEditWin->pmEditInfo->wAllowChar, 
		pData, uDataLen, &uDataDspLen, &uDataMemLen);
    if( uDataMemLen == 0 )
    {
        return;
    }

    pBuf = hEditWin->pmEditInfo->pBuf;

    if( __EditGetSel( hEditWin, &uHead, &uTail ) )
    {   /*pBuf中选择块数据的内存长度*/
        uBlockMemLen = uTail - uHead;
        /*pBuf中选择块数据的显示长度*/
        uBlockDspLen = __EditMemLenToDsp(hEditWin->pmEditInfo->wFontID, pBuf+uHead, &uBlockMemLen );
    }
    else
    {
        uHead = 0;
        uTail = 0;
        uBlockMemLen = 0;
        uBlockDspLen = 0;
    }
    /*pBuf中数据的显示长度*/
    uOldDspLen = hEditWin->pmEditInfo->uUseDspLen;
    uLeaveDspLen = hEditWin->pmEditInfo->uMaxEditLen - uOldDspLen + uBlockDspLen;

⌨️ 快捷键说明

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