电子书功能设计
电子图书在现在的多媒体终端上越来越受欢迎,已经成为一种很重要的基本功能之一,也非常受消费者的青睐。而目前限于多媒体终端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电子书可能采用的是不同的编码方式,比如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 |
对象消息处理 |
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()禁止TIMER,tx_timer_activate()使能TIMER,通过定时器来周期性调用电子书下移函数。
5.4.4电子书开发体会
电子书已经越来越受欢迎,也已经逐渐成为PMP产品一种基本功能,非常受消费者的青睐,显示出了它的价值。但是目前应用最广泛的还是txt格式的电子书,txt格式的电子书已经几乎成了电子书的标准,这种格式太单一。本课题开发的电子书阅读软件也只支持TXT格式的文件,开发的电子书的软件也有各种不同的功能,引入书签操作有一定意义。
对于电子书的发展,最大的方向是开发出支持多格式阅读的格式,特别是PDF、WORD等采用文件格式的阅读器显得有非常强烈的市场需求,同时能够开发出发声电子书也是很有特色的。