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

📄 readbox.c

📁 这一款新闻类业务的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	AECHAR*		pAEDaw = NULL;
	int			nTem = 0;
	uint16		i;
	uint16      nMaxLine;
	
	if(NULL == pReadBox->m_pnListTable)			//检查索引表是否存在
		return;
	if(READBOX_STATE_STOK != pReadBox->m_eState)	//检查是否为正确状态
		return;

	//IDISPLAY_FillRect(pReadBox->m_pThis->m_pIDisplay , pReadBox->m_pAPPRect , pReadBox->m_colorList[pReadBox->m_nColorBack]);
	//设置前景色
	//IDISPLAY_SetColor(pReadBox->m_pThis->m_pIDisplay , CLR_USER_BACKGROUND , pReadBox->m_colorList[pReadBox->m_nColorBack]);
	IDISPLAY_SetColor(pReadBox->m_pThis->m_pIDisplay , CLR_USER_BACKGROUND , pReadBox->m_colorList[7]);
	IDISPLAY_ClearScreen(pReadBox->m_pThis->m_pIDisplay);
	//IDISPLAY_SetColor(pReadBox->m_pThis->m_pIDisplay , CLR_USER_TEXT , pReadBox->m_colorList[pReadBox->m_nColorText]);
    IDISPLAY_SetColor(pReadBox->m_pThis->m_pIDisplay , CLR_USER_TEXT , pReadBox->m_colorList[6]);
	//获得正确最大行数
	nMaxLine = MIN(pReadBox->m_nMaxScrLine , (uint16)(pReadBox->m_nLtTa - pReadBox->m_nIndex));
	for(i = 0 ; i <= nMaxLine ; i++)
	{
		pAEDaw = pReadBox->m_pAENowTmp + (pReadBox->m_pnListTable[pReadBox->m_nIndex + i] - pReadBox->m_pnListTable[pReadBox->m_nIndex]);
		nTem = pReadBox->m_pnListTable[pReadBox->m_nIndex + i + 1] - pReadBox->m_pnListTable[pReadBox->m_nIndex + i];
		//三星手机专用
		//switch(*pAEDaw) 
		//{
		//case 0xfeff:
		//	pAEDaw++;
		//	nTem--;
		//	break;
		//}
//samla:
//		switch(*(pAEDaw + nTem - 1))
//		{//去掉000d,000a这两个长度再三星手机上是乱码
//		case 0x000d:
//		case 0x000a:
//			if(0 < nTem)
//			{
//				nTem--;
//				goto samla;
//			}
//			break;
//		}
		//三星手机专用
		DrawLine(pReadBox , i , pAEDaw , nTem);
	}
	//回调绘制
	FUN_COMMANDRUN(READRC_STATE_STOK , pReadBox->m_nLtTa - 1 , pReadBox->m_nIndex);
	IDISPLAY_Update(pReadBox->m_pThis->m_pIDisplay);
	if(pReadBox->m_bStopRead)//如果没有暂停自动播放就继续刷新
		ISHELL_SetTimer(pReadBox->m_pThis->m_pIShell , pReadBox->m_nTime[pReadBox->m_nLooktype-1] , (PFNNOTIFY )DrawReadT , (void*)pReadBox);
}
void CReadBox_Draw(CReadBox* pReadBox)
{
	if(pReadBox->m_bIsActive)
		CReadBox_ReDraw(pReadBox);
}
//////////////////////////////////////////////////////////////////////////
//回调
void MapNotify(CNotifyPar* pNotify)
{
	CReadBox*	pReadBox = (CReadBox*)pNotify->m_pvUser;
	switch(pNotify->m_code)
	{
	case FILEMAP_NONE:						//预留
		return;
	case FILEMAP_REDA:					//建立索引表
		{
			switch(pReadBox->m_eState) 
			{
			case READBOX_STATE_NONE:		//无状态
				return;
			case READBOX_STATE_CRIN:		//正在建立索引
				switch(pReadBox->bFileEnd)	//是否为文件的结束
				{
				case TRUE:					//如果是文件的结束
					pReadBox->m_eState = READBOX_STATE_STOK;
					pReadBox->m_pnListTable[pReadBox->m_nLtTa] = (uint16)(pReadBox->m_pFileMap->m_nTotalSize >> 1);//添加最后一行索引
					if(FALSE == CReadBox_GoToLabel(pReadBox , pReadBox->nNowLabel))
					{
						CReadBox_ClsReadFile(pReadBox);
						FUN_COMMANDRUN(READRC_ERRAL_AERR , READRC_PAGEG_IERR , 0);
					}
					return;
				default:
					{
						if(FALSE == CreateTable(pReadBox , pNotify))
						{
							CReadBox_ClsReadFile(pReadBox);
							FUN_COMMANDRUN(READRC_ERRAL_AERR, READRC_CREAT_IDER  , 0);
						}
					}
				}
				return;
			case READBOX_STATE_STOK:
				{
					pReadBox->m_pAENowTmp = (AECHAR*)pNotify->m_pDataBeg;
					CReadBox_Draw(pReadBox);
				}
				return;
			}
		}
		return;
	case FILEMAP_IERR:
		CReadBox_ClsReadFile(pReadBox);
		FUN_COMMANDRUN(READRC_ERRAL_AERR , READRC_FIMAP_IERR , 0);
		return;
	}
}
//////////////////////////////////////////////////////////////////////////
//	CReadBox 内部使用的函数,											//
//																		//
//																		//
//////////////////////////////////////////////////////////////////////////
//二分查找算计算法
uint32 BinSearch(uint16 nList[] , uint16 nIndex ,  uint32 nSize)
{//REABBOX_BINSEARCH_ERR ERRCode 
	int32 nMax;
	int32 nlow , nhigh , nmid;
	nMax = nSize - 1;
	nlow = 0;
	nhigh = nMax;
	if(nhigh <= nlow)
		return REABBOX_BINSEARCH_ERR;
	while(nlow <= nhigh)
	{
		nmid=(nlow + nhigh) / 2;
		if(nList[nmid] <= nIndex)
		{
			switch(nMax - nmid)
			{
			case 0:
				if(nList[nmid] == nIndex)
					return nmid;
				else
					return REABBOX_BINSEARCH_ERR;
			default:
				if(nList[nmid + 1] > nIndex)
					return nmid;
			}
		}
		if(nList[nmid] > nIndex)
			nhigh = nmid - 1;
		else
            nlow = nmid + 1; 
    }
	return REABBOX_BINSEARCH_ERR;
}
boolean CreateTable(CReadBox* pReadBox , CNotifyPar* pNotify)
{
	boolean bRet = FALSE;
	AECHAR*	pBeg = NULL;
	AECHAR*	pEnd = NULL;
	//AECHAR*	pTemp = NULL;
	uint32	nLenPi = 0;//移动的最大偏移
	uint32	nReadSize = 0;
	//////////////////////////////////////////////////////////////////////////
	//参数检查,可能检查的过分了 
	if(NULL == pNotify)
		return FALSE;
	if(NULL == pNotify->m_pDataBeg || NULL == pNotify->m_pDataEnd)
		return FALSE;
	//////////////////////////////////////////////////////////////////////////
	//pNotify->m_nMaxDataSize 如果等于0说明已经是文件的结束
	pBeg = (AECHAR*)pNotify->m_pDataEnd;
	nLenPi = MIN(READBOX_INDEX_SETP , (pNotify->m_nMaxDataSize / 2));
    pEnd = pBeg + nLenPi; 
	//计算安全测量范围
	//////////////////////////////////////////////////////////////////////////
	//到此得到了可以计算AECHAR的开始和结素指针 (pEnd - pBeg)为本次处理最多字符数
	nReadSize = MesureText(pReadBox , pBeg , pEnd);
	if(NULL != pReadBox->m_pFileMap && 0 != pReadBox->m_pFileMap->m_nTotalSize)
		FUN_COMMANDRUN(READRC_CREAT_INDX , (uint32)((pReadBox->m_pFileMap->m_nIndex * 100) / pReadBox->m_pFileMap->m_nTotalSize) , 0);
	if(!pReadBox->bFileEnd)
	{
        bRet = CFileMap_GetData(pReadBox->m_pFileMap , NOW_READ , nReadSize , &pReadBox->bFileEnd);
	}
	return bRet;
}
uint32 MesureText(CReadBox* pReadBox , AECHAR* pBeg , AECHAR* pEnd)
{
	int16		nMaxLeng = 0;			//最大长度
	int			nChar = 0;				//临时空间变量
	AECHAR*		pTem = NULL;			//
	AECHAR*		pForTem;				//
	int			i;						//临时变量

	nMaxLeng = pEnd - pBeg;
	if(nMaxLeng > READBOX_INDEX_BACK)	//说明已经到文件结尾的最后READBOX_INDEX_BACK大小
		pEnd -= READBOX_INDEX_BACK;
	pTem = pBeg;
	while(pTem < pEnd)
	{
		if(NULL == pReadBox->m_pFileMap)
			return 0;
		if(nMaxLeng <= READBOX_INDEX_BACK)
			IDISPLAY_MeasureTextEx(pReadBox->m_pThis->m_pIDisplay , AEE_FONT_NORMAL, pTem , pEnd - pTem , pReadBox->m_ncxScreen , &nChar);
		else
			IDISPLAY_MeasureTextEx(pReadBox->m_pThis->m_pIDisplay , AEE_FONT_NORMAL, pTem , READBOX_INDEX_BACK , pReadBox->m_ncxScreen , &nChar);
		pForTem = pTem;
		for(i = 0 ; i < nChar ; i++)
		{
			switch(*pForTem) 
			{
			case 0x000d:
				break;
            case 0x000a: 
				goto outme;
			}
			pForTem++;
		}
outme:
		i = (i == nChar) ? nChar : i + 1;
		pTem += i;
		//////////////////////////////////////////////////////////////////////////
		//将本行插近索引表
		if(pReadBox->m_nLtTa < pReadBox->m_nLtMx)
		{
			pReadBox->m_pnListTable[pReadBox->m_nLtTa] = pReadBox->nTotalChar;
		}
		else
		{
			CReadBox_ClsReadFile(pReadBox);
			FUN_COMMANDRUN(READRC_ERRAL_AERR , READRC_CREAT_IDER , 0);
		}
        pReadBox->m_nLtTa++;
		pReadBox->nTotalChar += i;
	}
	return (uint32)pTem - (uint32)pBeg;
}
//////////////////////////////////////////////////////////////////////////
//绘制文字行,主要为了兼容小字体
void DrawLine(CReadBox* pReadBox , uint16 nLine , AECHAR* pDraw , int nLen)
{
	IDISPLAY_DrawText(pReadBox->m_pThis->m_pIDisplay , AEE_FONT_NORMAL , pDraw , nLen , pReadBox->m_pAPPRect->x , (int)(pReadBox->m_pAPPRect->y + (nLine * (pReadBox->m_nBeLine + pReadBox->nFontH))) - pReadBox->m_nPicY , pReadBox->m_pAPPRect , 0);
}

//////////////////////////////////////////////////////////////////////////
//自动阅读效果 回调函数
void DrawReadT(CReadBox* pReadBox)
{
	if(FALSE == pReadBox->m_bIsActive || FALSE == pReadBox->m_bStopRead)
		return;
	switch(pReadBox->m_nLooktype) 
	{
	case 1:
		pReadBox->m_nPicY += 2;
		if(pReadBox->m_nPicY >= (pReadBox->m_nBeLine + pReadBox->nFontH))
			ISHELL_PostEvent(pReadBox->m_pThis->m_pIShell , ISHELL_ActiveApplet(pReadBox->m_pThis->m_pIShell) , EVT_MY , AVK_DOWN , 0);
		else
		{
			CReadBox_ReDraw(pReadBox);
			ISHELL_SetTimer(pReadBox->m_pThis->m_pIShell , pReadBox->m_nTime[0] , (PFNNOTIFY )DrawReadT , (void*)pReadBox);
		}
		return;
	case 2:
		ISHELL_PostEvent(pReadBox->m_pThis->m_pIShell , ISHELL_ActiveApplet(pReadBox->m_pThis->m_pIShell) , EVT_MY , AVK_DOWN , 0);
		ISHELL_SetTimer(pReadBox->m_pThis->m_pIShell , pReadBox->m_nTime[1] , (PFNNOTIFY )DrawReadT , (void*)pReadBox);
		return;
	case 3:
		ISHELL_PostEvent(pReadBox->m_pThis->m_pIShell , ISHELL_ActiveApplet(pReadBox->m_pThis->m_pIShell) , EVT_MY , AVK_RIGHT , 0);
		ISHELL_SetTimer(pReadBox->m_pThis->m_pIShell , 100*pReadBox->m_nTime[2] , (PFNNOTIFY )DrawReadT , (void*)pReadBox);
		return;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -