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