基於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 網路下載網路下載主要是網路檔案傳輸,然後覆蓋掉原先的檔案,再開啟新的檔案。