基于MiniGUI的电子书阅读器

本文介绍了一款基于MiniGUI的电子书阅读器的设计与实现。该阅读器支持txt文本阅读,具备翻页功能及网络下载更新能力。文章详细阐述了如何进行页面读取、翻页逻辑以及网络下载等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于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 网络下载
网络下载主要是网络文件传输,然后覆盖掉原先的文件,再打开新的文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值