電子圖書在現在的多媒體終端上越來越受歡迎,已經成為一種很重要的基本功能之一,也非常受消費者的青睐。而目前限于多媒體終端CPU主頻、記憶體的限制,目前應用最廣泛的txt格式的電子書,txt格式的電子書已經幾乎成了電子書的标準。Txt格式的電子書之是以這麼受青睐,這在于它的一些優于其他格式電子書的特點:
◆
是最基本的最簡單的格式,編輯、閱讀友善,可用用于自己的記事本、電話錄等
解碼耗費的資源比其他格式要少很多,對硬體要求要低一些
這種格式的電子書來源廣泛,Internet上有大量的涉及各個領域、各種學科的電子書下載下傳,當然自己也可以編譯自己需要的電子書
本身這種格式耗費的空間少,一部相同内容的書在txt格式下隻有幾十k,而在其他格式下可能上幾百k
因為開發平台的使用者界面是以Widget(視窗控件)為基礎建立的,而開發平台又沒有提供電子書的widget的顯示功能,是以電子圖書功能設計實際上就是需要自行設計一個電子書的Widget,然後在這個Widget裡面顯示文本内容,再通過PMP的按鍵對其進行播放,向上向下翻頁,自動滾屏,更換、删除檔案等操作。
Ebook Widget的建立按照開發平台提供的方法進行的,需要調用開發平台的一些關鍵API函數。因為Ebook
Widget與其他的功能視窗一樣需要挂在RootWidget上,是以Ebook
Widget建立過程如下:
自定義的TxtBrowse_Widget_t類結構體資料結構:
typedef struct _TxtBrowse_Widget {
WIDGET_BASIC_PROPERTIES;
//基本屬性定義
WIDGET_END_OF_BITFIELD_PROPERTIES;
gfx_Color_t m_DrawColor;
//顔色
gfx_Color_t m_BackgroundColor;
//背景顔色
gfx_Font_t * m_pFont;
//字型
gfx_Rect_t m_rect[2];
// 0:第一行位置,1:末行
char m_nFontHeight;
// 目前所用字型高度(象素)
cmi_MediaHandle_t * m_pMediaHandle;
wchar_t * m_pwcsFileName;
// 檔案名
int32_t
m_fd; // 已打開檔案句柄
TxtFileCodeEnum_t m_FileCode;
// 檔案編碼
int8_t m_nStep;
// 查找時使用的步距
int16_t m_nEnter; //
回車符号編碼(unicode編碼)
…………………………………….. //其他重要定義
TX_TIMER m_AutoScrollPageTimer;
// 自動翻頁定時器
LineBuf_t m_LineBuf;
// 行緩沖
TxtCache_t m_Cache[TXT_CACHE_MAX_BLK];
// file cache
} TxtBrowse_Widget_t;
1、調用uim_class_Subclass()函數,注冊一個新的視窗類型,以BaseWidget的類結構體Widget_
t為父本派生出一個新的TxtBrowse_Widget_t類結構體;
2、調
用uim_widget_create()函數建立Ebook
Widget;
3、調用uim_widget_Attach()函數将Ebook
Widget挂載到Widget樹;
4、調用uim_widget_RegisterWidget()函數注冊EbookW
idget,這樣系統
消
息
就
可以
傳
送到 Ebook Widget;
5、讀取文本檔案資訊,調用mst_txt_browse_widget_Draw
()繪制電子圖書的顯
示
界面;
6、啟動mst_txt_browse_widget_ProcessMessage()處理系統消息(主要是按鍵事
件),控制電子圖書界面的重新整理,向上向下翻頁。
在進入電子書功能,首先看到的應該是所有TXT文檔的清單,再選擇需要閱讀的具體文本。檔案選擇就是要實作檔案選擇功能,必須先識别檔案,可以通過database檔案管理系統查找出PMP上面的所有檔案,再通過比較檔案名字尾.
txt)的方式識别出文本檔案,得到本PMP裡面所有文本檔案的檔案名。文本檔案名儲存在檔案選擇清單EbookList[],當使用者切換檔案時,程式也就是EbookList中切換、選擇,這樣也可以得到檔案的句柄,調用電子書的檔案處理函數就可以打開和讀取被選擇檔案的内容。
TXT電子書可能采用的是不同的編碼方式,比如DBCS、UNICODE小端、UNICODE大端、UTF-8,各種編碼的特點在本章第二節已做詳細分析,UNICODE小端和UNICODE大端在于位元組存儲順序不一樣,跟CPU的大小端模式是一樣的。在确定了電子書的編碼方式後,方可設定查找時使用的步距,這樣才能得到正确的字元編碼值,在字元最後顯示時,文本檔案的内容(包括字母,漢字,符号讀入記憶體後,需要調用字元串繪制函數gfx_text_DrawString(),但是gfx_text_DrawString()需要UTF-16編碼格式的,是以在調用該函數前需要将DBCS編碼字元串通過函數txt_ConvertDbcsToUtf16c(
)轉化成UNICODE的碼。
電子書可以按頁處理(PMP顯示一屏即是一頁),頁面之間可以通過按鍵進行切換,這就需要建立一個索引,記錄下每一頁内容的偏移量,進而實作頁面的上翻和下翻操作。也可以通過向左向右按鍵實作電子書向下或者向上翻一行,
關鍵是計算好每一行所占字元的數量,這樣一行所占的偏移量的大小。由于PMP系統字庫的每個字元寬度并不相同,沒有辦法通過字數統計來計算總的字元顯示寬度,是以在一頁内容繪制完成之前,不能得到下一頁的偏移量。為此,要完成全部索引,需要将文本檔案的内容全部顯示一次,每繪制一頁就記錄一次偏移量。是以在頁面重新整理的同時,也要記錄偏移量,進行索引建立工作。PMP
記憶體容量有限,為了節省資源,我們隻對正在顯示的文本檔案建立索引,當打開另一個檔案時,原有索引被破壞,新的索引将在同一個記憶體空間建立。
電子書重要接口函數介紹如表5-4:
表5-4
電子書重要接口函數
函數接口名
功能簡介
GetTxtFileCoding
解析txt檔案的編碼方式
ScrBufDownOneLine
下翻一行(螢幕上滾)螢幕緩沖
ScrBufUpOneLine
上翻一行(螢幕下滾)螢幕緩沖
ScrUpOneFrame
上翻一頁
ScrDownOneFrame
下翻一頁
AutoScrollPageFun
自動滾屏
SetBookmark
設定或取消目前打開檔案的書簽
GetBookmark
讀取書簽
TxtBrowse_class_Initialize
Ebook widget類注冊、初始化
mst_ebook_exit_popup
退出時彈出是否需要設定書簽菜單
mst_txt_browse_widget_ProcessMessage
對象消息處理
在主菜單選擇進入電子圖書界面之後,PMP系統将進行圖5-8給出的電子圖書(Ebook
Widget)建立和顯示的初始化工作。此後,Ebook Widget進入等待進一步操作狀态,由按鍵發送系統消息進行下一步控制。
圖5-8
電子書閱讀流程圖
電子圖書視窗消息處理函數mst_txt_browse_widget_ProcessMessage()負責處理一些系統資訊,按鍵消息處理是其中的一部分。下面簡要分析一下幾種系統消息:
◆UIM_MSG_CREATE:對象建立,主要調用函數mst_txt_browse_widget_Create
( )。
◆UIM_MSG_DESTROY:消息在電子圖書視窗切換到其他視窗時産生,目的是删除Ebook
Widget視窗,轉換到使用者所選的其他視窗,轉換視窗的工作由Root Widget負責完成。主要調用函數mst_txt_browse_widget_Destroy
(pTBWidget) 銷毀對象,釋放記憶體;
◆MSG_UI_BTN_EVENT:按鍵消息處理。按鍵事件是PMP系統中最常見的消息來源,使用者通過按鍵向Ebook
Widget發送消息,即使用者通過按鍵發出控制指令。按鍵消息有如下幾種:
BTN_EVENT_IS(BTN_MENU, EVENT_DOWN):退到主界面,調用的函數是mst_ebook_exit_popup(),詢問是否需要設定書簽的菜單;
BTN_EVENT_IS(BTN_FF, EVENT_HOLD):下翻一頁,調用函數
ScrDownOneFrame (pWidget)來實作功能;
BTN_EVENT_IS(BTN_RW, EVENT_HOLD):上翻一頁,調用函數
ScrUpOneFrame ((TxtBrowse_Widget_t *)pWidget) 來實作功能;
BTN_EVENT_IS(BTN_FF, EVENT_CLICK):向下滾動一行,調用函數ScrBufDownOneLine()來實作功能;
BTN_EVENT_IS(BTN_RW, EVENT_CLICK):上翻一行(螢幕下滾)螢幕緩沖,調用函數ScrBufUpOneLine()來實作功能;
BTN_EVENT_IS(BTN_PLAY, EVENT_CLICK):啟動或暫停自動滾屏,這個功能主要是通過操作定時器來實作的,tx_timer_deactivate()禁止TIMER,tx_timer_activate()使能TIMER,通過定時器來周期性調用電子書下移函數。
電子書已經越來越受歡迎,也已經逐漸成為PMP産品一種基本功能,非常受消費者的青睐,顯示出了它的價值。但是目前應用最廣泛的還是txt格式的電子書,txt格式的電子書已經幾乎成了電子書的标準,這種格式太單一。本課題開發的電子書閱讀軟體也隻支援TXT格式的檔案,開發的電子書的軟體也有各種不同的功能,引入書簽操作有一定意義。
對于電子書的發展,最大的方向是開發出支援多格式閱讀的格式,特别是PDF、WORD等采用檔案格式的閱讀器顯得有非常強烈的市場需求,同時能夠開發出發聲電子書也是很有特色的。