天天看點

電子書功能設計

電子圖書在現在的多媒體終端上越來越受歡迎,已經成為一種很重要的基本功能之一,也非常受消費者的青睐。而目前限于多媒體終端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等采用檔案格式的閱讀器顯得有非常強烈的市場需求,同時能夠開發出發聲電子書也是很有特色的。

繼續閱讀