📄 brw_calc.c
字号:
/**************************************************************************
Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD
FILE NAME: brw_calc.C
MODULE NAME: browser
DESCRIPTION: 浏览器行列位置转换等函数
BrowserPageLineSum 计算总行数
BrowerAdjustTopLine 调整顶行
BrowserLinesHeight 计算行高
BrowserLineColToXY 行列转XY坐标
BrowserXyToLineCol XY转行列
BrowserPosToLineCol 内存位置转行列
BrowserLineColToPos 行列转内存位置
BrowserPendToLineCol 得到结尾处的行列
BrowserLineSpace 得到行高
BrowserCalcTotalLine 计算总行
BrowserCenterStart 计算居中位置
BrowserLineWidth 某一行的宽度
**************************************************************************
DTAE AUTHOR VERSION REMARKS
=========== ========== ========= ======================================
2006-3-5 gaolinhui V1.0 create
***************************************************************************/
#include "kernel.h"
#include "BrowserIn.h"
/************************************************************************/
/* 函数名称: BrowserPageLineSum */
/* 函数描述: 计算一屏显示行数 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* handle - 对象句柄 */
/* dwTopLine - 顶行 */
/* 输出参数: */
/* NONE */
/* 返回值 : */
/* 行数 */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
UINT16 BrowserPageLineSum(MBrowser *handle,UINT32 dwTopLine)
{
UINT16 wPageHeight,wTotalHeight;
MLineInfo LineInfo;
UINT16 i;
if(!GetLineInfo(handle, dwTopLine, &LineInfo))
return 0;
wPageHeight = handle->pBrwInfo->wHeight;
wTotalHeight = 0;
i = 0;
while (1)
{
if ( LineInfo.wFontMaxHi == 0 )
{
break;
}
wTotalHeight += LineInfo.wFontMaxHi;
if ((i == 0) && (LineInfo.wStates & BROWSER_STATE_DICTITEM))
{
wTotalHeight = BrowserItemHeigh(handle);
}
wTotalHeight += handle->wLineSpace;
if (wTotalHeight > wPageHeight)
{
break;
}
i ++;
dwTopLine++;
if(!GetLineInfo(handle, dwTopLine, &LineInfo))
break;
}
return i;
}
/************************************************************************/
/* 函数名称: BrowerAdjustTopLine */
/* 函数描述: 设置顶行 */
/* 当前版本: 1.0 */
/* 作 者: */
/* 输入参数: */
/* handle - 对象句柄 */
/* dwTopLine - 顶行 */
/* 输出参数: */
/* NONE */
/* 返回值 : */
/* TRUE/FALSE */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
UINT32 BrowerAdjustTopLine(MBrowser *handle,UINT32 dwTopLine)
{
UINT32 dwFirstLine,dwTotalLine;
UINT32 dwPageHeight,dwHeight;
dwFirstLine = dwTopLine;
dwTotalLine = handle->pBrwInfo->dwTotalLine;
dwPageHeight = handle->pBrwInfo->wHeight;
if (dwTopLine > (dwTotalLine - 1))
{
dwTopLine = dwTotalLine - 1;
}
dwHeight = BrowserLinesHeight(handle,dwTopLine,(dwTotalLine - 1));
if (dwHeight < dwPageHeight)
{
while (dwTopLine)
{
dwTopLine --;
dwHeight = BrowserLinesHeight(handle,dwTopLine,(dwTotalLine - 1));
if (dwHeight > dwPageHeight)
{
dwTopLine ++;
break;
}
}
}
return dwTopLine;
}
/************************************************************************/
/* 函数名称: BrowserLinesHeight */
/* 函数描述: 计算行高 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* handle - 对象句柄 */
/* dwLineStart - 起始行 */
/* dwLineEnd - 结束行 */
/* 输出参数: */
/* NONE */
/* 返回值 : */
/* 高度 */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
UINT16 BrowserLinesHeight(MBrowser *handle,UINT32 dwLineStart,
UINT32 dwLineEnd)
{
MLineInfo LineInfo;
UINT32 i;
UINT16 height;
if(!GetLineInfo(handle, dwLineStart, &LineInfo)) return 0;
height = 0;
for (i = dwLineStart;i <= dwLineEnd;i ++)
{
if (LineInfo.wFontMaxHi == 0)
{
break;
}
height += LineInfo.wFontMaxHi;
if (((i == dwLineStart) && (dwLineStart != dwLineEnd)
&& (LineInfo.wStates & BROWSER_STATE_DICTITEM))
|| ((dwLineStart == dwLineEnd) && (dwLineStart == handle->pBrwInfo->dwTopLine))
&& (LineInfo.wStates & BROWSER_STATE_DICTITEM))
{
//height -= BrowserItemSpace(handle);
height = BrowserItemHeigh(handle);
}
height += handle->wLineSpace;
dwLineStart++;
if(!GetLineInfo(handle, dwLineStart, &LineInfo)) break;
}
return height;
}
/************************************************************************/
/* 函数名称: BrowserLineColToXY */
/* 函数描述: 行列位置转换到坐标 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* handle - 对象句柄 */
/* dwLine - 行 */
/* wCol - 列 */
/* 输出参数: */
/* xParam - x坐标 */
/* yParam - y坐标 */
/* 返回值 : */
/* NONE */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
VOID BrowserLineColToXY(MBrowser *pBrowserer, UINT32 dwLine,
UINT16 wCol, UINT16 *xParam, UINT16 *yParam)
{
UINT32 topLine,i;
MLineInfo LineInfo;
topLine = pBrowserer->pBrwInfo->dwTopLine;
if(topLine+dwLine >= pBrowserer->pBrwInfo->dwTotalLine)
{
dwLine = pBrowserer->pBrwInfo->dwTotalLine - topLine;
}
*xParam = (UINT16)wCol;
*yParam = 0;
for (i = 0;i < dwLine;i ++)
{
if(!GetLineInfo(pBrowserer, topLine+i, &LineInfo)) return;
*yParam += LineInfo.wFontMaxHi;
if (( i == 0) && (LineInfo.wStates & BROWSER_STATE_DICTITEM))
{
//*yParam -= BrowserItemSpace(pBrowserer);
*yParam = BrowserItemHeigh(pBrowserer);
}
*yParam += pBrowserer->pBrwInfo->wLineSpace;
}
}
/************************************************************************/
/* 函数名称: BrowserXyToLineCol */
/* 函数描述: 坐标位置转换为行列位置 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* handle - 对象句柄 */
/* x,y - 坐标 */
/* 输出参数: */
/* line,col - 行列 */
/* 返回值 : */
/* TRUE/FALSE */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
BOOL BrowserXyToLineCol(MBrowser *handle,UINT16 x,UINT16 y,
UINT32 *line,UINT16 *col)
{
UINT16 width,height,CurY;
UINT32 dwTopLine,i,dwTotalLine;
MLineInfo LineInfo;
width = handle->pBrwInfo->wWidth;
height = handle->pBrwInfo->wHeight;
//如果xy超出控件范围,返回FALSE
if (x > width || y > height )
{
return FALSE;
}
dwTotalLine = handle->pBrwInfo->dwTotalLine;
dwTopLine = handle->pBrwInfo->dwTopLine;
for(CurY=0,i=0; (CurY<=y) && (dwTopLine+i<dwTotalLine); i++)
{
if(!GetLineInfo(handle, dwTopLine+i, &LineInfo)) return FALSE;
if (( i == 0) && (LineInfo.wStates & BROWSER_STATE_DICTITEM))
{
CurY += BrowserItemHeigh(handle);
}
else
{
CurY += LineInfo.wFontMaxHi;
}
CurY += handle->pBrwInfo->wLineSpace;
}
*col = x/(handle->pBrwInfo->wColWidth);
*line = i-1;
return TRUE;
}
/************************************************************************/
/* 函数名称: BrowserPosToLineCol */
/* 函数描述: 指定数据的行列位置 */
/* 当前版本: 1.0 */
/* 作 者: gaolinhui */
/* 输入参数: */
/* handle - 对象句柄 */
/* pCurrent - 数据指针 */
/* 输出参数: */
/* line - 行 */
/* col - 列 */
/* 返回值 : */
/* TRUE/FALSE */
/* 更改记录: */
/* =====================================================================*/
/* 日期 人员 版本 描述 */
/* =====================================================================*/
/* 2006-3-1 gaolinhui 1.0 创建 */
/************************************************************************/
BOOL BrowserPosToLineCol(MBrowser *handle,UINT8 *pCurrent,
UINT32 *line,UINT16 *col)
{
UINT8 *pData, *pTmp;
UINT16 wMoveLen, wMemLen;
UINT32 dwCurLine, dwLen,dwCurCol, i;
UINT16 wUnitWidth,wLineWidth,wTotalWidth;
UINT8* pUnitBuff;
UINT16 height;
MBrowser dv,*pBrowserer;
MLineInfo LineInfo;
BrowserNodeInfo* pNode;
UINT16 ww,hh,font;
if(pCurrent < handle->pBrwInfo->pBuffer)
{
return FALSE;
}
//申请内存
pUnitBuff = BROWSER_STACK_ALLOC(handle,BROWSER_UNIT_MAXLEN);
/*复制句柄数据*/
memcpy(&dv,handle,sizeof(MBrowser));
dv.pBrwInfo = BROWSER_STACK_ALLOC(handle,sizeof(MBrowserInfo));
memcpy(dv.pBrwInfo, handle->pBrwInfo, sizeof(MBrowserInfo));
pBrowserer = &dv;
/*得到起始行指针pData*/
pNode = pBrowserer->pBrwInfo->pNodeInfo;
for(i=0; (pNode[i].pLinePtr<=pCurrent)
&&(pNode[i].pLinePtr != NULL); i++)
{
}
if(i>0)
i--;
if(pNode[i].pLinePtr == NULL)
{
//释放堆栈
BROWSER_STACK_FREE(handle, sizeof(MBrowserInfo));
BROWSER_STACK_FREE(handle,BROWSER_UNIT_MAXLEN);
return FALSE;
}
#if !defined(BORWSER_RECORD_EVERY)
i = i*BROWSER_NODE_LEN; //转化为行号
GetLineInfo(pBrowserer, i, &LineInfo);
while((LineInfo.pLinePtr<=pCurrent)&&(LineInfo.pLinePtr != NULL))
{
i++;
GetLineInfo(pBrowserer, i, &LineInfo);
}
if (i > 0)
{
i--;
}
#endif
if(!GetLineInfo(pBrowserer, i, &LineInfo))
{
//释放堆栈
BROWSER_STACK_FREE(handle, sizeof(MBrowserInfo));
BROWSER_STACK_FREE(handle,BROWSER_UNIT_MAXLEN);
return FALSE;
}
pData = LineInfo.pLinePtr;
pTmp = pData;
/*gaolinhui, added, 060718*/
pBrowserer->pBrwInfo->wStates = LineInfo.wStates;
/**************************/
/*设置起始字体*/
//====================================
//Modified by Liang Ruhui on 2007-9-11
//保护系统字体
font = GraphGetFontID();
// font = pBrowserer->wFontID;
//====================================
BrowserSetPositionFont(pBrowserer,pData);
/*变量初始化*/
dwCurCol = 0;
wLineWidth = 0;
wTotalWidth = pBrowserer->pBrwInfo->wTotalCol;
/*确定了行号*/
dwCurLine = i;
while (1)
{
/*得到一个unit*/
wUnitWidth = BrowserGetOneUnit(pBrowserer, pData,
pUnitBuff, &wMoveLen,BROWSER_SCANNING);
if (wUnitWidth == 0)
{
/*数据结束*/
break;
}
/*缩进*/
if (pBrowserer->pBrwInfo->wStates & BROWSER_STATE_TAB)
{
if (wLineWidth == 0)
{
if (pBrowserer->pBrwInfo->byTabGrade == 0)
{
wLineWidth = BROWSER_TAB_LENGTH;
pBrowserer->pBrwInfo->byTabGrade = 1;
}
else
{
wLineWidth = pBrowserer->pBrwInfo->wTabWidth;
}
}
}
/*居中显示*/
if (pBrowserer->pBrwInfo->wStates & BROWSER_STATE_CENTER)
{
UINT16 co;
/*起始位置*/
co = BrowserCenterStart(pBrowserer,pData,wLineWidth,wTotalWidth);
if (co != 0)
{
wLineWidth += co;
pBrowserer->pBrwInfo->wStates &= ~BROWSER_STATE_CENTER;
}
}
if (wUnitWidth == (UINT16)-1)
{
/*换行*/
pData += wMoveLen;
continue;
}
else if (wUnitWidth > wTotalWidth)
{
/* 单词显示长度大于行最大显示长度 */
if (wLineWidth != 0)
{
/*换行则返回*/
break;
}
/*内存长度*/
dwLen = wMoveLen;
/*减去字符串长度,得到标记长度*/
dwLen -= strlen(pUnitBuff);
/*过滤掉标记*/
pData += dwLen;
dwCurCol = 0;
/*超出搜索范围*/
while (pData < pCurrent)
{
wMemLen = BrowserCharMemLength(pData);
dwCurCol += wMemLen;
pData += wMemLen;
}
/*截断字符串*/
pUnitBuff[dwCurCol] = 0;
/*得到显示长度wLineWidth*/
FontGetStringRect(&ww,&hh,pUnitBuff);
wLineWidth = (UINT16)ww;
height = (UINT16)hh;
break;
}
else if ((wLineWidth + wUnitWidth) > wTotalWidth)
{
/*显示超行,另起一行*/
break;
}
if ((pData + wMoveLen) > pCurrent)
{
/*超出搜索范围*/
/*内存长度*/
dwLen = wMoveLen;
/*减去字符串长度,得到标记长度*/
dwLen -= strlen(pUnitBuff);
/*过滤掉标记*/
pData += dwLen;
dwCurCol = 0;
while (pData < pCurrent)
{
wMemLen = BrowserCharMemLength(pData);
dwCurCol += wMemLen;
pData += wMemLen;
}
/*截断字符串*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -