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

📄 editwinproc.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 4 页
字号:
    uChange = 0;
    if( uLeaveDspLen < uDataDspLen )
    {
        uChange |= EDITOR_DISPFULL;
        uDataDspLen = uLeaveDspLen;
        uDataMemLen = __EditDspLenToMem(hEditWin->pmEditInfo->wFontID , pData, &uDataDspLen );
    }
    if( uDataDspLen > 0 )   /*2001.12.11 change: 回车符算一个显示长度*/
    {
            pBuf = hEditWin->pmEditInfo->pBuf;
            uCursorMemBak = hEditWin->pmEditInfo->m_CurSor.uCursorMem;
            if( bHaveBlock = __EditGetSel(hEditWin, &uHead, &uTail) )
            {
                uBlockMemLen = uTail - uHead;
            }

            /*pBuf中数据的内存长度和显示长度*/
            uOldMemLen = hEditWin->pmEditInfo->uUseMemLen;
            /*得到编辑器剩余的内存和显示长度*/
            uLeaveMemLen = hEditWin->pmEditInfo->uBufLen - uOldMemLen + uBlockMemLen;
            /*得到能添加的数据内存和显示长度*/
			if( bHaveBlock )
            {
				hEditWin->pmEditInfo->m_CurSor.uCursorMem = uHead;
            }
            if( uDataMemLen > uLeaveMemLen )
            {   /*如果还是空间不够*/
                uChange |= EDITOR_BUFFERFULL;
                uDataMemLen = uLeaveMemLen;
                uDataDspLen = __EditMemLenToDsp(hEditWin->pmEditInfo->wFontID , pData, &uDataMemLen );
             }
             /*得到新的光标位置*/
             uCursorMem = hEditWin->pmEditInfo->m_CurSor.uCursorMem;
             
			 /*添加数据处理*/
             if( uDataMemLen > 0 )
             {
				uChange |= EDITOR_DATACHANGE;
                if( uBlockMemLen != 0 )
                {
					pSrc = pBuf + uCursorMem + uBlockMemLen;
                    pDest = pBuf + uCursorMem + uDataMemLen ;
                    uTemp =  uOldMemLen - uTail;
                    memmove(pDest, pSrc, uTemp);
                    uChange |= EDITOR_BLOCKCANCEL;
                }
				else
                {
					pSrc = pBuf + uCursorMem;
                    pDest = pBuf + uCursorMem + uDataMemLen ;
                    uTemp =  uOldMemLen - uCursorMem;
                    memmove(pDest, pSrc, uTemp);
                }
                pDest = pBuf + uCursorMem;
                memmove(pDest, pData, uDataMemLen);
                hEditWin->pmEditInfo->uUseMemLen = uOldMemLen + uDataMemLen - uBlockMemLen;
                hEditWin->pmEditInfo->uUseDspLen = uOldDspLen + uDataDspLen - uBlockDspLen;
                if( !(wStateOption & OF_EDITOR_READONLY) )
                {
                    hEditWin->pmEditInfo->m_CurSor.uCursorMem += uDataMemLen;
                }
                hEditWin->pmEditInfo->m_Block.uBlkHead = 0;
                hEditWin->pmEditInfo->m_Block.uBlkTail = 0;                
                uTemp = hEditWin->pmEditInfo->uUseMemLen;
                if( uTemp != uOldMemLen )
                {
                    MsgSend2( (APGUI_STRUCT_MODEL*)hEditWin, EVENT_COMMAND, CM_EDITINNER_MEMLENCHANGED);
                }
                /*判断hEditWin->pScrnStart之前的数据是否被改变*/

                bScrnStart = FALSE;
                if( ((uHead != uTail) && ((uHead+pBuf) > hEditWin->pmEditInfo->pScrnStart)) || ((uHead == uTail) && ((uCursorMemBak+pBuf) > hEditWin->pmEditInfo->pScrnStart)) )
                {
					bScrnStart = TRUE;
				}
				__EditLineRowChange( hEditWin, (UINT16)(uOldDspLen + 1), bScrnStart, TRUE );
			}
			else
			{
                hEditWin->pmEditInfo->m_CurSor.uCursorMem = uCursorMemBak;
			}

	}
    if( ((uDataDspLen == 0) || (uDataMemLen == 0)) && (uBlockMemLen > 0) )
    {   /*在没有加入数据而有MARK块的情况下,要取消选择块*/
        __EditFlushSelBlock( hEditWin );
        uChange |= EDITOR_BLOCKCANCEL;
    }

    /*以下发送消息处理*/
    if( uChange & EDITOR_DATACHANGE )
    {
        hEditWin->pmEditInfo->wState |= SF_EDITOR_MODIFIED;
		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(uChange&EDITOR_BUFFERFULL)
    {//为了避免handle不存在了,仍然可以接到消息,导致死机,这是一个补丁
		g_mEdtCmdEx.uType = CMEX_EDITOR_BUFFERFULL;
		g_mEdtCmdEx.pEditHdl = (APGUI_STRUCT_MODEL*)hEditWin;				
		g_mEditCmdParam.wCmdType = EVENT_CMDEXP_EDT;
		g_mEditCmdParam.pCmdExp = &g_mEdtCmdEx;
		MsgPost( GetApHandle(), EVENT_CMDEXP, (UINT)&g_mEditCmdParam);
    }
    else if(uChange&EDITOR_DISPFULL)
    {
        //MsgPost(GetApHandle(), EVENT_COMMAND, CM_EDITOR_HAVEMAXLEN);
    }
    if(uChange&EDITOR_BLOCKCANCEL)
    {
		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:   __EditLineRowChange                                         */
/* DESCRIPTION:处理编辑行或编辑列改变                                      */
/* INPUTS:     hEditWin - 控件句柄                                         */
/*              uOldDspLen - 数据改变前的总的显示长度                       */
/*              bScrnStart - 标志是否可以以屏幕起始指针位置为计算基准       */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  Xie         2001-04-23          创建初始版本                            */
/****************************************************************************/
VOID __EditLineRowChange(MEdit *hEditWin,UINT uOldDspLen,BOOL bScrnStart,BOOL bReDraw)
{
    INT     nCurLine, nCurCol;
    UINT8   *pData;
    UINT    uIndent, uRowSpace;
    UINT    uNameLen, uWidth, uTmpLen, uLines, uCols,uNewLines,uTemp;
    UINT    uOldLines,uNewDspLen;
    UINT    uOldDataLines, uNewDataLines;
    UINT    uOldStart, uNewStart, uStartMem;
    UINT8   *pCaption;

    pData = hEditWin->pmEditInfo->pBuf;

    uWidth = hEditWin->uWidth;
    uCols = uWidth / __EditGetAsciiFontWidth(hEditWin->pmEditInfo->wFontID);
    pCaption = hEditWin->pmEditInfo->pCaption;
    uNameLen = __EditGetCaptionLen(pCaption);
    uIndent = hEditWin->pmEditInfo->uIndent;
    /*保存旧的开始行或列*/
    uOldStart = hEditWin->pmEditInfo->uStart;
    if( !(hEditWin->pmEditInfo->wState & OF_EDITOR_MULTILINE) )
    {   /*单行编辑*/
        uNewDspLen = hEditWin->pmEditInfo->uUseDspLen + 1;  /*得到缓冲区中字符串的显示长度*/
        __EditMemColToCursor( hEditWin, hEditWin->pmEditInfo->m_CurSor.uCursorMem, &nCurLine, &nCurCol, TRUE,bScrnStart);
        if( uNewDspLen == 1 )
        {   /*全部删除*/
            hEditWin->pmEditInfo->uStart = 0;
            hEditWin->pmEditInfo->pScrnStart = pData;
            nCurCol = uNameLen;
        }
        /*调整开始显示列hEditWin->uStart*/
        else if( nCurCol >= (INT)uCols )
        {   /*光标位置字符不可见(在hEditWin->uStart的右边), 往左滚*/
            pData = hEditWin->pmEditInfo->pScrnStart;
            while( nCurCol >= (INT)uCols )
            {
                /*计算开始字符的显示长度*/
                __EditGetCharLength( hEditWin->pmEditInfo->wFontID, pData, &uStartMem, &uTmpLen);
                pData += uStartMem;
                hEditWin->pmEditInfo->uStart += uTmpLen;
                nCurCol -= uTmpLen;
            }
            hEditWin->pmEditInfo->pScrnStart = pData;
        }
        else if( nCurCol < (INT)uNameLen )
        {   /*光标位置字符不可见(在hEditWin->uStart的左边), 往右滚*/
            uStartMem = hEditWin->pmEditInfo->m_CurSor.uCursorMem;
            hEditWin->pmEditInfo->uStart = __EditMemLenToDsp(hEditWin->pmEditInfo->wFontID , pData, &uStartMem );
            hEditWin->pmEditInfo->pScrnStart = pData + uStartMem;
            nCurCol = uNameLen;
        }
        uNewStart = hEditWin->pmEditInfo->uStart;
        if( (uOldStart != uNewStart) || (uOldDspLen != uNewDspLen) )
        {
            MsgSend2((APGUI_STRUCT_MODEL* ) hEditWin, EVENT_COMMAND, CM_EDITINNER_ROWCHANGED);
        }
    }
    else
    {   /*多行编辑*/
        /*一屏能显示的行数*/
        uRowSpace = hEditWin->pmEditInfo->uRowSpace;
        uLines = __EditGetRectLineNum( hEditWin->pmEditInfo->wFontID , hEditWin->uHeight , uRowSpace );

        /*保存旧的行数*/
        uOldDataLines = hEditWin->pmEditInfo->uDataLines;

        /*保存旧的显示行数*/
        uOldLines = hEditWin->pmEditInfo->uDataLines - hEditWin->pmEditInfo->uStart;

        /*得到新的编辑数据行数*/
        if( bScrnStart && (pData != hEditWin->pmEditInfo->pScrnStart) )
        {
            hEditWin->pmEditInfo->uDataLines = hEditWin->pmEditInfo->uStart + __EditGetStrLineNum( hEditWin->pmEditInfo->wFontID ,uWidth, pCaption,hEditWin->pmEditInfo->pScrnStart, uIndent, TRUE );
        }
        else
        {
            hEditWin->pmEditInfo->uDataLines=__EditGetStrLineNum(hEditWin->pmEditInfo->wFontID ,uWidth, pCaption,pData,uIndent, FALSE );
        }
        /*得到新光标在屏幕上的行列位置*/
        __EditMemColToCursor( hEditWin, hEditWin->pmEditInfo->m_CurSor.uCursorMem, &nCurLine, &nCurCol, TRUE,bScrnStart );
        if( nCurLine < 0 )
        {   /*如果光标在最前面显示行之前,则将起始显示行前移*/
            hEditWin->pmEditInfo->uStart += nCurLine;
            __EditGetScrnStart(hEditWin,0);
            nCurLine = 0;
        }
        else if( !bScrnStart && (hEditWin->pmEditInfo->uStart > 0) )
        {
            __EditGetScrnStart(hEditWin,0);
        }
//----------------------------------------------------
		uNewLines = hEditWin->pmEditInfo->uDataLines - hEditWin->pmEditInfo->uStart;

		//if( (uOldLines <= uLines && uNewLines > uLines) || (nCurLine >= uLines))
		if( nCurLine >= (INT)uLines )//当光标位置超出屏幕显示范围时,需要调整位置
		{
			uTemp = nCurLine+1-uLines;
			hEditWin->pmEditInfo->uStart += uTemp;
			if(bScrnStart)
			{
				uTemp = uOldStart;
			}
			else
			{
				uTemp = 0;
			}
			__EditGetScrnStart(hEditWin,uTemp);
		}
//------------------------------------------------------
        /*得到新的开始行和总行数*/
		uNewStart = hEditWin->pmEditInfo->uStart;
        uNewDataLines = hEditWin->pmEditInfo->uDataLines;
        if( (uOldStart != uNewStart)||(uOldDataLines != uNewDataLines) )
        {
            MsgSend2((APGUI_STRUCT_MODEL* )hEditWin, EVENT_COMMAND, CM_EDITINNER_LINECHANGE);
        }
    }
    /*重绘视图*/
	//CursorHide();
	if(bReDraw)
	{
		MsgSend2((APGUI_STRUCT_MODEL* ) hEditWin, EVENT_DRAW, 0);
	}
}


















⌨️ 快捷键说明

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