Post

M8 Theme Builder 1.0/2.0版本已解决技术难点的汇总

“这篇文章是关于 Meizu M8美化工具的1.0/2.0版本的技术难点的汇总”

M8 Theme Builder 1.0/2.0版本已解决技术难点的汇总

自定义控件

之前自己也做过很多WinForms项目了,包括为Cisco的EOC产品所做的网络设备管理工具,包括Code Beautifier Collection这样的Delphi IDE插件,包括#SNMP MIB Browser和Compiler这样的小工具。但是这几个东西都属于规矩的用户界面,几乎不需要采用任何自定义控件。实际上对于一个WinForms开发人员来说,制作自己的控件还是十分必要的。M8 Theme Builder也是很好的练兵机会。由于WinForms默认控件对于透明背景是没有支持的,为了能够搭建出高仿真的M8用户界面,Theme Builder必须使用自定义的控件。

关于透明背景的控件开发,其实互联网上相关的文章还是很多的。我主要参考了下面两篇文章。应该说最后Theme Builder 1.0基本上达到了预期的效果。而在2.0版本中,这些控件又稍微做了一下改进。

主题包的解析

对于ZIP解压,我一直使用SharpZipLib。由于这个开源函数库已经十分完善,所以压缩/解压ZIP非常方便。

读取和修改配置文件其实就是基本的INI文件读写操作。我最后采用的是RemObjects的ShineOn开源库,使用TIniFile类型。应该说INI文件已经逐步退出了历史舞台,但是凭借这些开源的函数库,读写INI文件是十分方便的一件事情。

M8主题部件的两个bug

Meizu的开发人员似乎没有意识到INI文件格式其实很宽松,所以他们仅仅提供的支持其实很不充分。例如下面的一行其实是有效的INI格式,

AudioPlayer = AudioPlayer.png

但是假如以这种格式做成配置文件并放入主题包中,那么M8并不能认出这一行。唯一能够被识别的格式是

AudioPlayer=AudioPlayer.png

之前我采用的Nini只能生成上面带有空格的格式,而不能生成下面紧凑的格式。我尝试过自己修改Nini代码来满足M8的要求,但后来还是换成了ShineOn。这实在是一个令人烦恼的bug。

可是换成ShineOn又触及了另外一个bug。原因是CFG文件中好像不能有空行,否则M8上面使用主题时会出现ThemeManager.exe进程hang掉的严重系统故障(唯有重启M8才能恢复)。

最后为了绕过这两个bug,我只能先用ShineOn生成INI文件之后手工删除空行来满足M8的CFG格式要求。

预览效果图的生成

在1.0的版本中,一个很大的问题是Theme Builder不能生成两个预览图片。这样最后保存的主题包可能在拿到M8上面安装之前,用户没有办法通过标准的预览界面看到效果,而只能到实施这个主题后才会看到。这是一个很不方便的地方。但是要在Theme Builder中生成预览也需要几方面的考虑。

直接将界面抓屏保存为图片,虽然可以说比较简单,但是由于选择图片的Shortcut控件是可见的,所以抓下来的效果是略有瑕疵的。因此最后我还是才用了手工绘制的方式,将一块画布(Graphics)传递给各个控件并由它们自己绘制到预览图片上。这样做得到了最好的预览图片效果,而且大图缩放之后就可以同时生成小图。

应该说到这里2.0版本的开发也基本结束了,应该很快就可以正式发布。

WPF和WinForms的抉择

由于WPF是一个更加适合界面制作的框架,我也尝试使用WPF做了一些技术研究。从尝试结果来看,WPF对于透明背景的支持乃是浑然天成,而Expression Blend的设计体验又是十分舒服的,所以在制作同级别复杂程度的界面比较中,WPF还是胜出很多的。

可能在我真正领悟了WPF的开发技巧之后,Theme Builder的界面可以有一天切换到WPF。当然,这个不会很快到来,因为现在WinForms的界面我个人觉得已经够用了。你的感觉呢?

附:M8主题文件的格式

其实M8的主题包(MTH)就是一个结构严谨的ZIP包,这一点同Stardock产品的样式包是很类似的。MTH包解压后内容包括,

  1. 配置文件theme.cfg。其实这是一个十分简单的INI文件。
  2. 程序图片。最新的M8固件需要90*90大小的PNG文件。图片到程序名字的映射关系其实在上面的配置文件中指定。
  3. 辅助图片。这包括三种背景图片(普通,呼叫,和锁定),以及两种大小的预览效果图(大图和小图)。背景以及大缩略图都需要480720大小的JPG文件,而小缩略图是120180大小的JPG文件。

主题包的文件名即是该主题的名称。而作者信息是放在配置文件中的。

© Lex Li. All rights reserved. The code included is licensed under CC BY 4.0 unless otherwise noted.
Advertisement