📄 brw_calc.c
字号:
}
/*拨动数据指针*/
pData += wMoveLen;
/*记录行指针*/
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[dwCurLine].pLinePtr = pData;
pNodeInfo[dwCurLine].wStates =
pBrowserer->pBrwInfo->wStates & ~BROWSER_STATE_INITIAL;
pNodeInfo[dwCurLine].byLineHi = (UINT8)height0;
#else
if(dwCurLine%BROWSER_NODE_LEN == 0)
{
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].pLinePtr = pData;
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].wStates =
pBrowserer->pBrwInfo->wStates & ~BROWSER_STATE_INITIAL;
}
#endif
}
else
{
/*拨动数据指针*/
pData += wMoveLen;
}
continue;
}
else if (wUnitWidth == 0) /*结束符*/
{
//记录行指针
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[ (dwCurLine+1)].pLinePtr = pData;
#else
if( (dwCurLine+1)%BROWSER_NODE_LEN == 0)
{
pNodeInfo[ (dwCurLine+1)/BROWSER_NODE_LEN ].pLinePtr = pData;
}
#endif
break;
}
/* 单词显示长度大于行最大显示长度 */
else if (wUnitWidth > wTotalCol)
{
UINT8 *p,*ptr;
UINT range;
UINT32 dwLen,l,i;
UINT16 w,h;
/*如果不是行开始位置则另起一行*/
if (wCurCol != 0)
{
dwCurLine ++;
/*如果超出最大行数,截断数据并返回*/
if (dwCurLine >= BROWSER_MAX_LINENUM)
{
(*pData) = BROWSER_DATA_END;
/*记录行指针*/
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[dwCurLine].pLinePtr = pData;
#else
if(dwCurLine%BROWSER_NODE_LEN == 0)
{
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].pLinePtr = pData;
}
#endif
break;
}
}
wCurCol = 0;
/*标记符长度*/
l = (UINT32)wMoveLen - strlen(pUnitBuff);
p = pUnitBuff;
i = 0;
FontGetStringRect(&width,&height," ");
while (*p)
{
/*数据长度*/
dwLen = p - pUnitBuff;
ptr = pUnitBuff + dwLen;
/*计算一行最多显示的字符串指针位置*/
range = wTotalCol;
p = BrwWidthCutStr(ptr,FontGetLib(),0,&range);
/*记录行指针*/
if (i == 0)
{
/*记录行指针*/
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[dwCurLine].pLinePtr = pData;
#else
if(dwCurLine%BROWSER_NODE_LEN == 0)
{
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].pLinePtr = pData;
}
#endif
}
else
{
/*记录行指针*/
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[dwCurLine].pLinePtr = pData + dwLen + l;
#else
if(dwCurLine%BROWSER_NODE_LEN == 0)
{
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].pLinePtr = pData + dwLen + l;
}
#endif
}
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[dwCurLine].wStates =
pBrowserer->pBrwInfo->wStates & ~BROWSER_STATE_INITIAL;
pNodeInfo[dwCurLine].byLineHi = (UINT8)height;
#else
if(dwCurLine%BROWSER_NODE_LEN == 0)
{
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].wStates =
pBrowserer->pBrwInfo->wStates & ~BROWSER_STATE_INITIAL;
}
#endif
if (*p)
{
dwCurLine ++;
}
i ++;
/*如果超出最大行数,截断数据并返回*/
if (dwCurLine >= BROWSER_MAX_LINENUM)
{
(*pData) = BROWSER_DATA_END;
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[dwCurLine].pLinePtr = pData;
#else
if(dwCurLine%BROWSER_NODE_LEN == 0)
{
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].pLinePtr = pData;
}
#endif
break;
}
}
FontGetStringRect(&w,&h,ptr);
wCurCol = w;
pData += wMoveLen;
continue;
}
/*总长度超行,另起一行*/
else if ((wCurCol + wUnitWidth) > wTotalCol)
{
wCurCol = 0;
dwCurLine ++;
/*如果超出最大行数,截断数据并返回*/
if (dwCurLine >= BROWSER_MAX_LINENUM)
{
(*pData) = BROWSER_DATA_END;
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[dwCurLine].pLinePtr = pData;
#else
if(dwCurLine%BROWSER_NODE_LEN == 0)
{
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].pLinePtr = pData;
}
#endif
break;
}
/*记录行指针*/
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[dwCurLine].pLinePtr = pData;
pNodeInfo[dwCurLine].wStates =
pBrowserer->pBrwInfo->wStates & ~BROWSER_STATE_INITIAL;
pNodeInfo[dwCurLine].byLineHi = (UINT8)height;
#else
if(dwCurLine%BROWSER_NODE_LEN == 0)
{
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].pLinePtr = pData;
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].wStates =
pBrowserer->pBrwInfo->wStates & ~BROWSER_STATE_INITIAL;
}
#endif
}
/*是不是行首空格*/
if ((wCurCol == 0 && *pUnitBuff == ' ')
&& (pBrowserer->pBrwInfo->wOptions & BROWSER_OPTION_ALIGNLEFT))
{
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[dwCurLine].pLinePtr = pData + wMoveLen;
#else
if(dwCurLine%BROWSER_NODE_LEN == 0)
{
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].pLinePtr = pData + wMoveLen;
}
#endif
bFirstSpace = TRUE;
}
else
{
bFirstSpace = FALSE;
}
if (!bFirstSpace)
{
/*缩进*/
if (pBrowserer->pBrwInfo->wStates & BROWSER_STATE_TAB)
{
if (wCurCol == 0)
{
if (pBrowserer->pBrwInfo->byTabGrade == 0)
{
wCurCol = BROWSER_TAB_LENGTH;
pBrowserer->pBrwInfo->byTabGrade = 1;
}
else
{
wCurCol = pBrowserer->pBrwInfo->wTabWidth;
//pLineInfo[dwCurLine].wStates |= BROWSER_STATE_NEXTTAB;
}
}
}
/*累加列宽*/
wCurCol += wUnitWidth;
}
/*拨动指针*/
pData += wMoveLen;
}
pBrowserer->pBrwInfo->wStates = wState;
pBrowserer->pBrwInfo->bFinished = TRUE;
//释放内存
BROWSER_STACK_FREE(pBrowserer,BROWSER_UNIT_MAXLEN);
if(wCurCol != 0)
{
dwCurLine++;
}
return dwCurLine;
}
UINT8 *BrowserLineColToRealPos(MBrowser *handle, UINT32 dwLine, UINT16 wCol)
{
UINT8 *pData;
UINT16 wMoveLen;
UINT32 dwCurLine;
UINT16 wCurCol,wWordCol;
MBrowser bv,*pBrowserer;
MLineInfo LineInfo;
UINT8* pUnitBuff;
UINT16 wTotalCol,font;
//申请内存
pUnitBuff = BROWSER_STACK_ALLOC(handle,BROWSER_UNIT_MAXLEN);
/*复制句柄数据*/
memcpy(&bv,handle,sizeof(MBrowser));
bv.pBrwInfo = BROWSER_STACK_ALLOC(handle,sizeof(MBrowserInfo));
memcpy(bv.pBrwInfo, handle->pBrwInfo, sizeof(MBrowserInfo));
pBrowserer = &bv;
/*找到行指针*/
GetLineInfo(handle, dwLine, &LineInfo);
pData = LineInfo.pLinePtr;
pBrowserer->pBrwInfo->wStates = LineInfo.wStates;
if (pData == (UINT8*)NULL)
{
BROWSER_STACK_FREE(handle,sizeof(MBrowserInfo));
BROWSER_STACK_FREE(handle,BROWSER_UNIT_MAXLEN);
return pData;
}
/*设置起始字体*/
//================================
//Modified by Liang Ruhui on 2007-09-11
//保护系统字体
font = GraphGetFontID();
//font = pBrowserer->wFontID;
//================================
BrowserSetPositionFont(pBrowserer,pData);
dwCurLine = dwLine;
wCurCol = 0;
wTotalCol = pBrowserer->pBrwInfo->wTotalCol;
while (wCurCol < wCol)
{
/*开始遍历*/
wWordCol = BrowserGetOneUnit(pBrowserer, pData,
pUnitBuff, &wMoveLen,BROWSER_SCANNING);
/*需要换行*/
if (pBrowserer->pBrwInfo->wStates & BROWSER_STATE_RETURN)
{
if (wCurCol == 0)
{
pBrowserer->pBrwInfo->wStates &= ~BROWSER_STATE_RETURN;
}
else
{
break;
}
}
/*缩进*/
if (pBrowserer->pBrwInfo->wStates & BROWSER_STATE_TAB)
{
if (wCurCol == 0)
{
if (pBrowserer->pBrwInfo->byTabGrade == 0)
{
wCurCol = BROWSER_TAB_LENGTH;
pBrowserer->pBrwInfo->byTabGrade = 1;
}
else
{
wCurCol = pBrowserer->pBrwInfo->wTabWidth;
}
}
}
/*居中显示*/
if (pBrowserer->pBrwInfo->wStates & BROWSER_STATE_CENTER)
{
UINT16 co;
/*起始位置*/
co = BrowserCenterStart(pBrowserer,pData,wCurCol,wTotalCol);
if (co != 0)
{
wCurCol += co;
pBrowserer->pBrwInfo->wStates &= ~BROWSER_STATE_CENTER;
}
}
/*遇到回车*/
if (wWordCol == (UINT16)-1)
{
if (wCurCol == 0)
{
pData += wMoveLen;
continue;
}
else
{
break;
}
}
/*数据结束*/
else if (wWordCol == 0)
{
break;
}
/*超过一行了*/
else if ((wCurCol + wWordCol) > wCol)
{
UINT range;
UINT8 *pTemp;
range = wCol - wCurCol;
pTemp = pUnitBuff;
pTemp = BrwWidthCutStr(pUnitBuff,FontGetLib(),0,&range);
pData += pTemp - pUnitBuff;
pData += wMoveLen - strlen(pUnitBuff);
break;
}
wCurCol += wWordCol;
pData += wMoveLen;
}
//释放堆栈
BROWSER_STACK_FREE(handle, sizeof(MBrowserInfo));
BROWSER_STACK_FREE(handle,BROWSER_UNIT_MAXLEN);
GraphSetFontID(font);
ClrFontInvertStyle();
return pData;
}
/************************************************************************/
/* 函数名称: BrowserCenterStart */
/* 函数描述: 计算居中起始位置 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* pBrowserer - 对象句柄 */
/* pData - 数据指针 */
/* curCol - 当前列 */
/* totalCol - 总列数 */
/* 输出参数: */
/* NONE */
/* 返回值 : */
/* 起始位置 */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
UINT16 BrowserCenterStart(MBrowser *pBrowserer,UINT8 *pData,
UINT16 curCol,UINT16 totalCol)
{
UINT16 w,m;
MBrowser bv,*handle;
UINT uTemp;
if (curCol >= totalCol)
{
return 0;
}
/*复制结构*/
memcpy(&bv,pBrowserer,sizeof(MBrowser));
bv.pBrwInfo = BROWSER_STACK_ALLOC(pBrowserer, sizeof(MBrowserInfo));
memcpy(bv.pBrwInfo, pBrowserer->pBrwInfo, sizeof(MBrowserInfo));
handle = &bv;
/*得到一个Unit*/
w = BrowserGetOneUnit(handle,pData,(UINT8 *)NULL,&m,BROWSER_SCANNING);
/*缩进*/
if (handle->pBrwInfo->wStates & BROWSER_STATE_TAB)
{
if (curCol == 0)
{
if (handle->pBrwInfo->byTabGrade == 0)
{
curCol = BROWSER_TAB_LENGTH;
handle->pBrwInfo->byTabGrade = 1;
}
else
{
curCol = handle->pBrwInfo->wTabWidth;
}
}
}
if ((w == 0) || (w == (UINT16)-1))
{
BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
return 0;
}
if (curCol + w >= totalCol)
{
curCol = 0;
}
if (curCol != 0)
{
BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
return 0;
}
/*遍历数据,直到居中标记结束或者换行*/
while (handle->pBrwInfo->wStates & BROWSER_STATE_CENTER)
{
if ((w == 0) || (w == (UINT16)-1))
{
BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
return 0;
}
curCol += w;
if (curCol >= totalCol)
{
BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
return 0;
}
pData += m;
while(uTemp = BrowserFilter(handle,pData,BROWSER_UNIT_SYMBOL)) {
pData += uTemp;
if (!(handle->pBrwInfo->wStates & BROWSER_STATE_CENTER)) {
BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
return (totalCol - curCol) / 2;
}
}
w = BrowserGetOneUnit(handle,pData,(UINT8 *)NULL,&m,BROWSER_SCANNING);
}
BROWSER_STACK_FREE(pBrowserer,sizeof(MBrowserInfo));
return (totalCol - curCol) / 2;
}
UINT BrowserLineWidth(MBrowser *handle,UINT32 line)
{
UINT8 *ps,*pe;
UINT32 l;
UINT16 c;
c = handle->pBrwInfo->wTotalCol;
ps = BrowserLineColToPos(handle,line,0);
pe = BrowserLineColToPos(handle,line + 1,0);
if (!ps || !pe)
{
return c;
}
BrowserPendToLineCol(handle,ps,pe,&l,&c);
if ((l != line) || (c > handle->pBrwInfo->wTotalCol))
{
c = handle->pBrwInfo->wTotalCol;
}
return c;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -