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

📄 brw_calc.c

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