基于MiniGUI的电子书阅读器
Posted skdev
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于MiniGUI的电子书阅读器相关的知识,希望对你有一定的参考价值。
基于MiniGUI的电子书阅读器
本电子阅读器可以阅读txt文本。具有网络下载更新txt功能。
主要的功能是:
1) 左右翻页
2) 翻到指定页
3) 网络下载新的txt文本
主界面如下
下面是下载界面
设计思路
普通的文件读操作,要点主要是翻页,没有设滚动条,所以是按页翻的,这样的好处是省用点内存。
1 读页面
一个页面最多有11行x50个字符,所以我一行一行的读,如果某行遇到’/n’(即换行),则表示该行满,不然则按50个字符读足。
/*名称:ReadLineTxt
功能:读一行数据
参数: linebuff 读出来的数据,linelength 一行的最大字符数
*/
int ReadLineTxt(char *linebuff,int linelength)
{
int i,j;
char ch;
strcpy(linebuff,"");
for(i=0;i<linelength;i++)
{
ch=fgetc(stream); //读取字符
linebuff[i]=ch;
gCurpos++; //gCurpos 用于表示文件读到的位置
if(ch=='/n'||gCurpos>=gFileLen) //gFileLen是文件的总长度,本来用ch==EOF来判断的,不知为什么在uClinux下没效果。
{
gCurpos++;
linebuff[i+1]='/0';
return i+2;
}
}
linebuff[i]='/0';
return i;
}
2 读一页
一页有11行,将11行读满后就可以将读得的数据打在EDIT控件上了。
/*名称:ReadPageTxt
功能:读一页的数据
参数:pagebuff 一页读出来的数据,rowcount 一页最大的行数,colcount 一行最大的字符数
*/
int ReadPageTxt(char *pagebuff,int rowcount,int colcount)
{
char linebuff[256];
int i,ret,len;
strcpy(pagebuff,"");
if(gCurpos>gFileLen)
return 0;
len=0;
for(i=0;i<rowcount;i++)
{
ret=ReadLineTxt(linebuff,colcount);
len+=ret;
sprintf(pagebuff,"%s%s",pagebuff,linebuff);
if(gCurpos>=gFileLen)
break;
}
pagebuff[len]='/0';
return len;
}
3 指定页
由于换行的原固,不能对明确每一页的字符的数量,所以我用一个整型数据来存储翻过的每一页的字符数量,在翻页时就通过当前文件位置和前页的字符数量的运算来确定该将文件的读取位置移到哪。也因这个原因,搜索页码每次都要从头开始,也就是说页码越长,则搜索得越慢,这是要改进的地方。
case ID_PREPAGE://上页
gPageIndex--; //gPageIndex 表示当前为第几页
if(gPageIndex<0)
gPageIndex=0;
gCurpos=gCurpos-gPageCount[gPageIndex];//gPageCount[]为该页字符数量
if(gPageIndex>0)
{
gPageIndex--;
gCurpos=gCurpos-gPageCount[gPageIndex];
}
if(gCurpos<0)
gCurpos=0;
SetFilePos(gCurpos);
case ID_NEXTPAGE://下页
if(gCurpos>gFileLen)
return 0;
gPageCount[gPageIndex]=ReadPageTxt(pagebuff,11,50);
gPageIndex++;
SetDlgItemText(hwndFrame,ID_EDIT,pagebuff);//显示数据
SetDlgItemInt(hWnd,ID_PAGENUM,gPageIndex,0);//显示页码
break;
case ID_FIND:
//搜索页码
iPage=GetDlgItemInt(hWnd,ID_PAGENUM,&bSigned,0);//获得指定页
if(iPage<1)
return 0;
SetFilePos(0);
gCurpos=0;
gPageIndex=0;
for(i=0;i<iPage;i++)//从第一页开始不断翻页,主要是为了记录翻过的每一页的字符数量
{
if(gCurpos>gFileLen)
break;
gPageCount[gPageIndex]=ReadPageTxt(pagebuff,11,50);
gPageIndex++;
}
SetDlgItemText(hwndFrame,ID_EDIT,pagebuff); //显示数据
SetDlgItemInt(hWnd,ID_PAGENUM,gPageIndex,0); //显示页码
break;
4 网络下载
网络下载主要是网络文件传输,然后覆盖掉原先的文件,再打开新的文件。
以上是关于基于MiniGUI的电子书阅读器的主要内容,如果未能解决你的问题,请参考以下文章
在线电子书阅读小程序,微信小程序电子书阅读,微信小程序小说阅读器毕业设计作品