我们通常做界面,都是使用IDE的所见所得功能,在界面上进行拖曳。有几个比较著名,我们分个比较下。
1、mfc/dephi/qt:资源+代码,然后二进制编译。
2、java:类+本地化【awt/swing】。
3、html的web浏览。他使用标记语言来描述UI格式,脚本使用javascript或者vbscript来控制对象的行为,比如鼠标点击。
4、3D显示方式,利用引擎来处理,
5、2D显示方式,多为贴图,或者皮肤方式。
从这些界面的实现方式,我们可以将需要实现的过程划为4个元素:
1、资源:如图片,文字等,常见于.res中。
2、属性:如字体、长度等。
3、行为:如变更字体,移动窗体等。
4、事件:如鼠标点击。这是种特殊行为,但由于需要全局控制,所以必须单独列出。
我们从这4个方面来比较各种实现方式。对于资源来说,其实没啥好说,任何一种方式都必须管理,缺乏灵活的探讨空间,或者用dll方式或者用打包方 式。对于mfc/dephi/qt在IDE中实现后,代码、资源、属性是混合后编译的,所以执行速度就快,但生成后,修改不易。java实际上用类来描 述,和上面方案相似。
web方式和以前是不同,他们使用标记方式来描述界面,同时使用脚本来进行逻辑处理。对于web来说,由于标记以文本形式存储,所以便于修改,只是传输到客户端来,需要解析后展现,所以速度比较慢。
2D/3D的处理方式多见于游戏中,现在还没有通用的标准,不过在魔兽世界中,使用Lua来做界面是个很好的实践,我们可以 看到一个比较成熟的应用。Mozilla的xul和微软的xaml是对html的一种扩充,并逐渐被使用,这部分比较参看《http://blog.csdn.net/romandion/archive/2009/03/06/3962888.aspx》
我们需要设计一种用户界面的实现方案,能够综合现有几种方案的优点,同时还尽量避免他们的劣势。我们的设计目标有这么几点:
1、简单灵活
2、执行高效
3、控制力强
由于资源并没有什么好处理的,我们只要为他们建立一个存放的地方和或者方式就可以了。为了实现简 单灵活的界面设计,所以借鉴html的思路是必要的,于是我们以xml的方式来编写界面对象。xml是种树状描述语言,这个和对象的性质很象,没有对象都 具备属性,这样就可以通过每个xml的标签来描述。我们将界面的每个元素抽象为带属性的对象,那么就可以用xml来描述了。
不过和对象不同 的是,类之间的继承关系似乎无法解决。如果一个xml的标签描述的是个按钮,那么按钮类的父类属性,也必须被描述出来,否则对标签的描述将无法访问到父类 的属性。因此我们必须建立一个类管理器,而类同样也可以根据属性进行描述。当标签描述界面时,可以简单指定所属的类,然后对属性进行赋值。
这种方案和java怎么很象呢?不同的是,java传输的是编译后的类,而我们传输的是对象的描述。这个感觉和sql有点象,我们只要描述清楚要什么,而不关心得到的过程。
还有个问题,就是xml在解析时,比较耗时,于是我们可以将这些描述编译成容易处理的格式。这样在执行时,很容易被翻译成本地的界面。这种方式在描述2D/3D对象时是否有效还没有被验证。
对于行为,我们需要将所有的行为归纳为几种可能1、数值计算,2、结构控制,3、对象操作。这些传统的语言都可以描述,不论是脚本语言还是C/C++/DEPHI/JAVA。我们需要从中选择一种思想能够达到高效和控制强的语言或者他们的变形。
事件可以视为条件触发的行为,因此从操作系统中获得事件,然后广播到本系统中,可以借鉴已有系统的成熟经验。xul/xaml/魔兽世界的UI设计都可以归纳为这种形式。
分析完上面的关注点,我们现在来设计一个系统,实现目标。
首先,我们建立一个执行框架,如浏览器类。然后,由有客户编写界面程序。
执行框架要做的事情:
1、管理类的描述
2、管理对象描述
3、管理资源和访问方式
4、管理行为脚本定义
5、建立事件系统
6、展示界面和执行行为
客户程序特点:
1、指定资源
2、类描述
3、对象描述
4、脚本
5、事件响应
我们将资源、描述、代码参照DLL格式分成不同的段,再打包在一起,在由执行框架载入。这个方式和Javah很像,但加入的内容分类格式是和PE类似的,分段管理。载入之后,按可以重定位的思想划分实际内存位置。