📄 editwinproc.c
字号:
__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 + -