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