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 + -
显示快捷键?