edit.c
来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 1,029 行 · 第 1/3 页
C
1,029 行
pEdit->pmEditInfo->m_Block.uBlkTail = 0;
/***********************************************************************************/
pEdit->pmEditInfo->uMaxEditLen = 0xffff; //此成员保留使用,不对外设置接口,初始化设置为最大值
pEdit->pmEditInfo->uUseMemLen = __EditGetStrLength(pEdit->pmEditInfo->wFontID,
pEdit->pmEditInfo->pBuf, FALSE) + 1;
pEdit->pmEditInfo->uUseDspLen = __EditGetStrLength(pEdit->pmEditInfo->wFontID,
pEdit->pmEditInfo->pBuf, TRUE);
if( pEdit->pmEditInfo->wState & OF_EDITOR_MULTILINE )
{
pEdit->pmEditInfo->uDataLines = __EditGetStrLineNum(pEdit->pmEditInfo->wFontID,
pEdit->uWidth, pEdit->pmEditInfo->pCaption, pEdit->pmEditInfo->pBuf,
pEdit->pmEditInfo->uIndent, FALSE );
}
else
{ /*单行编辑,只有一行*/
pEdit->pmEditInfo->uDataLines = 1;
}
if( !(pEdit->pmEditInfo->wState & OF_EDITOR_MULTILINE) )
{ /*当编辑控件为单行编辑时,不允许输入回车符*/
pEdit->pmEditInfo->wAllowChar &= ~EDITALLOW_ENTER;
}
#ifdef EDIT_SUPPORT_PEN
if( pEdit->pmEditInfo->wAllowChar & (EDITALLOW_SBCCASE | EDITALLOW_HANDWRITE) )
pEdit->pmEditInfo->wAllowChar |= (EDITALLOW_SBCCASE | EDITALLOW_HANDWRITE);
#endif
//创建光标的定时器
if(!(pEdit->pmEditInfo->wState & OF_EDITOR_READONLY))
{
wCurID = EDIT_TIMER_ID(pEdit);
pEdit->pmEditInfo->m_CurSor.hTimer = TimerCreateTimer(wCurID,EDIT_CURTMR_SET);
if(pEdit->pmEditInfo->m_CurSor.hTimer == NULL)
{ //如果创建时钟失败
bRet = FALSE;
}
}
pEdit->pmEditInfo->m_CurSor.wCurCol = __EditGetCaptionLen(pEdit->pmEditInfo->pCaption);
}
return bRet;
}
/****************************************************************************/
/* FUNCTION: EditHandleEvent */
/* DESCRIPTION:编辑器消息处理函数 */
/* INPUTS: pEdit - 编辑器的句柄 */
/* uEvent - 消息类型 */
/* uParam - 消息参数 */
/* OUTPUTS: */
/* */
/* RETURN: */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* gaolinhui 2005-12-21 创建初始版本 */
/****************************************************************************/
INT EditHandleEvent(APGUI_STRUCT_MODEL *pGui, UINT uEvent, UINT uParam)
{
MEdit* pEdit = (MEdit*)pGui;
UINT16 wStateOption;
UINT uLines,uCols;
UINT8 strTemp[3],*pData;
BOOL bUseAndEdit,bInited;
UINT uDspLen,uMemLen,uCursorMem;
UINT uOldBlkHead,uOldBlkTail;
UINT uTmrID;
UINT uTemp;
UINT uKey;
INT nRet = 0;
wStateOption = pEdit->pmEditInfo->wState ;
bUseAndEdit = !(wStateOption & OF_EDITOR_READONLY);
bInited = pEdit->pmEditInfo->wState & SF_EDITOR_INIT; //指示编辑器是否初始化过
switch(uEvent)
{
case EVENT_TIMER:
uTmrID = EDIT_TIMER_ID(pEdit);
if(uParam == uTmrID)
{ //编辑器光标闪烁时钟,发送光标闪烁命令
MsgPost((APGUI_STRUCT_MODEL*)pEdit, EVENT_COMMAND, CM_EDITINNER_CURSORBLINK);
nRet = 1;
}
break;
case EVENT_INITIALIZE:
if(__EditSetDefaultParam(pEdit)) //设置编辑器的默认参数
{
//如果返回成功,设置编辑器已被初始化
pEdit->pmEditInfo->wState |= SF_EDITOR_INIT;
}
MsgSend2((APGUI_STRUCT_MODEL*)pEdit , EVENT_COMMAND, CM_EDITINNER_FIRSTINTO);
nRet = 1;
break;
case EVENT_DESTROY:
if(pEdit->pmEditInfo->m_CurSor.hTimer)
{
TimerDestroyTimer(pEdit->pmEditInfo->m_CurSor.hTimer);
nRet = 1;
}
break;
#ifdef EDIT_SUPPORT_PEN //如果当前机器支持笔点功能
case EVENT_PENDOWN:
case EVENT_PENMOVE:
case EVENT_PENUP:
if(!bInited)
{ //如果控件未初始化或初始化失败,不相应操作
break;
}
nRet = __EditWinProcPen(pEdit,uEvent,uParam);
break;
#endif
case EVENT_KEY:
case EVENT_KEYREPEAT:
uKey = READKB_VALUE(uParam); //读出按键值
if(!bInited)
{ //如果控件未初始化或初始化失败,不相应操作
break;
}
if(uKey == MVK_UP || uKey == MVK_DOWN || uKey == MVK_LEFT
|| uKey == MVK_RIGHT || uKey == MVK_PAGEUP || uKey == MVK_PAGEDOWN)
{
nRet = __EditWinProcKeyMark(pEdit,uParam,bUseAndEdit);
if(nRet == 0)
nRet = __EditKeyProcess(pEdit,uParam,bUseAndEdit);
}
else
{
if(uKey == MVK_ENTER)
{
strTemp[0] = CHAR_RETURN;
strTemp[1] = 0;
__EditStrValidLenCheck(pEdit->pmEditInfo->wFontID, pEdit->pmEditInfo->wAllowChar,
strTemp, 2, &uDspLen, &uMemLen);
if( uMemLen > 0 )
{ //当允许接收此字符时,才需要清除此消息
__EditAddStringProc( pEdit, strTemp, 2);
nRet = 1;
}
}
else if(uKey == MVK_BACKSPACE)
{//如果光标所在位置有数据,退格键发送一个退格消息,如果没有数据,发送一个删除消息
uMemLen = pEdit->pmEditInfo->m_CurSor.uCursorMem;
if(uMemLen > 0)
{
MsgSend2((APGUI_STRUCT_MODEL*)pEdit,EVENT_COMMAND,CM_EDITINNER_KEY_BKSPACE);
}
else
{
MsgSend2((APGUI_STRUCT_MODEL*)pEdit,EVENT_COMMAND,CM_EDITINNER_KEY_DEL);
}
nRet = 1;
}
else if(uKey == MVK_DELETE )
{//如果光标所在位置有数据,退格键发送一个删除消息,如果没有数据,发送一个退格消息
pData = pEdit->pmEditInfo->pBuf;
uMemLen = pEdit->pmEditInfo->m_CurSor.uCursorMem;
if(pData[uMemLen] == 0)
{
MsgSend2((APGUI_STRUCT_MODEL*)pEdit,EVENT_COMMAND,CM_EDITINNER_KEY_BKSPACE);
}
else
{
MsgSend2((APGUI_STRUCT_MODEL*)pEdit,EVENT_COMMAND,CM_EDITINNER_KEY_DEL);
}
nRet = 1;
}
}
break;
case EVENT_DRAW:
if(!bInited)
{ //如果控件未初始化或初始化失败,不相应操作
break;
}
GraphDisableRefresh();
if(bUseAndEdit)
__EditCursorHide(pEdit);
GraphClearRect(pEdit->uX, pEdit->uY,
(pEdit->uX+pEdit->uWidth-1), (pEdit->uY+pEdit->uHeight-1));
//显示行分割线
__EditDispLineSpace(pEdit,pEdit->uWidth,pEdit->uHeight,wStateOption, pEdit->pmEditInfo->uRowSpace );
uOldBlkHead = pEdit->pmEditInfo->m_Block.uBlkHead;
uOldBlkTail = pEdit->pmEditInfo->m_Block.uBlkTail;
uLines = __EditGetRectLineNum(pEdit->pmEditInfo->wFontID,pEdit->uHeight,pEdit->pmEditInfo->uRowSpace);
uCols = __EditGetRectRowNum(pEdit->pmEditInfo->wFontID,pEdit->uWidth);
if(pEdit->pmEditInfo->wState & OF_EDITOR_MULTILINE)
{
__EditDispScrText(pEdit,pEdit->pmEditInfo->pCaption,
pEdit->pmEditInfo->pBuf,
pEdit->pmEditInfo->pScrnStart,
0,
pEdit->pmEditInfo->uStart,
uLines,
uCols,
pEdit->pmEditInfo->uRowSpace,
pEdit->pmEditInfo->uIndent,
uOldBlkHead,uOldBlkTail);
}
else
{
uTemp = pEdit->pmEditInfo->pScrnStart - pEdit->pmEditInfo->pBuf;
pData = pEdit->pmEditInfo->pScrnStart;
if( uOldBlkHead > uTemp )
uOldBlkHead -= uTemp;
else
uOldBlkHead = 0;
if( uOldBlkTail > uTemp )
uOldBlkTail -= uTemp;
else
uOldBlkTail = 0;
__EditDispScrText(pEdit,pEdit->pmEditInfo->pCaption,
pData,
(UINT8*)NULL,
0,
0,
1,
uCols,
0,
0,
uOldBlkHead,uOldBlkTail);
}
if(bUseAndEdit)
__EditShowCursor(pEdit);
nRet = 1;
GraphEnableRefresh();
break;
case EVENT_CHAR:
if(!bInited)
{ //如果控件未初始化或初始化失败,不相应操作
break;
}
if(wStateOption & OF_EDITOR_READONLY)
break;
if((HIBYTE(uParam) == 0 && LOBYTE(uParam) >= 0x80)
|| (HIBYTE(uParam) > 0 && HIBYTE(uParam) < 0x80) )
break;
memset(strTemp,0,3);
strTemp[0] = LOBYTE(uParam);
if( HIBYTE(uParam) != 0 )
{
strTemp[1] = strTemp[0];
strTemp[0] = HIBYTE(uParam);
}
__EditStrValidLenCheck(pEdit->pmEditInfo->wFontID, pEdit->pmEditInfo->wAllowChar,
strTemp,2,&uDspLen,&uMemLen);
if(uMemLen > 0)
{
if(pEdit->pmEditInfo->pBuf)
{
__EditAddStringProc( pEdit, strTemp, 2);
}
}
nRet = 1;
break;
case EVENT_IMESTR:
if(!bInited) //编辑器未初始化,返回
{
break;
}
if(wStateOption & OF_EDITOR_READONLY)
break;
//检查字符串的合法性
__EditStrValidLenCheck(pEdit->pmEditInfo->wFontID, pEdit->pmEditInfo->wAllowChar,
(UINT8*)uParam,0,&uDspLen,&uMemLen);
if(uMemLen>0)
{
if(pEdit->pmEditInfo->pBuf)
{
__EditAddStringProc(pEdit,(UINT8*)uParam,uMemLen);
}
}
nRet = 1;
break;
case EVENT_COMMAND:
if(!bInited)
{ //如果控件未初始化或初始化失败,不相应操作
break;
}
if(uParam == (UINT)CM_EDITINNER_FIRSTINTO)
{
nRet = 1;
}
else if(uParam == (UINT)CM_EDITINNER_CURSORBLINK)
{
//光标定时器,如果文档可以编辑,显示光标
if(bUseAndEdit && (pEdit->pmEditInfo->wState & SF_EDITOR_CURSHOW))
{
GraphDisableRefresh();
__EditInvertCursor(pEdit);
GraphEnableRefresh();
}
nRet = 1;
}
else if(uParam == CM_EDITINNER_KEY_DEL)
{//删除一个字符,如果有mark,删除mark块
__EditDeleteProc( pEdit, TRUE );/*删除选择块*/
nRet = 1;
}
else if(uParam == CM_EDITINNER_KEY_BKSPACE)
{//退格删除一个字符
if( pEdit->pmEditInfo->m_Block.uBlkHead == pEdit->pmEditInfo->m_Block.uBlkTail )
{ /*没有MARK块,则光标前移一个字符*/
uCursorMem = pEdit->pmEditInfo->m_CurSor.uCursorMem;
pData = pEdit->pmEditInfo->pBuf;
if( uCursorMem == 0 )
{
break;
}
uTemp = __EditGetPreCharMemLen( pEdit->pmEditInfo->wFontID, pData, uCursorMem );
pEdit->pmEditInfo->m_CurSor.uCursorMem -= uTemp;
}
__EditDeleteProc( pEdit, TRUE );/*删除选择块*/
nRet = 1;
}
break;
}
return nRet;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?