📄 editwinproc.c
字号:
}
}
bHaveProc = TRUE; //已经处理向下键
break;
case MVK_PAGEUP: //这里只处理同时按了SHIFT键时的翻页键
if( !bShiftDown )
break;
bHaveProc = TRUE; //标志一定处理了向上翻页键
if( uOldStart > 0 )
{
uTemp = (uOldStart > uDspLines )? uDspLines : uOldStart;
hEditWin->pmEditInfo->uStart = uOldStart - uTemp;
__EditGetScrnStart( hEditWin, uOldStart);
}
else if( nCurLine > 0 ) /*否则,如果不能上翻页,则将光标上移到第一行*/
{
nCurLine = 0;
}
//else
// hEditWin->uCursorMem = 0; //不能前翻页,则移到第一个字符
__EditCursorToMemCol(hEditWin, &nCurLine, &nCurCol, uDspCols);
break;
case MVK_PAGEDOWN: //这里只处理同时按了SHIFT键时的翻页键
if( !bShiftDown )
break;
bHaveProc = TRUE; //标志一定处理了向下翻页键
if( (uOldStart + 2*uDspLines) <= uDataLines )
uTemp = uDspLines;
else if( uOldStart + uDspLines < uDataLines )
uTemp = uDataLines - uOldStart - uDspLines;
else
uTemp = 0;
if( uTemp > 0 )
{ /*如果能下翻,则下翻一页*/
hEditWin->pmEditInfo->uStart = uOldStart + uTemp;
__EditGetScrnStart( hEditWin, uOldStart);
}
//else //不能前翻页,则移到最后一个之后
// hEditWin->uCursorMem = __EditGetStrLength((MDC*)hEditWin, pData, FALSE);
__EditCursorToMemCol(hEditWin, &nCurLine, &nCurCol, uDspCols);
break;
default:
break;
}
}
if( bHaveProc ) /*只在当前按键已经被处理了的情况下,才需要进行下面的操作*/
{ //重新给临时变量赋值
pData = hEditWin->pmEditInfo->pBuf;
uCursorMem = hEditWin->pmEditInfo->m_CurSor.uCursorMem;
if( bCanEdit )
{ //可编辑状态,是连续MARK操作
hEditWin->pmEditInfo->m_Block.uBlkTail = uCursorMem;
__EditLineRowChange(hEditWin, hEditWin->pmEditInfo->uUseDspLen + 1, TRUE,TRUE);
}
else
{
uTemp = hEditWin->pmEditInfo->m_Block.uBlkHead;
if( !bShiftDown ) //如果是单个字符的MARK操作
hEditWin->pmEditInfo->m_Block.uBlkHead = uCursorMem;
else if( hEditWin->pmEditInfo->m_Block.uBlkTail < uTemp )
{ //如果块尾在前,则可能需要调整块头位置
if( uCursorMem >= uTemp )
{ //当由向前MARK改为向后MARK时
//uPreLen = __EditGetPreCharMemLen((MDC*)hEditWin,
// pData + hEditWin->uBlockTail, uTemp - hEditWin->uBlockTail);
uPreLen = __EditGetPreCharMemLen(wFontID, pData, uTemp);
hEditWin->pmEditInfo->m_Block.uBlkHead = uTemp - uPreLen;
}
}
else //当块头在前时
{
__EditGetCharLength( wFontID, pData + uTemp, &uPreLen, NULL );
//if( (hEditWin->uBlockTail == (uTemp + uPreLen)) && (uCursorMem < uTemp) )
if( uCursorMem < uTemp )
{
hEditWin->pmEditInfo->m_Block.uBlkHead = uTemp + uPreLen;
}
}
if( uCursorMem < hEditWin->pmEditInfo->m_Block.uBlkHead )
uTemp = 0; //当是往左MARK字符串时,要特殊处理
else
__EditGetCharLength( wFontID, pData + uCursorMem, &uTemp, NULL );
hEditWin->pmEditInfo->m_Block.uBlkTail = uCursorMem + uTemp;
__EditLineRowChange(hEditWin, hEditWin->pmEditInfo->uUseDspLen + 1, TRUE,TRUE);
}
nRet = 1;
}
return nRet;
}
/***************************************************************************
FUNCTION: __EditKeyProcess
DESCRIPTION:处理编辑窗口中的按键移动操作
INPUTS: pEdit - 编辑窗口句柄
uKey - 要处理的虚按键
bCanEdit - 是否可编辑
OUTPUTS: NONE
RETURN: 处理了此按键则返回TRUE,否则返回FALSE
**************************************************************************
NAME DATE REMARKS
========== ============ ==============================================
gaolinhui 2006-01-12 创建初始版本
***************************************************************************/
BOOL __EditKeyProcess(MEdit* pEdit, UINT uKey, BOOL bCanEdit)
{
MEdit *hEdit;
UINT uDspLines, uDspCols; //每屏可显示的行数和每行可显示的列数
INT nCurLine, nCurCol; //光标所在的行、列
UINT uCharWidth, uCharHeight;//ASCII字符的宽度和高度
UINT uCursorMem; //记忆原来的光标位置
UINT8 *pData;
UINT uOldStart; //记忆起始位置
UINT uOldDspLen; //记忆原来总的显示长度
UINT uDataLines; //记忆原来总的数据行数
UINT uKeyValue;
UINT wStateOption;
UINT uTempMemLen, uTempDspLen, uTemp; //临时操作使用的变量
BOOL bIsMarking; /*是否已经有MARK块*/
BOOL bHaveProc;
hEdit = pEdit;
uKeyValue = READKB_VALUE(uKey);
wStateOption = hEdit->pmEditInfo->wState ;
bIsMarking = (hEdit->pmEditInfo->m_Block.uBlkHead != hEdit->pmEditInfo->m_Block.uBlkTail);
uCursorMem = hEdit->pmEditInfo->m_CurSor.uCursorMem; /*光标内存位置*/
pData = hEdit->pmEditInfo->pBuf;
uOldStart = hEdit->pmEditInfo->uStart;
uOldDspLen = hEdit->pmEditInfo->uUseDspLen + 1;
uCharWidth = __EditGetAsciiFontWidth(hEdit->pmEditInfo->wFontID); /*ASCII字符的宽度*/
uCharHeight = FontGetHeight(hEdit->pmEditInfo->wFontID); /*ASCII字符的高度*/
uDspLines = __EditGetRectLineNum(hEdit->pmEditInfo->wFontID, hEdit->uHeight, hEdit->pmEditInfo->uRowSpace );
/*每屏能显示的行数*/
uDspCols = hEdit->uWidth / uCharWidth; /*编辑器一行能显示的列数*/
uDataLines = hEdit->pmEditInfo->uDataLines;
nCurLine = hEdit->pmEditInfo->m_CurSor.wCurLine;
nCurCol = hEdit->pmEditInfo->m_CurSor.wCurCol;
if( wStateOption & OF_EDITOR_MULTILINE )
nCurLine -= uOldStart;
else
nCurCol -= uOldStart;
// 先隐藏隐藏光标
if( bCanEdit )
__EditCursorHide(hEdit);
bHaveProc = FALSE;//初始化为没有处理
if( !(wStateOption & OF_EDITOR_MULTILINE) )
{ //对于单行编辑,只能处理左右键,不能处理上下、翻页键
UINT uNameLen; /*标题的显示长度*/
uNameLen = __EditGetCaptionLen(hEdit->pmEditInfo->pCaption);
switch( uKeyValue )
{
case MVK_LEFT:
if( !bCanEdit )
nCurCol = uNameLen;
__EditFlushSelBlock(hEdit); //取消MARK块
/*计算光标处前一字符的显示长度*/
uTemp = __EditGetPreCharDspLen(hEdit->pmEditInfo->wFontID, pData, (UINT)(nCurCol+uOldStart-uNameLen) );
if( uTemp > 0 )
{
if( nCurCol >= (INT)(uNameLen + uTemp) )
nCurCol -= (INT)uTemp;
else if( uOldStart >= uTemp )
{ /*移开始显示位置*/
hEdit->pmEditInfo->uStart = uOldStart - uTemp;
__EditGetScrnStart(hEdit, uOldStart);
}
if( bCanEdit )
hEdit->pmEditInfo->m_CurSor.uCursorMem = __EditCursorToMemCol( hEdit, &nCurLine, &nCurCol, uDspCols );
bHaveProc = TRUE;//已经处理左键
}
else if( bIsMarking )
bHaveProc = TRUE;//已经处理左键
break;
case MVK_RIGHT:
if( bCanEdit )
pData += uCursorMem;
else
pData = hEdit->pmEditInfo->pScrnStart;
__EditFlushSelBlock(hEdit); //取消MARK块
__EditGetCharLength( hEdit->pmEditInfo->wFontID, pData, &uTempMemLen, &uTempDspLen);
if( uTempMemLen > 0 )
{
if( bCanEdit )
hEdit->pmEditInfo->m_CurSor.uCursorMem += uTempMemLen;
else if( (uOldStart + uDspCols) <= uOldDspLen )
break;
else
{ /*移开始显示位置*/
hEdit->pmEditInfo->uStart = uOldStart + uTempDspLen;
hEdit->pmEditInfo->pScrnStart = pData + uTempMemLen;
}
bHaveProc = TRUE;//已经处理右键
}
else if( bIsMarking )
bHaveProc = TRUE;//已经处理右键
break;
default: //其它按键都不予处理
break;
}
if( bHaveProc )
{
MsgSend2( (APGUI_STRUCT_MODEL*)hEdit, EVENT_COMMAND, CM_EDITINNER_ROWCHANGED );
__EditLineRowChange(hEdit, uOldDspLen, TRUE,TRUE);
}
}
else //否则对于多行编辑,可以处理左、右、上、下、翻页键
{
// 先取消MARK块
__EditFlushSelBlock(hEdit);
switch( uKeyValue )
{
case MVK_LEFT:
if( !bCanEdit ) //只有在可编辑状态下才处理左光标键
break;
uTemp = __EditGetPreCharMemLen( hEdit->pmEditInfo->wFontID, pData, uCursorMem );
if( uTemp > 0 )
{
hEdit->pmEditInfo->m_CurSor.uCursorMem -= uTemp;
if( hEdit->pmEditInfo->m_CurSor.uCursorMem < (UINT)(hEdit->pmEditInfo->pScrnStart - pData) )
{
hEdit->pmEditInfo->uStart = uOldStart - 1;
__EditGetScrnStart(hEdit, uOldStart);
}
bHaveProc = TRUE;//已经处理左键
}
else if( bIsMarking )
bHaveProc = TRUE;//已经处理左键
break;
case MVK_RIGHT:
if( !bCanEdit ) //只有在可编辑状态下才处理右光标键
break;
pData += uCursorMem;
__EditGetCharLength( hEdit->pmEditInfo->wFontID, pData, &uTempMemLen, NULL);
if( uTempMemLen > 0 )
{
hEdit->pmEditInfo->m_CurSor.uCursorMem += uTempMemLen;
bHaveProc = TRUE;//已经处理右键
}
else if( bIsMarking )
bHaveProc = TRUE;//已经处理右键
break;
case MVK_UP: /*上移一行*/
if( !bCanEdit )
nCurLine = 0;
if( nCurLine > 0 )
{ /*如果光标能上移一行*/
nCurLine -= 1;
__EditCursorToMemCol(hEdit, &nCurLine, &nCurCol, uDspCols);
__EditShowCursor(hEdit);
return TRUE;
}
else if( uOldStart > 0 )
{ /*否则,如果光标在第一行,则上翻一行*/
hEdit->pmEditInfo->uStart = uOldStart - 1;
__EditGetScrnStart( hEdit, uOldStart);
bHaveProc = TRUE;//已经处理此键
}
else if( bIsMarking )
bHaveProc = TRUE;//已经处理此键
break;
case MVK_DOWN: /*下移一行*/
if( !bCanEdit )
nCurLine = uDspLines-1;
if( nCurLine < (INT)(uDspLines-1) )
{ /*如果光标能下移一行*/
nCurLine += 1;
__EditCursorToMemCol(hEdit, &nCurLine, &nCurCol, uDspCols);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -