⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 brw_calc.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 3 页
字号:
/**************************************************************************
                                                                          
              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 + -