brw_mark.c

来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 786 行 · 第 1/2 页

C
786
字号
/*			pNewCursor		- 新位置									*/
/*			pOldCursor		- 原始位置									*/
/* 输出参数:                                                            */
/*			NONE					                                    */
/* 返回值  :                                                            */
/*          真实位置                                                    */
/* 更改记录:                                                            */
/* =====================================================================*/
/*    日期       人员       版本   描述                                 */
/* =====================================================================*/
/* 2006-3-1    gaolinhui      1.0    创建	                                */
/************************************************************************/
UINT8* BrowserGetRealCursor(MBrowser *handle, UINT8 *pNewCursor, UINT8 *pOldCursor)
{
	UINT8	*pStart, *pEnd, *pCursor;

	if (pNewCursor > pOldCursor)
	{
		pStart = pOldCursor;
		pEnd = pNewCursor;
		pCursor = BrowserCheckIlleageChar(handle, pStart, pEnd, TRUE);
	}
	else
	{
		pStart = pNewCursor;
		pEnd = pOldCursor;
		pCursor = BrowserCheckIlleageChar(handle, pStart, pEnd, FALSE);
	}
	return pCursor;
}



/************************************************************************/
/* 函数名称: BrowserCheckIlleageChar                                      */
/* 函数描述: 找到连续MARK的结束位置	                                    */
/* 当前版本: 1.0                                                        */
/* 作    者: gaolinhui                                                      */
/* 输入参数:                                                            */
/*			handle			- 对象句柄									*/
/*			pSatr			- 起始位置									*/
/*			wEnd			- 结束位置									*/
/* 输出参数:                                                            */
/*          NONE					                                    */
/* 返回值  :                                                            */
/*          真实位置                                                    */
/* 更改记录:                                                            */
/* =====================================================================*/
/*    日期       人员       版本   描述                                 */
/* =====================================================================*/
/* 2006-3-1    gaolinhui      1.0    创建	                                */
/************************************************************************/
UINT8* BrowserCheckIlleageChar(MBrowser* pBrowserer, UINT8* pStart,
                 UINT8* pEnd, BOOL bDir)
{
	UINT8	*pCursor;
	UINT16	wMemLen;
	MBrowser bv,*handle;
	INT	nTmp;

	memcpy(&bv,pBrowserer,sizeof(MBrowser));
	bv.pBrwInfo = BROWSER_STACK_ALLOC(pBrowserer, sizeof(MBrowserInfo));
	memcpy(bv.pBrwInfo, pBrowserer->pBrwInfo, sizeof(MBrowserInfo));

	handle = &bv;
	if (bDir)
	{
		pCursor = pEnd;
	}
	else
	{
		pCursor = pStart;
	}

	while (pStart < pEnd)
	{
		nTmp = BrowserFilter(handle,pStart,BROWSER_UNIT_SYMBOL|BROWSER_UNIT_TRANSFER);
		while (nTmp != 0)
		{
			/*过滤掉标记*/
			pStart += nTmp;
			/*是否有标记嵌套*/
			nTmp = BrowserFilter(handle,pStart,BROWSER_UNIT_SYMBOL|BROWSER_UNIT_TRANSFER);
		}

		wMemLen = BrowserJudgeMarkAbility(pStart);
		if ((wMemLen == 0) && (*pStart != ' '))
		{
			/*找到第一个不可MARK字符*/
			if (bDir)
			{
				/*如果是向前查找*/
				pCursor = BrowserLocateMarkPosition(pBrowserer, 
                                    pStart, BROWSER_GO_BACKWARD);
				break;
			}
			else
			{
				/*如果是向后查找*/
				pCursor = BrowserLocateMarkPosition(pBrowserer, 
                                    pStart, BROWSER_GO_FORWARD);
			}
			pStart += BrowserCharMemLength(pStart);
		}
		else
		{
			/*中间的空格也要MARK*/
			if (*pStart == ' ')
			{
				wMemLen = 1;
			}
			pStart += wMemLen;
		}
	}
	BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
	return pCursor;
}


/************************************************************************/
/* 函数名称: BrowserLocateMarkPosition                                    */
/* 函数描述: 确定MARK块位置                                             */
/* 当前版本: 1.0                                                        */
/* 作    者: gaolinhui                                                      */
/* 输入参数:                                                            */
/*			pBrowserer		- 对象句柄									*/
/*			pCurrent		- 数据指针									*/
/*			uDir			- MARK方向									*/
/* 输出参数:                                                            */
/*          NONE					                                    */
/* 返回值  :                                                            */
/*          MARK块数据位置                                              */
/* 更改记录:                                                            */
/* =====================================================================*/
/*    日期       人员       版本   描述                                 */
/* =====================================================================*/
/* 2006-3-1    gaolinhui      1.0    创建	                                */
/************************************************************************/
UINT8 *BrowserLocateMarkPosition(MBrowser *pBrowserer,
                             UINT8 *pCurrent, UINT8 uDir)
{
	BOOL 	bFlg;
	UINT8 	*pData, *pNext,*pEnd;
	UINT16	wMemLen;
	INT ret;
	MBrowser mBrowserer,*pBV;

    if (pCurrent == NULL)
    {
        return pCurrent;
    }
	/*复制句柄内容*/
	memcpy(&mBrowserer,pBrowserer,sizeof(MBrowser));
	mBrowserer.pBrwInfo =  BROWSER_STACK_ALLOC(pBrowserer,sizeof(MBrowserInfo));
	memcpy(mBrowserer.pBrwInfo, pBrowserer->pBrwInfo, sizeof(MBrowserInfo));

	/*设置工作指针*/
	pBV = &mBrowserer;
	bFlg = FALSE;
	switch (uDir)
	{
        /*向后遍历*/
		case BROWSER_GO_BACKWARD:
            /*从数据起始位置开始查找*/
			pData = pBV->pBrwInfo->pBuffer;
            /*确定第一个MARK块的位置*/
			pData = BrowserLocateMarkPosition(pBV, pData, BROWSER_GO_FORWARD);
			if ((pData == NULL) || (pData >= pCurrent))
			{
				/*前面已经没有可MARK块了*/
				BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
				return NULL;
			}
			/*得到内存长度*/
			wMemLen = BrowserMarkWordMemLen(pData);
			pEnd = pData + wMemLen;
			/*找下一个MARK块*/
			pNext = BrowserLocateMarkPosition(pBV, pEnd, BROWSER_GO_FORWARD);
			if (pNext == NULL)
			{
				/*后面都没有可MARK块了*/
				BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
				return pData;
			}
			while (pNext < pCurrent)
			{
				/*当前块不是要找的,指针移动到下一块*/
				pData = pNext;
				/*得到内存长度*/
				wMemLen = BrowserMarkWordMemLen(pData);
				pEnd = pData + wMemLen;
				if (pEnd >= pCurrent)
				{
					break;
				}
				/*找下一个MARK块*/
				pNext = BrowserLocateMarkPosition(pBV, pEnd, BROWSER_GO_FORWARD);
				if (pNext == NULL)
				{
					/*后面都没有可MARK块了*/
					break;
				}
			}
			BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
			return pData;
        /*向前遍历*/
		case BROWSER_GO_FORWARD:
			while (1)/*开始找可MARK字符*/
			{
				/*回调*/
				ret = BrowserFilter(pBV,pCurrent,BROWSER_UNIT_SYMBOL|BROWSER_UNIT_TRANSFER);
				while (ret)
				{
					/*跳过标记*/
					pCurrent += ret;
					ret = BrowserFilter(pBV,pCurrent,BROWSER_UNIT_SYMBOL|BROWSER_UNIT_TRANSFER);
				}
				/*数据结束了么*/
				if (*pCurrent == BROWSER_DATA_END)
				{
					BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
					return (UINT8*)NULL;
				}
				/*是否能MARK*/
				if (BrowserJudgeMarkAbility(pCurrent) == 0)
				{
					/*不能MARK,跳过*/
					pCurrent += BrowserCharMemLength(pCurrent);
				}
				else
				{
					/*能MARK,返回*/
					BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
					return pCurrent;
				}
			}
			break;
		default:
			BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
			return (UINT8 *)NULL;
	}
	BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
}






/************************************************************************/
/* 函数名称: BrowserMarkWord	                                            */
/* 函数描述: MARK一个WORD	                                            */
/* 当前版本: 1.0                                                        */
/* 作    者: gaolinhui                                                      */
/* 输入参数:                                                            */
/*			handle			- 对象句柄									*/
/*			pData			- 数据指针									*/
/*			pString			- 字符串指针								*/
/*			memLen			- 内存长度									*/
/* 输出参数:                                                            */
/*          NONE					                                    */
/* 返回值  :                                                            */
/*          NONE	                                                    */
/* 更改记录:                                                            */
/* =====================================================================*/
/*    日期       人员       版本   描述                                 */
/* =====================================================================*/
/* 2006-3-1    gaolinhui      1.0    创建	                                */
/************************************************************************/
VOID BrowserMarkWord(MBrowser *handle,UINT8 *pData,
				   UINT8 *pString,UINT16 memLen)
{
	UINT8 *pTemp;
	UINT8* pWord;
	UINT32 len;
	UINT16 wUnitWidth,wUnitHeight,height;
	UINT8 *pStart,*pEnd;
	UINT32 line;
	UINT16 col;
	UINT16 x,y;
	UINT16 x0,y0;

	//申请内存
	pWord = BROWSER_STACK_ALLOC(handle,BROWSER_UNIT_MAXLEN);

	/*控件的起始坐标*/
	x0 = handle->pBrwInfo->nX;
	y0 = handle->pBrwInfo->nY;

	if (handle->pBrwInfo->wStates & BROWSER_STATE_MARKING)
	{
		/*确定MARK数据位置*/
		if (handle->pBrwInfo->pMarkStart < handle->pBrwInfo->pMarkEnd)
		{
			pStart = handle->pBrwInfo->pMarkStart;
			pEnd = handle->pBrwInfo->pMarkEnd;
		}
		else
		{
			pStart = handle->pBrwInfo->pMarkEnd;
			pEnd = handle->pBrwInfo->pMarkStart;
		}
		/*是不是空格*/
		if (*pString == ' ')
		{
			/*在不在MARK范围内*/
			if ((pData >= pStart) && (pData < pEnd))
			{
				/*MARK范围内的空格也要翻白*/
				/*行列号*/
				BrowserPosToLineCol(handle,pData,&line,&col);
				/*确定行高*/
				height = BrowserLinesHeight(handle,line,line);
				height -= handle->pBrwInfo->wLineSpace;
				/*屏幕行号*/
				line -= handle->pBrwInfo->dwTopLine;
				/*屏幕坐标*/
				BrowserLineColToXY(handle,line,col,&x,&y);
				/*将字符串复制到工作缓存*/
				memset(pWord,0,BROWSER_UNIT_MAXLEN);
				memcpy(pWord,pString,1);
				/*计算显示宽度*/
				FontGetStringRect(&wUnitWidth,&wUnitHeight,pWord);
				/*反白*/
				GraphInvertRect(x0+x,y0+y,x0+x + wUnitWidth - 1,
					y0+y + height - 1);
				//释放内存
				BROWSER_STACK_FREE(handle,BROWSER_UNIT_MAXLEN);
				return;
			}
		}
		pTemp = pData;
		/*确定MARK块内存位置*/
		while (1)
		{
			pTemp = BrowserLocateMarkPosition(handle, pTemp, BROWSER_GO_FORWARD);
			if ((pTemp == NULL) || (pTemp >= (pData + memLen))
				|| (pTemp >= pEnd))
			{
				/*如果超出unit的范围或者是mark范围,退出*/
				//释放内存
				BROWSER_STACK_FREE(handle,BROWSER_UNIT_MAXLEN);
				return;
			}
			if ((pTemp >= pStart) && (pTemp < pEnd))
			{
				/*如果在mark范围内,中止搜索*/
				break;
			}
			else
			{
				/*一个unit可能有几个mark单元,继续搜索*/
				pTemp += BrowserMarkWordMemLen(pTemp);
			}
		}
		/*根据规则,逐个MARK*/
		while ((pTemp >= pStart) && (pTemp < pEnd))
		{ 
			/*确定屏幕位置*/
			BrowserPosToLineCol(handle,pTemp,&line,&col);
			/*确定行高*/
			height = BrowserLinesHeight(handle,line,line);
			height -= handle->pBrwInfo->wLineSpace;
			line -= handle->pBrwInfo->dwTopLine;
			BrowserLineColToXY(handle,line,col,&x,&y);
			/*确定MARK块内存长度*/
			len = BrowserMarkWordMemLen(pTemp);
			/*将字符串复制到工作缓存*/
			memset(pWord,0,BROWSER_UNIT_MAXLEN);
			memcpy(pWord,pTemp,len);
			/*计算显示宽度*/
			FontGetStringRect(&wUnitWidth,&wUnitHeight,pWord);
			/*反白*/
			GraphInvertRect(x0+x,y0+y,x0+x + wUnitWidth - 1,
				y0+y + height - 1);
			pTemp += len;
			/*确定MARK块内存位置*/
			pTemp = BrowserLocateMarkPosition(handle, pTemp, BROWSER_GO_FORWARD);
			if (!pTemp || (pTemp >= (pData + memLen)) || (pTemp >= pEnd))
			{
				break;
			}
		}
	}
	//释放内存
	BROWSER_STACK_FREE(handle,BROWSER_UNIT_MAXLEN);

}




⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?