📄 editpen.c
字号:
/***************************************************************************
Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD
FILE NAME: EditPen.C
MODULE NAME: Edit
DESCRIPTION: 编辑器笔点的相关处理函数
对外函数声明:
内部函数声明:
笔点的消息处理
INT __EditWinProcPen(MEdit* hEditWin, UINT uEvent,UINT uParam)
**************************************************************************
DTAE AUTHOR VERSION REMARKS
=========== ========== ========= ======================================
2006-11-31 gaolinhui V1.0 create
***************************************************************************/
#include "kernel.h"
#include "EditIn.h"
extern EdtCmdEx g_mEdtCmdEx; //编辑器的扩展命令类型
extern CMDEXP g_mEditCmdParam;
#ifdef EDIT_SUPPORT_PEN
/****************************************************************************/
/* FUNCTION: __EditWinProcPen */
/* DESCRIPTION:处理MEditWin类接收到的笔点消息 */
/* INPUTS: hEditWin - 句柄 */
/* uEvent - 消息 */
/* OUTPUTS: */
/* RETURN: 处理消息后的返回值 */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* gaolinhui 2006-01-12 创建初始版本 */
/****************************************************************************/
INT __EditWinProcPen(MEdit* hEditWin, UINT uEvent,UINT uParam)
{
UINT16 wEvX, wEvY;
UINT32 dwReturn;
INT nDcX, nDcY;
UINT16 wStateOption;
BOOL bCanEdit;
UINT uNameLen; /*标题的显示长度*/
UINT uOldStart;
UINT uOldBlockHead, uOldBlockTail;
UINT uOldDspLen; /*原来的显示长度(只对单行编辑)*/
UINT uDspLines, uDspCols; /*每屏可显示的行数和每行可显示的列数*/
INT nCurLine, nCurCol, nCurColBak;
UINT uCharWidth, uCharHeight, uSpace;
UINT uTempMemLen, uTempDspLen, uTemp;
UINT16 wFontID;
wStateOption = hEditWin->pmEditInfo->wState;
bCanEdit = !(wStateOption & OF_EDITOR_READONLY);
wFontID = hEditWin->pmEditInfo->wFontID;
uNameLen = __EditGetCaptionLen(hEditWin->pmEditInfo->pCaption);
uOldDspLen = hEditWin->pmEditInfo->uUseDspLen + 1;
/* ASCII字符的宽度和高度 */
uCharWidth = __EditGetAsciiFontWidth(wFontID);
uCharHeight = FontGetHeight(wFontID);
wEvX = GET_PEN_X(uParam);
wEvY = GET_PEN_Y(uParam);
nDcX = hEditWin->uX;
nDcY = hEditWin->uY;
uSpace = hEditWin->pmEditInfo->uRowSpace;
uDspLines = __EditGetRectLineNum(wFontID, hEditWin->uHeight, uSpace );/*每屏能显示的行数*/
uDspCols = hEditWin->uWidth / uCharWidth; /*编辑器一行能显示的列数*/
uOldStart = hEditWin->pmEditInfo->uStart;
dwReturn = 0L;
switch( uEvent )
{
case EVENT_PENDOWN: /*笔点消息*/
if( !DotInArea( wEvX, wEvY, nDcX, nDcY,
hEditWin->uWidth, hEditWin->uHeight ))
{ /*如果笔点坐标不在编辑区,不予处理*/
break;
}
hEditWin->pmEditInfo->wXPos = wEvX;
hEditWin->pmEditInfo->wYPos = wEvY;
/*计算光标行*/
nCurLine = (wEvY - nDcY) / (uCharHeight + uSpace);
/*计算光标列*/
nCurCol = (wEvX - nDcX) / uCharWidth;
if( bCanEdit ) /*隐藏光标*/
__EditCursorHide(hEditWin);
if( hEditWin->pmEditInfo->m_Block.uBlkHead != hEditWin->pmEditInfo->m_Block.uBlkTail )
__EditFlushSelBlock( hEditWin ); /*如果有选择块则取消选择块*/
if( nCurLine >= (INT)uDspLines ) /*超过每屏能显示的行数*/
nCurLine = uDspLines - 1;
if( nCurCol >= (INT)uDspCols)
nCurCol = uDspCols - 1;
uTemp = __EditCursorToMemCol( hEditWin, &nCurLine, &nCurCol, uDspCols);/*计算光标位置字符在字符缓冲区中的位置*/
/*设置块头和块尾*/
hEditWin->pmEditInfo->m_Block.uBlkHead = uTemp;
hEditWin->pmEditInfo->m_Block.uBlkTail = uTemp;
dwReturn = 1;
break;
case EVENT_PENMOVE: /*笔移动消息*/
if(hEditWin->pmEditInfo->wState & OF_EDITOR_NOMARK)
{
break;
}
hEditWin->pmEditInfo->wXPos = wEvX;
hEditWin->pmEditInfo->wYPos = wEvY;
/*计算光标列*/
nCurCol = ((INT)wEvX - nDcX) / (INT)uCharWidth;
nCurColBak = nCurCol;
uOldBlockHead = hEditWin->pmEditInfo->m_Block.uBlkHead;
uOldBlockTail = hEditWin->pmEditInfo->m_Block.uBlkTail;
if( wStateOption & OF_EDITOR_MULTILINE )
{ /*多行编辑中的MARK操作在下面处理*/
if( nCurCol < 0 )
nCurCol = 0;
if( nCurCol >= (INT)uDspCols)
nCurCol = uDspCols - 1;
if( wEvY < (UINT)nDcY )
{
if( uOldStart > 0 )
{
hEditWin->pmEditInfo->uStart = uOldStart - 1;
__EditGetScrnStart( hEditWin,uOldStart);
}
nCurLine = 0;
hEditWin->pmEditInfo->m_Block.uBlkTail = __EditCursorToMemCol( hEditWin, &nCurLine, &nCurCol, uDspCols);
}
else
{ /*计算光标行*/
nCurLine = (wEvY - nDcY) / (uCharHeight + uSpace);
/*判断笔点是否落在编辑区*/
if( nCurLine >= (INT)uDspLines ) /*如果笔点在编辑区下方,则继续将后面未显示的行进入选择块*/
{
nCurLine = uDspLines - 1;
if( (uOldStart + uDspLines) < hEditWin->pmEditInfo->uDataLines )
{
hEditWin->pmEditInfo->uStart = uOldStart + 1;
__EditGetScrnStart( hEditWin, uOldStart);
nCurLine = uDspLines - 1;
}
}
hEditWin->pmEditInfo->m_Block.uBlkTail = __EditCursorToMemCol( hEditWin, &nCurLine, &nCurCol, uDspCols);
}
MsgSend2((APGUI_STRUCT_MODEL*)hEditWin,EVENT_DRAW,0);
/************Mark行尾字符处理************/
if( nCurColBak >= (INT)uDspCols )
{
__EditGetCharLength(wFontID,
hEditWin->pmEditInfo->pBuf + hEditWin->pmEditInfo->m_CurSor.uCursorMem,
&uTempMemLen, &uTempDspLen);
hEditWin->pmEditInfo->m_Block.uBlkTail += uTempMemLen;
}
if( hEditWin->pmEditInfo->m_Block.uBlkTail != uOldBlockTail )
{
BOOL bIsRev;
uTemp = hEditWin->pmEditInfo->m_Block.uBlkTail;
bIsRev = TRUE;
uTempMemLen = uOldBlockTail;
if( (uOldBlockTail == uOldBlockHead)&&(uTemp != uOldBlockTail) )
{//之前没有mark并且现在mark尾改变
uTempMemLen = uOldBlockHead;
}
else if( (uOldBlockTail > uOldBlockHead)&&(uTemp < uOldBlockTail)&&(uTemp >= uOldBlockHead) )
{//之前的mark尾大于mark头并且当前mark尾在之前mark首尾之间
bIsRev = FALSE;
}
else if( (uOldBlockTail > uOldBlockHead)&&(uTemp < uOldBlockHead) )
{//之前mark尾大于mark头且当前mark为在头之前
//先反显原来的mark块
__EditDispBlockStr( hEditWin, uOldBlockHead, uOldBlockTail,FALSE);
uTempMemLen = uOldBlockHead;
}
else if( (uOldBlockTail < uOldBlockHead)&&(uTemp > uOldBlockTail)&&(uTemp <= uOldBlockHead) )
{//之前mark尾小于mark头且现在mark尾在之前mark头尾之间
bIsRev = FALSE;
}
else if( (uOldBlockTail < uOldBlockHead)&&(uTemp > uOldBlockHead) )
{//之前mark尾小于mark头且现在mark为大于之前mark头
//先反显原来的mark块
__EditDispBlockStr( hEditWin, uOldBlockTail, uOldBlockHead,FALSE);
uTempMemLen = uOldBlockHead;
}
__EditDispBlockStr( hEditWin, uTempMemLen, uTemp, bIsRev);
}
}
else if( !(wStateOption & OF_EDITOR_PASSWORD) )
{ /*如果不是编辑密码的单行输入,才能作MARK块处理*/
nCurLine = 0;
if( (nCurCol >= (INT)uNameLen) && (nCurCol < (INT)uDspCols) )/*如果在编辑区内*/
{ /*计算光标位置字符在字符缓冲区中的位置,并调整光标位置使其合理*/
uTemp = __EditCursorToMemCol( hEditWin, &nCurLine, &nCurCol, uDspCols);
if( uOldBlockTail == uTemp )
{
break;
}
/*设置新块尾*/
hEditWin->pmEditInfo->m_Block.uBlkTail = uTemp;
}
else if( (nCurCol < (INT)uNameLen) && (uOldStart > 0) ) /*在编辑区左边*/
{ /*计算开始处前一字符的显示长度*/
uTempMemLen = __EditGetPreCharDspLen(wFontID, hEditWin->pmEditInfo->pBuf, uOldStart );
hEditWin->pmEditInfo->uStart -= uTempMemLen;
__EditGetScrnStart( hEditWin,uOldStart);
nCurCol = uNameLen;
/*计算新光标在内存中的位置*/
hEditWin->pmEditInfo->m_CurSor.uCursorMem = hEditWin->pmEditInfo->pScrnStart - hEditWin->pmEditInfo->pBuf;
hEditWin->pmEditInfo->m_CurSor.wCurLine = 0;
hEditWin->pmEditInfo->m_CurSor.wCurCol = uNameLen + hEditWin->pmEditInfo->uStart;
hEditWin->pmEditInfo->m_Block.uBlkTail = hEditWin->pmEditInfo->m_CurSor.uCursorMem;
}
else if( nCurCol >= (INT)uDspCols ) /*在编辑区右边*/
{
if( uOldStart + uDspCols - uNameLen >= uOldDspLen )
break;
__EditGetCharLength(wFontID, hEditWin->pmEditInfo->pScrnStart, &uTempMemLen, &uTempDspLen);
hEditWin->pmEditInfo->uStart += uTempDspLen;
hEditWin->pmEditInfo->pScrnStart += uTempMemLen;
/*计算新光标在内存中的位置*/
nCurCol = uDspCols - 1;
hEditWin->pmEditInfo->m_Block.uBlkTail = __EditCursorToMemCol( hEditWin, &nCurLine, &nCurCol, uDspCols );
}
__EditCursorHide(hEditWin);
MsgPost(NULL, EVENT_DRAW, 0);
}
dwReturn = 1;
break;
case EVENT_PENUP: /*抬笔消息*/
if( bCanEdit ) /*恢复显示光标*/
__EditShowCursor( hEditWin );
if( hEditWin->pmEditInfo->m_Block.uBlkHead != hEditWin->pmEditInfo->m_Block.uBlkTail )
{
g_mEdtCmdEx.uType = CMEX_EDITOR_HAVEMARKED;
g_mEdtCmdEx.pEditHdl = (APGUI_STRUCT_MODEL*)hEditWin;
g_mEditCmdParam.wCmdType = EVENT_CMDEXP_EDT;
g_mEditCmdParam.pCmdExp = &g_mEdtCmdEx;
MsgSend2( GetApHandle(), EVENT_CMDEXP, (INT)&g_mEditCmdParam);
}
dwReturn = 1;
break;
default:
break;
}
return dwReturn;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -