📄 brw_calc.c
字号:
pUnitBuff[dwCurCol] = 0;
/*计算显示长度wUnitWidth*/
FontGetStringRect(&ww,&hh,pUnitBuff);
wUnitWidth = (UINT16)ww;
height = (UINT16)hh;
wLineWidth += wUnitWidth;
break;
}
wLineWidth += wUnitWidth;
pData += wMoveLen;
}
/*成功返回,dwLine是行数,dwCol是显示宽度,由此可确定显示位置*/
*line = dwCurLine;
*col = wLineWidth;
//释放堆栈
BROWSER_STACK_FREE(handle, sizeof(MBrowserInfo));
BROWSER_STACK_FREE(handle,BROWSER_UNIT_MAXLEN);
// handle->pBrwInfo->wFontID = font;
GraphSetFontID(font);
ClrFontInvertStyle();
return TRUE;
}
/************************************************************************/
/* 函数名称: BrowserLineColToPos */
/* 函数描述: 行列位置到内存位置 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* handle - 对象句柄 */
/* dwLine,wCol - 行列位置 */
/* 输出参数: */
/* NONE */
/* 返回值 : */
/* 内存位置 */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
UINT8 *BrowserLineColToPos(MBrowser *handle, UINT32 dwLine, UINT16 wCol)
{
UINT8 *pData;
UINT16 wMoveLen;
UINT32 dwCurLine;
UINT16 wCurCol,wWordCol;
MBrowser bv,*pBrowserer;
MLineInfo LineInfo;
UINT8* pUnitBuff;
UINT16 wTotalCol;
UINT16 font;
//如果数据未完成,返回失败
if(!handle->pBrwInfo->bFinished)
{
return (UINT8*)NULL;
}
//判断行是否大于最大行
if(dwLine >= handle->pBrwInfo->dwTotalLine)
{
return (UINT8*)NULL;
}
//申请内存
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;
/*找到行指针*/
if(!GetLineInfo(pBrowserer, dwLine, &LineInfo))
{
BROWSER_STACK_FREE(handle,sizeof(MBrowserInfo));
BROWSER_STACK_FREE(handle,BROWSER_UNIT_MAXLEN);
return (UINT8*)NULL;
}
pData = LineInfo.pLinePtr;
pBrowserer->pBrwInfo->wStates = LineInfo.wStates;
/*设置起始字体*/
//=====================================
//modified by Liang Ruhui on 2007-9-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)
{
break;
}
wCurCol += wWordCol;
pData += wMoveLen;
}
//释放堆栈
BROWSER_STACK_FREE(handle, sizeof(MBrowserInfo));
BROWSER_STACK_FREE(handle,BROWSER_UNIT_MAXLEN);
GraphSetFontID(font);
ClrFontInvertStyle();
return pData;
}
/************************************************************************/
/* 函数名称: BrowserPendToLineCol */
/* 函数描述: 得到数据结尾处行列位置 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* pDView - 对象句柄 */
/* pStart - 数据开始 */
/* pEnd - 数据结尾 */
/* 输出参数: */
/* line - 行 */
/* col - 列 */
/* 返回值 : */
/* NONE */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
VOID BrowserPendToLineCol(MBrowser *pDView,UINT8 *pStart,UINT8 *pEnd,
UINT32 *line,UINT16 *col)
{
UINT8 *pBuff,*p0,*pBuffer0;
MBrowser bv,*handle;
UINT32 dwLen,dwOffset,dwBak1,dwBak2;
INT ret;
UINT16 font;
memcpy(&bv,pDView,sizeof(MBrowser));
bv.pBrwInfo = BROWSER_STACK_ALLOC(pDView, sizeof(MBrowserInfo));
memcpy(bv.pBrwInfo, pDView->pBrwInfo, sizeof(MBrowserInfo));
handle = &bv;
dwLen = pEnd - pStart;
pBuff = MemAlloc(dwLen + 1);
p0 = pBuff;
memset(pBuff,0,dwLen + 1);
memcpy(pBuff,pStart,dwLen);
//========================================
//Modified by Liang Ruhui on 2007-09-11
//保护系统字体
font = GraphGetFontID();
//font = pDView->wFontID;
//========================================
BrowserSetPositionFont(handle,pStart);
if(!BrowserPosToLineCol(handle,pStart,line,col))
{
*line = 0;
*col = 0;
MemFree(p0);
BROWSER_STACK_FREE(pDView,sizeof(MBrowserInfo));
return;
}
ret = BrowserFilter(handle,pStart,BROWSER_UNIT_SYMBOL);
while (ret)
{
/*跳过标记*/
pBuff += ret;
pStart += ret;
ret = BrowserFilter(handle,pStart,BROWSER_UNIT_SYMBOL);
}
if ((UINT32)(pBuff - p0) >= dwLen) {
MemFree(p0);
BROWSER_STACK_FREE(pDView,sizeof(MBrowserInfo));
return;
}
handle->pBrwInfo->wStates &= ~BROWSER_STATE_RETURN;
dwBak1 = handle->pBrwInfo->dwExtraStart;
dwBak2 = handle->pBrwInfo->dwExtraEnd;
dwOffset = pStart - handle->pBrwInfo->pBuffer;
if (dwBak1 > dwOffset)
{
handle->pBrwInfo->dwExtraStart = dwBak1 - dwOffset;
}
else
{
handle->pBrwInfo->dwExtraStart = 0;
}
if (dwBak2 > dwOffset)
{
handle->pBrwInfo->dwExtraEnd = dwBak2 - dwOffset;
}
else
{
handle->pBrwInfo->dwExtraEnd = 0;
}
pBuffer0 = handle->pBrwInfo->pBuffer;
handle->pBrwInfo->pBuffer = p0;
if(BrowserCalcLineCol(handle,pBuff,line,col) < 0)
{
*line = 0;
*col = 0;
}
handle->pBrwInfo->dwExtraStart = dwBak1;
handle->pBrwInfo->dwExtraEnd = dwBak2;
handle->pBrwInfo->pBuffer = pBuffer0;
MemFree(p0);
BROWSER_STACK_FREE(pDView,sizeof(MBrowserInfo));
GraphSetFontID(font);
ClrFontInvertStyle();
}
UINT16 BrowserLineSpace(MBrowser *handle,UINT32 line)
{
return handle->pBrwInfo->wLineSpace;
#if 0
MLineInfo LineInfo;
UINT8 *pStart,*pEnd;
UINT16 height0;
UINT16 font0,font,move,states,ret;
FontInfo fontInfo;
if(line >= handle->pBrwInfo->dwTotalLine)
return 0;
if(!GetLineInfo(handle, line, &LineInfo))
return 0;
pStart = LineInfo.pLinePtr;
ret = LineInfo.wStates;
height0 = LineInfo.wFontMaxHi;
if(!GetLineInfo(handle,line+1,&LineInfo))
return 0;
pEnd = LineInfo.pLinePtr;
states = handle->pBrwInfo->wStates;
font0 = handle->pBrwInfo->wFontID;
handle->pBrwInfo->wStates = ret;
ret = 0;
if (pEnd)
{
while (pStart < pEnd)
{
BrowserGetOneUnit(handle,pStart,NULL,&move,BROWSER_SCANNING);
if (handle->pBrwInfo->wStates & BROWSER_STATE_DICTITEM)
{
/*
if (font0 == SYSFONT_DIFFGBK16)
{
font = SYSFONT_DIFFGBK24;
}
else if (font0 == SYSFONT_DIFFGBK12)
{
font = SYSFONT_DIFFGBK16;
}
else if (font0 == SYSFONT_DIFFGBK24)
{
font = SYSFONT_DIFFGBK24;
}
else
{
*/
font = handle->wFontID;
// }
FontGetCharInfo(font,' ',&fontInfo,NULL);
ret = height0 - fontInfo.wFontHeight;
break;
}
pStart += move;
}
}
handle->pBrwInfo->wStates = states;
return ret;
#endif
}
/************************************************************************/
/* 函数名称: BrowserCalcTotalLine */
/* 函数描述: 计算总行数 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* handle - 对象句柄 */
/* 输出参数: */
/* NONE */
/* 返回值 : */
/* 总行数 */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
UINT32 BrowserCalcTotalLine(MBrowser *pBrowserer,UINT16 wState)
{
UINT32 dwCurLine;
UINT8 *pData;
UINT16 wTotalCol,wCurCol,wMoveLen;
UINT16 wUnitWidth;
UINT8* pUnitBuff;
BrowserNodeInfo *pNodeInfo;
UINT16 width,height,height0;
UINT16 font0;
BOOL bFirstSpace;
if(pBrowserer->pBrwInfo->pBuffer == NULL)
{
return 0;
}
//申请内存
pUnitBuff = BROWSER_STACK_ALLOC(pBrowserer,BROWSER_UNIT_MAXLEN);
/*初始化*/
pBrowserer->pBrwInfo->wStates = wState;
dwCurLine = 0; /*当前行*/
wCurCol = pBrowserer->pBrwInfo->wStartCol; /*当前列*/
pData = pBrowserer->pBrwInfo->pBuffer;
pNodeInfo = pBrowserer->pBrwInfo->pNodeInfo;
wTotalCol = pBrowserer->pBrwInfo->wTotalCol; /*总列数*/
memset(pNodeInfo, 0x0, (BROWSER_MAX_NODES + 1)*sizeof(BrowserNodeInfo));
FontGetStringRect(&width,&height0, " ");
font0 = pBrowserer->pBrwInfo->wFontID;
pNodeInfo[0].pLinePtr = pData; /*顶行数据指针是数据首地址*/
pNodeInfo[0].wStates = wState;
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[0].byLineHi = (UINT8)height0;
#endif
/*开始遍历数据,累加行列数*/
while (1)
{
/*得到一个unit,字符串保存在pUnitBuff中*/
wUnitWidth = BrowserGetOneUnit(pBrowserer, pData,
pUnitBuff, &wMoveLen,BROWSER_LOADING);
/*需要换行*/
if (pBrowserer->pBrwInfo->wStates & BROWSER_STATE_RETURN)
{
if ((wCurCol != 0) && (wUnitWidth != (UINT16)-1))
{
dwCurLine ++;
wCurCol = 0;
/*如果超出最大行数,截断数据并返回*/
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)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
}
pBrowserer->pBrwInfo->wStates &= ~BROWSER_STATE_RETURN;
}
/*分段*/
if (pBrowserer->pBrwInfo->wStates & BROWSER_STATE_SEGMENT)
{
/*记录行指针*/
#if defined(BORWSER_RECORD_EVERY)
pNodeInfo[dwCurLine].byLineHi = (UINT8)height0*2;
pNodeInfo[dwCurLine].wStates |= BROWSER_STATE_DICTITEM;
#else
if(dwCurLine%BROWSER_NODE_LEN == 0)
{
pNodeInfo[dwCurLine/BROWSER_NODE_LEN].wStates |= BROWSER_STATE_DICTITEM;
}
#endif
pBrowserer->pBrwInfo->wStates &= ~BROWSER_STATE_SEGMENT;
}
/*居中显示*/
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 (wUnitWidth == (UINT16)-1) /*换行*/
{
/*另起一行*/
if (wCurCol != 0)
{
dwCurLine ++;
wCurCol = 0;
/*如果超出最大行数,截断数据并返回*/
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -