《易容大师》开发文档

曾劲松 2006.10.29 http://www.dywt.com.cn

总体设计原理

易容大师是一款通过使用图形图像处理软件来设计软件界面,然后对图片按控件进行分割然后“贴”到易语言的图形按钮、画板、标签等控件和上来实现对易语言程序界面的美化和换肤。前期的界面设计属于美工的范畴,这里且不讨论。《易容大师》主程序主要要实现的就是提供方便的功能对图片进行分割(甚至支持自动切割),生成独立的皮肤文件,并根据分割块类型自动创建窗口和控件;易容大师模块则在换肤时能够从皮肤文件中读取图片块,自动把图片贴到正确的控件上去;如果窗口大小被改变,还能够完美实现窗口同步缩放。

为了便于精准地对图片进行分割,该软件提供了动态绘制、捕捉辅助线、重画修改及键盘微调等功能;为了自动创建窗口和控件,使用了易语言颇有创意的易向导方式(易向导模版文件名为“易容大师模版.e”);而为了实现换肤、控件同步缩放、超酷滑块条等,则深入使用了易模块功能。

↑目录

主程序

主程序源文件为eskin.e,编译后文件名为eskin.exe。主程序的编写采用了面向对象的编程思想,实现了两个核心类:“控件矩形”和“辅助线”。

控件矩形
该类主要用来记录在主界面上绘制的所有控件矩形的相关信息,包括位置、大小、控件类型、控件标记、锚点信息、是否为滑块等等,同时负责在界面上绘制自身。该类的属性和方法如下表所示。

控件矩形类
<私有属性>  
私标记 该矩形所代表的控件的标记
私备注 关于该控件的备注信息,用于方便根据名字选择该控件,同时在生成真正的控件时会以备注命名。
私控件类型 控件的类型(可以是图形按钮、画板、标签、水平画块等)
私横坐标 控件的横坐标
私纵坐标 控件的纵坐标
私宽度 控件的宽度
私高度 控件的高度
私锚住左边 是否锚住控件的左边(用于窗口同步缩放)
私锚住上边 是否锚住控件的上边(用于窗口同步缩放)
私锚住右边 是否锚住控件的右边(用于窗口同步缩放)
私锚住下边 是否锚住控件的下边(用于窗口同步缩放)
私滑条控件标记 如果控件类型为滑块,指定该滑块的滑条控件标记
私显示控件标记 如果控件类型为滑块,指定不够现实滑块值的控件标记(易容大师会自动创建该标记的编辑框)
私最小值 如果控件类型为滑块,指定该滑块的最小值
私最大值 如果控件类型为滑块,指定该滑块的最大值
私当前值 如果控件类型为滑块,指定该滑块的当前值
私对齐方式 如果控件类型为滑块,指定该滑块与滑条的对齐方式
私被选中 指示控件是否被选中,如果被选中,绘制时颜色会不一样
私图片数据 该控件对应的四种状态的图片字节集
<主要方法>  
从字节集读入 反系列化,用来从磁盘读入文件时构造控件矩形类的对象
绘制矩形到画板 将控件矩形绘制到主界面,需考虑到缩放比例、控件类型、锚点信息等
输出为文本 将控件矩形实例转化为文本串,用于调试。类似于toString()方法
输出为字节集 将控件矩形的信息生成为字节集数据,用于存盘。类似于serialize()方法
包含点 判断控件矩形是否包含某点,用来判断用户通过鼠标选择
其他很多取、置方法 用来读写私有属性

辅助线类
辅助线用来方便用户绘制和调整控件矩形,以更精确的方式来切割图片。

辅助线类
<私有属性>  
私方向 “真”为水平,“假”为竖直
私位置 辅助线的位置
私被选中 辅助线是否被选中
<方法>  
从字节集读入 用来从磁盘文件的数据中重建辅助线对象
绘制到画板 将自身绘制到画板
输出为字节集 生成对戏那个的字节集表示,用于存盘


在用户通过画矩形的方式将图片划分好区域并设定要相应的属性后,易容大师根据用户的工作来将这些图片分割成小图片,同时生成一个临时的皮肤配置文件(扩展名为esk_)。因为用户有可能需要修改生成的小块图片,所以并没有一次生成独立的皮肤文件。然后再根据该临时皮肤配置文件,生成最终独立的皮肤文件(扩展名为esk)。关于皮肤位置文件(esk_)和独立的皮肤文件的文件格式的描述,请参阅“文件格式”一小结。

如果是以易向导的方式来运行易容大师,则可以直接通过菜单“工程>写入到易语言编程环境”来自动创建所有的窗体和控件!该向导通过复制模版窗口上已有控件的方式来创建新控件,并自动设置好位置和大小、锚点属性、滑块属性等。省去用户90%的控件创建和设置工作。易向导的模版文件为“易容大师模版.e”,主程序已将其作为图片资源包含进去了。

↑目录

文件格式

为了保存工程、生成皮肤,易容大师设计了两个个文件格式:易容大师工程文件、易容大师皮肤文件。

易容大师工程文件,其扩展名为esp,即 E Skin Project的缩写,主要用来保存用户进行的控件矩形的绘制和设置的工作,以方便用户进行多时段的编辑。其格式如下:

ESkinProject
1.0
1 0
工程文件描述(供人阅读)(“易容大师工程文件1.0 http://www.goomoo.cn”)

工程设置
皮肤名,
透明色,
窗口标记,
窗口宽度,
窗口高度,
可否调整大小,
拖动窗口大小的控件标记
<1.1版本新增>是否使用超级菜单
超级菜单颜色设置(10)
图片文件名1
图片文件名2
图片文件名3
图片文件名4
控件矩形的数目

控件数据块1 ... 控件数据块n 辅助线的数目 辅助线数据块1 ... 辅助线数据块n

易容大师皮肤文件,其扩展名为esk,即 E Skin 的缩写,用来保存最终生成的皮肤文件。 其格式如下表:

文件标识(ESKIN1.0)
主版本号1
次版本号1
文件描述
(“易容大师 皮肤文件1.1 http://www.goomoo.cn”)

(“易容大师 皮肤配置文件1.1 http://www.goomoo.cn”)
工程设置
皮肤名,
透明色,
窗口标记,
窗口宽度,
窗口高度,
可否调整大小,
拖动窗口大小的控件标记,
<1.1版本新增>是否使用超级菜单
如果使用,则保存超级菜单颜色设置(10个)
<是否已注册>
<如果为独立版且不可调整大小,则有窗口图片>
主分割符

控件数据块1

主分割符 控件数据块2 主分割符 ... 主分割符 控件数据块n


其中,主分割符为文本串: !(&^ (即Shift+[1976])
其中控件数据块的格式如下:

控件标记 控件类型 横坐标 纵坐标 宽度 高度 锚住左边 锚住上边 锚住右边 锚住下边 滑条控件标记 显示控件标记 最小值 最大值 当前值

如果是打包成独立文件,则还需要图片数据

主分割符
#图片正常 正常图片 #图片鼠标经过 鼠标经过图片 #图片按下 鼠标按下图片 #图片固定 禁止图片 <画板或标签> 图片数据(已不再分是固定还是平铺)

此外,还有皮肤图片配置文件,扩展名为esk_,它的格式与esk文件格式差不多,只是每个控件矩形数据块中不包含实际的图片数据。

↑目录

文件及模块调用包含关系图

整个《易容大师》软件涉及到众多的文件和易模块,为方便理清其关系,特绘制文件及模块调用包含关系图如下。其中箭头表示源文件调用目的文件;圆角矩形的包含关系则表示文件作为资源被包含或模块的再封装。

↑目录

各模块的作用及实现机制简介

1. 设置控件锚点模块(源文件名:anchors_ec.e,编译后文件名:anchors.ec)
   主要作用:方便实现当主窗口的大小发生改变时,自动同步调整其控件的位置和大小。亦称窗口同步缩放。
   实现机制:当调用模块的输出函数“设置控件锚点”时,模块将该控件的窗口句柄、离父窗口左、上、右、下的位置以及父窗口的旧窗口过程(WndProc)记录到全局数组中,同时子类化其父窗口,拦截父窗口的WM_SIZE消息,当父窗口的大小发生改变时,根据事先保存在全局数组中的信息调整子窗口的位置和大小;当调用输出函数“水平均分子控件”或“垂直均分子控件”时,模块子类化该窗口,拦截其WM_SIZE消息,当该窗口的大小发生改变是,模块统计其第一层子窗口的数目,计算每个子窗口的位置和大小,然后把它们摆放到合适的位置。整个模块的核心技术就是窗口子类化。

2. 选择文件夹模块(源文件名:bff_ec.e,编译后文件名:古木_选择文件夹.ec)
   主要作用:打开一个文件夹浏览窗口,用于选择文件夹,同时允许创建文件夹。
   实现机制:使用易语言自带的目录框和驱动器框实现的,很简单。

3. 置控件外形图片模块(源文件名:picRgn_ec.e,编译后文件名:置控件外形图片.ec)
   主要作用:易语言提供一个“置外形图片”命令,该命令可以根据图片的指定透明色来设置窗口的外形,但不能改变控件的外形。此模块就是弥补这一点——可以根据图片来设置任何控件的外形!
   实现机制:分析提供的图片,根据指定的透明色,不断使用API函数CreateRectRgn和CombineRgn来创建一个窗口区域,然后将该区域设置到该控件。

4. 高级滑块条模块(源文件名:trackbar_ec_free.e,编译后文件名:古木滑块条_免注册版.ec)
   主要作用:根据任何现有的控件来构建滑块条,可以创建任意复杂和美观的滑块条。
   实现机制:当用户调用创建滑块条函数时,模块子类化要作为滑块和滑条的控件,分别拦截其WM_LBUTTONDOWN、WM_LBUTTONUP消息,当鼠标在“滑块”上按下左键时,使用API函数SetTimer创建一个计时器,该计时器使得“滑块”跟着鼠标移动(当然在移动的过程中要判断滑块的位置是否超出了滑条,同时更新对应的数值显示框);当鼠标在“滑块”上放开左键时,销毁该计时器。当鼠标在“滑条”上单击时,根据单击的位置计算“滑块”的值,同时移动“滑块”到正确的位置。

5. 易容大师主模块(源文件名:eskin_ec.e,编译后文件名:eskin.ec)
   主要作用:将易容大师主程序生成的皮肤文件“穿”到指定的窗口上。
   实现机制:该模块通过分析皮肤文件的内容,调整窗口和控件的位置和大小,按主程序中的设计方式设置控件的图片、锚点属性、滑块属性等,主要就是一个分析文件格式和设置控件属性的过程。该模块再次封装了设置控件锚点模块和高级滑块条模块,使用更为方便。

↑目录