电子书功能设计

                电子书功能设计

电子图书在现在的多媒体终端上越来越受欢迎,已经成为一种很重要的基本功能之一,也非常受消费者的青睐。而目前限于多媒体终端CPU主频、内存的限制,目前应用最广泛的txt格式的电子书,txt格式的电子书已经几乎成了电子书的标准。Txt格式的电子书之所以这么受青睐,这在于它的一些优于其他格式电子书的特点:

    是最基本的最简单的格式,编辑、阅读方便,可用用于自己的记事本、电话录等

    解码耗费的资源比其他格式要少很多,对硬件要求要低一些

    这种格式的电子书来源广泛,Internet上有大量的涉及各个领域、各种学科的电子书下载,当然自己也可以编译自己需要的电子书

    本身这种格式耗费的空间少,一部相同内容的书在txt格式下只有几十k,而在其他格式下可能上几百k

5.4.1 Ebook设计

因为开发平台的用户界面是以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()处理系统消息(主要是按键事 ),控制电子图书界面的刷新,向上向下翻页。

5.4.2电子书程序功能分析

在进入电子书功能,首先看到的应该是所有TXT文档的列表,再选择需要阅读的具体文本。文件选择就是要实现文件选择功能,必须先识别文件,可以通过database文件管理系统查找出PMP上面的所有文件,再通过比较文件名后缀. txt)的方式识别出文本文件,得到本PMP里面所有文本文件的文件名。文本文件名保存在文件选择列表EbookList[],当用户切换文件时,程序也就是EbookList中切换、选择,这样也可以得到文件的句柄,调用电子书的文件处理函数就可以打开和读取被选择文件的内容。

TXT电子书可能采用的是不同的编码方式,比如DBCSUNICODE小端、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

对象消息处理

5.4.3电子书程序说明

在主菜单选择进入电子图书界面之后,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()禁止TIMERtx_timer_activate()使能TIMER,通过定时器来周期性调用电子书下移函数。

5.4.4电子书开发体会

电子书已经越来越受欢迎,也已经逐渐成为PMP产品一种基本功能,非常受消费者的青睐,显示出了它的价值。但是目前应用最广泛的还是txt格式的电子书,txt格式的电子书已经几乎成了电子书的标准,这种格式太单一。本课题开发的电子书阅读软件也只支持TXT格式的文件,开发的电子书的软件也有各种不同的功能,引入书签操作有一定意义。

对于电子书的发展,最大的方向是开发出支持多格式阅读的格式,特别是PDFWORD等采用文件格式的阅读器显得有非常强烈的市场需求,同时能够开发出发声电子书也是很有特色的。
上一篇:移动硬盘挂载方式解析


下一篇:入驻“云栖社区”