电子图书在现在的多媒体终端上越来越受欢迎,已经成为一种很重要的基本功能之一,也非常受消费者的青睐。而目前限于多媒体终端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等采用文件格式的阅读器显得有非常强烈的市场需求,同时能够开发出发声电子书也是很有特色的。