信息科学与技术学院学士学位论文
4 系统设计
进入了系统设计阶段,要把软件“做什么”的问题变换成“怎么做”的问题。要将需求分析阶段生成后的文件做进一步的分析和精化。描述软件的总体体系结构,称为软件概要设计。然后对结构进一步细化,称为详细设计。本章主要介绍系统详细设计。
4.1 系统概要设计
软件总体结构的设计是概要设计关键的一步,直接影响到详细设计与编码的工作,所以要采用一定的设计方法,选取合理的设计方案。 4.1.1 系统功能说明
根据系统的需求分析,系统有不同的功能模块,主要包括的功能有:上下翻行显示、上下翻页显示、字体缩小以及放大显示和改变字体颜色。 4.1.2 系统总体功能结构
总体功能结构如图4-1所示。
电子书阅读器 上下翻行显示 上下翻页显示 放大字体 缩小字体 改变字体颜色
图4-1 系统功能模块图
16
信息科学与技术学院学士学位论文
4.2系统详细设计
根据系统的需求分析,系统被分为两个不同的模块,一为命令模块,二为数据
模块。在命令模块中主要利用SDL实现接收按键并将命令交给SDL后台。在数据模块包括:整个开发流程部分,创建窗口部分,编码解码部分,对接收的命令做出处理部分,命令处理部分包括上下行显示,上下页翻页显示,退出以及放大显示。
在数据模块中的整体开发流程如图4-2所示。
准备 解析文件编码 得到文件大小并申请空间 设置当前偏移 SDL初始化 创建主窗口 语言编码初始化 命令等待 编码判断
图 4-2 整体开发流程图
在主函数中的整体开发流程中的具体实现步骤和方法如下:
(1)读出文件的大小,利用全局的文件大小变量以及Unicode编码大小变量, 为变量申请相应的空间;
(2)因开发中要用到SDL库,在利用函数库之前要对其进行初始化操作; (3)初始化语言编码指针,为编码解析做好准备; (4)判断文件所采用的编码方式;
(5)根据文件的编码方式,若编码采用的非Unicode编码,则将字符编码转换为Unicode编码;若为Unicode编码,不进行转换;
17
信息科学与技术学院学士学位论文
(6)设置文件的当前偏移量; (7)创建主窗口;
(8)进入等待接受命令状态,进行相应的处理。 文件编码判断模块的功能如图4-3所示。
打开文件 读取文件的前3个字节到临时区域 判断该临时区域字符
读到长度小于1 读到长度只有一个 前2个字节FF FE 前2个字节FE FF 前3个字节FF BB BF 地方码的进一步检测 空文件 Gb18030编码 Unicode编码 判断结束 Unicode大端码 Utf-8编码 地方语言码 图4-3 编码检测流程图
检测编码类型主要是根据文件头部的前3个字节来判断,根据每种编码头的规定来得到文件的编码方式。
在窗口创建模块的具体实现步骤和方法如下: (1)创建窗口之前首先设置窗口的宽度以及高度;
(2)利用load_image()函数来装载背景,将背景存放在一个指针中。在该函数中利用了SDL库支持的IMG_Load()函数真正来装载背景图片,然后采用SDL_DisplayFormat()函数进行格式转换图片优化,将优化后的图片返回作为最后的背景资源;
(3)利用SDL库中支持的TTF_OpenFont()函数装载所用的字体,返回值作为存放字体的指针变量;
18
信息科学与技术学院学士学位论文
(4)利用apply_surface()将背景填充到屏幕,此函数中调用SDL库支持的位填充函数SDL_BlitSurface()来实现该功能;
(5)将文字显示到屏幕上。此部分是最重要部分之一,主要思想为,设置好当前偏移为0,将文件中的所有字符保存到临时区,将字体和字利用TTF_RenderGlyph_Blended()函数组合成一体,最后调用SDL_BlitSurface()函数将组合后的字符装载到屏幕中,如果是遇到文件结尾,则下一页的偏移设置为当前偏移即可,若是屏幕结尾,则设置好下一行以及下一页的偏移;
(6)利用库函数中的SDL_Flip()函数更新屏幕显示,即可将字显示到屏幕上并做相应的更新,窗口创建模块功能如图4-4所示。
开始 将背景填充到屏幕 初始化窗口宽度和高度 填充文字到屏幕 装载背景 屏幕更新 装载字体 进入命令等待状态
图4-4 窗口创建模块流程图
在SDL窗口创建成功之后,窗口利用轮询机制来接收发送过来的消息,此接收机制同样采用的方法是利用了SDL函数库,此函数是SDL_PollEvent(&event),,其中的按键对应的是SDL库中的命令,如果当有按键按下时,要根据按键的类型进行区别,即event.type。
当按键类型是SDL_KEYDOWN时,在此利用到的几个按键分别对应: (1)SDLK_UP,即方向键中的向上键,显示上一页; (2)SDLK_DOWN,即方向键中的向下键,显示下一页; (3)SDLK_LEFT,即方向键中的向左键,显示上一行;
19
信息科学与技术学院学士学位论文
(4)SDLK_RIGHT,即方向键中的向右键,显示下一行; (5)SDLK_LCTRL,即空格左边键左边的Ctrl键,退出程序; (6)SDLK_LALT,即空格左边的Alt键,放大显示。
如果按键类型是SDL_QUIT时,则进行退出操作,和按空格左边Alt键的功能一样,命令模块功能如图4-5所示。
创建窗口 向上键按下 向下键按下 轮询接收命令 向左键按下 向右键按下 Alt键按下 左Ctrl键按下
图 4-5 命令模块流程图
上一行显示 上一行显示 上一行显示 上一行显示 字体放大或缩小 退出
编码解析模块功能如图4-6所示。
图4-6 编码格式转换流程图
完成 转换为Unicode Unicode编码 准备 Gb18030 取得编码方式 Utf-8 Utf-16 否 ISO8859-1 是 不需格式转换 Gb2312
20