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

📄 readbox.c

📁 这一款新闻类业务的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*===========================================================================
阅读超长文本代码
包明辉 ReadBox
FILE: ReadBox.c
===========================================================================*/
#include "ReadBox.h"
//#pragma comment (lib, "jtfont.lib")

//////////////////////////////////////////////////////////////////////////
//构造
CReadBox* CReadBox_New(IFileMgr* pFileMgr , AEEApplet* pThis , AEERect* pRect , void* pvUser , uint16 ncxScreen , uint16 ncyScreen , uint16 ncyPageLn)
{
	CReadBox*	pRet = NULL;
	if(NULL == pFileMgr || NULL == pThis || NULL == pRect || NULL == pvUser)
		return NULL;

	pRet = MALLOC(sizeof(CReadBox));
	if(NULL == pRet)
		return pRet;

	MEMSET(pRet , 0 , sizeof(CReadBox));
	pRet->m_eState = READBOX_STATE_NONE;

	pRet->m_pThis = pThis;
	pRet->m_pAPPRect = pRect;
	pRet->m_ncxScreen = ncxScreen;
	pRet->m_ncyScreen = ncyScreen;
	pRet->m_ncyPageLn = ncyPageLn;
	pRet->m_pvUser = pvUser;
	pRet->m_pFileMgr = pFileMgr;
	//调色表初始化
	//pRet->m_colorList[0] = MAKE_RGB(0 , 0 , 255);
	//pRet->m_colorList[1] = MAKE_RGB(0 , 255 , 255);
	//pRet->m_colorList[2] = MAKE_RGB(51 , 255 , 0);
	//pRet->m_colorList[3] = MAKE_RGB(150 , 0 , 0);
	//pRet->m_colorList[4] = MAKE_RGB(255 , 255 , 0);
	//pRet->m_colorList[5] = MAKE_RGB(255 , 0 , 0);
	pRet->m_colorList[6] = MAKE_RGB(0 , 0 , 0);
	pRet->m_colorList[7] = MAKE_RGB(255 , 255 , 255);
	//pRet->m_colorList[8] = MAKE_RGB(128 , 128 , 128);
	//pRet->m_colorList[9] = MAKE_RGB(204 , 0 , 255);
	CReadBox_ClsReadFile(pRet);
	return pRet;
}
//////////////////////////////////////////////////////////////////////////
//释放
void CReadBox_Release(CReadBox** ppReadBox)
{
	if(ppReadBox && *ppReadBox)
	{
		FILEMAP_FREE((*ppReadBox)->m_pFileMap);
		FREEIF((*ppReadBox)->m_pnListTable);
		FREEIF(*ppReadBox);
		*ppReadBox = NULL;
	}
}
//////////////////////////////////////////////////////////////////////////
//属性及重要信息设置
//设置回调
void CReadBox_SetNotify(CReadBox* pReadBox , PFNNOTYRead pRecall)
{
	if(NULL != pReadBox)
		pReadBox->m_pRecall = pRecall;
}
//判断是否被激活
boolean CReadBox_IsActive(CReadBox* pReadBox)
{
	if(NULL == pReadBox)
		return FALSE;
	return pReadBox->m_bIsActive; 
}
void CReadBox_SetActive(CReadBox* pReadBox , boolean nActive)
{
	if(NULL == pReadBox)
		return;
	pReadBox->m_bIsActive = nActive;
}
void CReadBox_SetAutoRead(CReadBox* pReadBox , boolean bIsStop)
{
	if(NULL == pReadBox)
		return;
	pReadBox->m_bStopRead = bIsStop;
}
AECHAR* CReadBox_GetNowPtr(CReadBox* pReadBox , uint16* nCount)
{
	uint16 nLenRd = 0;
	if(NULL == pReadBox)
		return NULL;
    if((pReadBox->m_nIndex + 1) < pReadBox->m_nLtMx)
		nLenRd = pReadBox->m_pnListTable[pReadBox->m_nIndex + 1] - pReadBox->m_pnListTable[pReadBox->m_nIndex]; 
	else
		nLenRd = 10;//
	*(nCount) = (uint16)nLenRd - 2;
	return (AECHAR*)pReadBox->m_pAENowTmp;
}
uint16 CReadBox_GetNowLab(CReadBox* pReadBox)
{
	if(NULL == pReadBox)
		return 0;
	if(NULL == pReadBox->m_pnListTable)
		return 0;
	return pReadBox->m_pnListTable[pReadBox->m_nIndex];
}
//////////////////////////////////////////////////////////////////////////
//消息句柄
boolean	CReadBox_HandleEvent(CReadBox* pReadBox , AEEEvent eCode , uint16 wParam , uint32 dwParam)
{
	if(FALSE == pReadBox->m_bIsActive)
		return FALSE;
	switch(pReadBox->m_eState) 
	{
	case READBOX_STATE_NONE:
		return FALSE;
	case READBOX_STATE_CRIN://建立索引。CLR停止建立索引
		{
			if(EVT_KEY == eCode && AVK_CLR == wParam)
			{
				CReadBox_ClsReadFile(pReadBox);
                CReadBox_SetActive(pReadBox,FALSE);
				FUN_COMMANDRUN(READRC_CREAT_IDXB , 0 , 0);
			}
		}
		return TRUE;
	case READBOX_STATE_STOK:
		{
			switch(eCode) 
			{
			case EVT_MY:  //这个事件是为了满足接收EVT_KEY消息,因为此类消息不能post
			case EVT_KEY: //
				switch(wParam) 
				{
				case AVK_UP:
					{
						uint32 nGoTo = (pReadBox->m_nIndex > 1) ? (pReadBox->m_nIndex - 1) : 0;
						CReadBox_GoToLine(pReadBox , nGoTo);
					}
					return TRUE;
				case AVK_DOWN:
					CReadBox_GoToLine(pReadBox , pReadBox->m_nIndex + 1);
					return TRUE;
				case AVK_LEFT:
					{
						uint32	nGoTo = (pReadBox->m_nIndex > pReadBox->m_nMaxPagLine) ? (pReadBox->m_nIndex - pReadBox->m_nMaxPagLine) : 0;
						CReadBox_GoToLine(pReadBox , nGoTo);
					}
					return TRUE;
				case AVK_RIGHT:
					CReadBox_GoToLine(pReadBox , pReadBox->m_nIndex + pReadBox->m_nMaxPagLine);
					return TRUE;
				}
				break;
			}
			break;
		}
	}
	return FALSE;	
}
//////////////////////////////////////////////////////////////////////////
//清楚阅读文件
void CReadBox_ClsReadFile(CReadBox* pReadBox)
{
	MEMSET(pReadBox->m_szFineName , 0 , AEE_MAX_FILE_NAME);
	FILEMAP_FREE(pReadBox->m_pFileMap);				//关闭了文件
	FREEIF(pReadBox->m_pnListTable);				//释放索引表
	pReadBox->m_nLtMx = 0;	
	pReadBox->m_nLtTa = 0;
	pReadBox->m_nIndex = 0;							//当前行数									//不需要分块索引
	pReadBox->m_nLtTa = 0;							//一共的行数
	pReadBox->m_bStopRead = FALSE;					//暂停自动阅读状态
	//全局变量初始化
	pReadBox->bFileEnd = FALSE;						//当前是否为文件的结束
	pReadBox->nTotalChar = 0;						//初始化临时全局变量
	pReadBox->m_eState = READBOX_STATE_NONE;
}
//////////////////////////////////////////////////////////////////////////
//设置阅读文件
boolean CReadBox_SetReadFile(CReadBox* pReadBox , const char* pFileName , uint16 nLabel , boolean* pBsame)//此函数如果返回TRUE会产生一个回调
{
	uint32	nFilesize = 0;
	uint32	nLinIxBuf = 0;
	//参数检测
	if(NULL == pFileName)
		return FALSE;
	if(NULL == pReadBox->m_pRecall)
		return FALSE;
	if(NULL != pBsame)
		*pBsame = FALSE;
	//参数检测
	//判断是否为当前打开过文件
	if(0 == STRCMP(pReadBox->m_szFineName , pFileName))
	{
		if(NULL != pBsame)
			*pBsame = TRUE;
		return CReadBox_GoToLabel(pReadBox , nLabel);
	}
	//判断是否为当前打开过文件
	CReadBox_ClsReadFile(pReadBox);
	STRCAT(pReadBox->m_szFineName , pFileName);
	pReadBox->m_pFileMap = CFileMap_New(pReadBox->m_pFileMgr , pFileName , MapNotify , pReadBox , pReadBox->m_pThis);
	if(NULL == pReadBox->m_pFileMap)
	{
		CReadBox_ClsReadFile(pReadBox);
		return FALSE;
	}
	//////////////////////////////////////////////////////////////////////////
	//计算索引表最大空间并分配空间
	nFilesize = CFileMap_GetFileSize(pReadBox->m_pFileMap);
	nLinIxBuf = (uint32)((nFilesize * READBOX_INDEXTABLE) / 100);
	pReadBox->m_pnListTable = MALLOC(nLinIxBuf);
	pReadBox->m_nLtMx = nLinIxBuf / sizeof(uint16);
	if(pReadBox->m_nLtMx) pReadBox->m_nLtMx--; 
	if(NULL == pReadBox->m_pnListTable/* || pReadBox->m_nLtMx == 0*/)
	{
		CReadBox_ClsReadFile(pReadBox);
		return FALSE;
	}
	MEMSET(pReadBox->m_pnListTable , 0 , nLinIxBuf);
	pReadBox->nNowLabel = nLabel;
	FUN_COMMANDRUN(READRC_STATE_OPEN , 0 , 0);
	pReadBox->m_eState = READBOX_STATE_CRIN;
	return TRUE;
}
//////////////////////////////////////////////////////////////////////////
//属性设置
boolean	CReadBox_SetTextFB(CReadBox* pReadBox , uint16 nBe)
{
	pReadBox->nFontH = 12;//保证不除0
	pReadBox->m_nMaxScrLine = (pReadBox->m_ncyScreen / (pReadBox->nFontH + nBe)) + 1;
	pReadBox->m_nMaxPagLine = (pReadBox->m_ncyPageLn / (pReadBox->nFontH + nBe)) + 1;
	pReadBox->m_nBeLine = nBe;
	return TRUE;
}
//////////////////////////////////////////////////////////////////////////
//根据标签获得行索引
boolean	CReadBox_GoToLine(CReadBox* pReadBox , uint32 nLine)
{
	uint32	nAECharIndex;
	if(READBOX_STATE_STOK != pReadBox->m_eState)
		return FALSE;
	if(NULL == pReadBox->m_pnListTable || NULL == pReadBox->m_pFileMap)
		return FALSE;
	if(nLine >= pReadBox->m_nLtTa)
		nLine = pReadBox->m_nLtTa - 1;
	pReadBox->m_nPicY = 0;			//初始化滚动屏幕
	pReadBox->m_nIndex = nLine;	
	nAECharIndex = (uint32)pReadBox->m_pnListTable[pReadBox->m_nIndex];
	return CFileMap_GetData(pReadBox->m_pFileMap , nAECharIndex * sizeof(AECHAR) , 0 , &pReadBox->bFileEnd);
}
uint16 CReadBox_GetLabel(CReadBox* pReadBox)
{
	if(NULL == pReadBox->m_pnListTable)
		return 0;
	return pReadBox->m_pnListTable[pReadBox->m_nIndex];
}
boolean CReadBox_GoToLabel(CReadBox* pReadBox , uint16 nLabel)
{
	uint32 nRet;
	nRet = BinSearch(pReadBox->m_pnListTable , nLabel , pReadBox->m_nLtTa);
	if(REABBOX_BINSEARCH_ERR == nRet)
		return FALSE;
	return CReadBox_GoToLine(pReadBox , nRet);
}
//////////////////////////////////////////////////////////////////////////
//刷新函数
void CReadBox_ReDraw(CReadBox* pReadBox)
{

⌨️ 快捷键说明

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