在界面开发中,目前DirectUI是个热门的技术名称,因为众多的知名公司都是用DirectUI方式作出了很炫丽的界面。而对于大多数熟悉Win32控件,熟悉MFC开发的开发人员来说,我们应该做何选择?
因为传统的Win32/ MFC大家都比较了解,所以首先我们分析DirectUI,看看DirectUI能完成哪些普通Win32控件难以实现的功能,同时实现一个完整的DirectUI有那些关键点。
基于DirectUI技术的界面库的优势
以下是我们总结的一个完善的DirectUI库的优势,这些特性Win32控件方式难以实现的:
-
界面完全换肤
这里的“界面完全换肤”,是指用户可完全定制化的换肤,软件界面控件大小,位置等都可能有变化等。DirectUI界面库一般都是用XML定义界面虚拟控件并直接布局界面,因此可以实现此功能。但实际上完全的换肤涉及到很多问题,目前很少有界面库产品可以实现这种完全换肤。从界面设计的发展来看,目前已经不流行这种界面的完全换肤,因为这不仅对技术要求比较多,同时也对UI设计要求很高。目前界面换肤大量采用的是更换色调,局部的背景更换(如MSN/QQ最新版本)。
-
理论上更高的效率
由于在DirectUI控件中,更多的控件为逻辑上的虚拟控件。因此理论上来讲DirectUI运行效率会更高一些,但这个效率也与DirectUI界面库整体的软件架构及软件实现有密切关系。在实际考虑时,效率问题应该不是关注的重点,因为目前设计及实现良好的Win32 界面库在效率方面也没有任何问题。
-
容易实现更加炫丽的动态效果
由于DirectUI的技术特点,使其更容易实现一些特效的动画效果,如菜单的动态徐徐展开和收缩,窗口的动态渐隐渐显的弹出和关闭,控件的动画展开和关闭。当然以上这些特性也取决于开发团队的技术实力,同时也需要顶尖优秀的UI设计师配合,方能带来所期望的炫丽效果。
-
防止软件被破解,防外挂
关于这一点,可能是众多关注DirectUI的人没有考虑到的。但实际上恰恰是这一点可能是最为关键的。众多知名互联网公司不遗余力研发DirectUI界面,这一点也是重要考量。传统的Win32控件由于其消息、原理公开,使得通过一些简单的Hook或其他方式可以很容易破解软件。而一个完全的DirectUI界面,其界面元素及内部逻辑完全为私有实现,外界无从得知。这就使得破解变得困难的多。
-
界面与逻辑的完全分离(需要完整脚本支持)
在说明这个问题前,我们来了解这个基本问题:
什么是界面与逻辑的分离?
界面是指涉及界面元素操作的部分代码,比如控件位置大小,控件的状态;窗口的大小;控件界面的绘制代码;控件的动态创建。
逻辑是指软件的程序逻辑,与界面操作完全无关,如网络操作,内部事件与消息。
在Win32控件或者MFC等设计里,实际上是将界面和程序逻辑完全糅合在一起,这样做的缺陷在于如果界面UI设计有一些改变,我们可能要大面积的修改程序代码并重新编译,同时程序也难以重用,我们可能需要重载好多类如CCongfigButton,CSettingButton,CXXXButton等。每一个新的界面效果的增加,我们都需要去修改程序,添加支持。
目前来说,基于Win32的大部分界面库已经能最大限度的分离界面与逻辑,最主要的是将界面控件的绘制代码分离出去,使得应用程序变得更加清晰,更加容易维护,容易重用;也能很容易适应界面UI设计的变化。
什么是界面与逻辑的完全分离?
完全分离是指程序中不出现任何界面控件元素属性的相关操作,如调整界面控件位置,控制控件的显示/隐藏。即在不重新编译程序的情况下,仅通过修改界面配置文件(XML)和脚本文件,即可加载一个新的界面效果。
理论上来说,Win32控件库不能做到界面与逻辑的完全分离。比如MFC框架,更是将界面与逻辑完全融合在一起。这也是很多大的互联网公司花重金研发完全的DirectUI界面引擎的原因,这类公司基本都是快速开发模式,产品更新快,界面UI设计更新快,常常一个软件开发出来,皮肤已经换了好几套了,界面调整无数次了。如果采用传统的方式,这里面会带来巨大的工作量及重复工作。
以上几点是一个基于DirectUI技术的界面库可以实现的,但基于Win32控件的界面库难以实现的。但同时我们也会发现,还没有一个通用的DirectUI界面库产品中实现以上所有特性;即DirectUI的真正优势还未能在实践中实现。以下的关键点是一个完整,通用的DirectUI界面库难以实现的原因。
DirectUI界面框架开发的关键点(或者称为难点)
-
DirectUI界面库整体架构设计
一个完整的DirectUI界面库,可以等同于一个Mini的QT、WPF,Flash等。需要一整套的系统级别的架构,而不仅仅只是界面元素的绘制。这个架构非常重要,同时也对软件架构师有非常高的要求。
-
完整的事件响应模块
Win32控件的事件很多,而一般的DirectUI界面库指实现基本的几个事件如单击,mouse in, mouse leave。其他一些事件如双击,右键,滚轮这些,也许不常用,但如果不能提供这些事件,会是一个比较头疼的问题。
-
复杂控件的支持
复杂控件的支持也是众多DirectUI界面库的软肋。复杂的控件如Menu,list control,tree control,Edit等,也许实现起来必须并不复杂,但要实现一个可完全替代Win32标准控件的控件就比较麻烦了。这涉及到三个方面:
功能特性的完整性
很多DirectUI提供商实际上只实现了部分的功能就宣称支持某某控件,这种说法是不负责任的。例如树形控件,其涉及的接口函数有40多个,Notify消息有20多个。这些函数和消息中,可能常用的只有小部分,但其他不常用的也是不能忽略的。
效率问题
拥有这个功能的实现,不一定代表能广泛通用。是否能承受大数据量的插入?是否保证内存的占用问题?这些都是我们在测试一个自绘控件需要考虑的问题。 另外也需要保证在自绘模式下的效率问题。
-
剪贴,拖拽,热键快捷键等
Windows标准控件我们用了好久了,但其中很多我们非常常用的功能,会常常被的DirectUI的设计者忽略。也许正因为这些功能太平常,太常用了,所以容易被人忽略。如剪贴,拖拽,热键,快捷键,tooltips等。这些功能特性也是不能缺少的,因为太常用了!
-
界面样式多样性的支持
目前有些DirectUI类的产品在控件设计时只是模仿MFC等相应控件的API。例如:
ListView::SetItemImage函数,用来为list的一个item设置图片。但实际上当前软件界面中,设置一张图片是远远不够的,一般Item中不仅需要根据程序逻辑动态显示多个图片,而且还需要显示一些可以响应事件的图片,如QQ好友列表树。对于DirectUI类产品来说,应该对这些提供完整支持,而不是仅仅提供一个自绘结构,让用户自己来处理。
-
高效灵活的自绘机制
当前的软件界面控件的样式是多样的,需要有灵活高效的自绘机制来保证。
Windows标准控件提供了非常灵活的自绘处理,我们可以在WM_PAINT,WM_ERASEGRND等消息中绘制自己的界面。同时对于Button,Menu,List Control,Tree Control, list Box等控件,微软提供WM_DRAWITEM, CustomDraw 等机制,使得我们可以随心所欲的绘制item内容。而各种情况下的效率则由标准控件内部保证。我们只需要在OnDrawItem等消息中绘制item内容即可。
众观所有UI框架,QT,WPF等都提供了完整的自绘机制。如QT甚至提供了CSS等方式来配置界面。足以看出灵活的自绘机制对一个界面产品的重要性。如果DirectUI类界面库不能提供一种高效,灵活的自绘机制,则无法满足软件对界面库的基本需求。
-
与脚本语言的整合
我们坚持认为一个完整的DirectUI界面库应该提供完整的脚本支持。如果将内部的XXLabel, XXButton, XXProgress, XXSliderCtrl等内部类或结构暴露给界面库的使用者,则势必带来界面和逻辑的重新糅合,同时使得应用程序变得深度依赖界面库,带来很多不稳定因素。如无法将界面和逻辑很好的分离,DirectUI就变得没有意义。
一些知名的互联网公司不但在自己的DirectUI系统中深度整合脚本语言,在脚本语言的选择上也在变化,之前常用的是vbscrip/jsscript语言,目前多使用lua脚本语言,lua脚本为开源项目,其特点是灵活,高效,容易扩展。
与DirectUI界面库相比,DSkinLite界面库的优势
-
对开发人员界面开发能力要求低
如上面所描述的,由于目前还未有一个完整的DirectUI类型界面库,大多数情况我们需要在DirectUI界面库的源码上做开发,这对参与二次开发的人员有很高要求,需要对界面开发的各方面有所积累。而DSkinLite界面库主要基于Win32控件,封装完整,无需开发人员熟悉界面开发,同时我们设计时非常重视界面库的易用性,对MFC,WTL,Win32控件有些基本了解的开发人员即可胜任。
-
可迅速实施到项目中
如果已有VC项目,使用DSkinLite这类Win32控件库,可以很容易整合到现有项目中,基本无需修改已有程序逻辑。对于新的项目由于省去了整合并扩展DirectUI框架的工作,使用DSkinLite也会比较快。
-
项目风险小,投入少
由于一个完整的DirectUI库相当于一个新的GUI Framework框架,这样DirectUI界面库本身在架构设计,程序代码质量等方面会给项目带来新的风险。同时需要对项目增加相应的界面开发人员,用以维护DirectUI界面库产品。而基于Win32控件的DSkinLite界面库没有方面的问题。
在界面开发中,目前DirectUI是个热门的技术名称,因为众多的知名公司都是用DirectUI方式作出了很炫丽的界面。而对于大多数熟悉Win32控件,熟悉MFC开发的开发人员来说,我们应该做何选择?
因为传统的Win32/ MFC大家都比较了解,所以首先我们分析DirectUI,看看DirectUI能完成哪些普通Win32控件难以实现的功能,同时实现一个完整的DirectUI有那些关键点。
基于DirectUI技术的界面库的优势
以下是我们总结的一个完善的DirectUI库的优势,这些特性Win32控件方式难以实现的:
-
界面完全换肤
这里的“界面完全换肤”,是指用户可完全定制化的换肤,软件界面控件大小,位置等都可能有变化等。DirectUI界面库一般都是用XML定义界面虚拟控件并直接布局界面,因此可以实现此功能。但实际上完全的换肤涉及到很多问题,目前很少有界面库产品可以实现这种完全换肤。从界面设计的发展来看,目前已经不流行这种界面的完全换肤,因为这不仅对技术要求比较多,同时也对UI设计要求很高。目前界面换肤大量采用的是更换色调,局部的背景更换(如MSN/QQ最新版本)。
-
理论上更高的效率
由于在DirectUI控件中,更多的控件为逻辑上的虚拟控件。因此理论上来讲DirectUI运行效率会更高一些,但这个效率也与DirectUI界面库整体的软件架构及软件实现有密切关系。在实际考虑时,效率问题应该不是关注的重点,因为目前设计及实现良好的Win32 界面库在效率方面也没有任何问题。
-
容易实现更加炫丽的动态效果
由于DirectUI的技术特点,使其更容易实现一些特效的动画效果,如菜单的动态徐徐展开和收缩,窗口的动态渐隐渐显的弹出和关闭,控件的动画展开和关闭。当然以上这些特性也取决于开发团队的技术实力,同时也需要顶尖优秀的UI设计师配合,方能带来所期望的炫丽效果。
-
防止软件被破解,防外挂
关于这一点,可能是众多关注DirectUI的人没有考虑到的。但实际上恰恰是这一点可能是最为关键的。众多知名互联网公司不遗余力研发DirectUI界面,这一点也是重要考量。传统的Win32控件由于其消息、原理公开,使得通过一些简单的Hook或其他方式可以很容易破解软件。而一个完全的DirectUI界面,其界面元素及内部逻辑完全为私有实现,外界无从得知。这就使得破解变得困难的多。
-
界面与逻辑的完全分离(需要完整脚本支持)
在说明这个问题前,我们来了解这个基本问题:
什么是界面与逻辑的分离?
界面是指涉及界面元素操作的部分代码,比如控件位置大小,控件的状态;窗口的大小;控件界面的绘制代码;控件的动态创建。
逻辑是指软件的程序逻辑,与界面操作完全无关,如网络操作,内部事件与消息。
在Win32控件或者MFC等设计里,实际上是将界面和程序逻辑完全糅合在一起,这样做的缺陷在于如果界面UI设计有一些改变,我们可能要大面积的修改程序代码并重新编译,同时程序也难以重用,我们可能需要重载好多类如CCongfigButton,CSettingButton,CXXXButton等。每一个新的界面效果的增加,我们都需要去修改程序,添加支持。
目前来说,基于Win32的大部分界面库已经能最大限度的分离界面与逻辑,最主要的是将界面控件的绘制代码分离出去,使得应用程序变得更加清晰,更加容易维护,容易重用;也能很容易适应界面UI设计的变化。
什么是界面与逻辑的完全分离?
完全分离是指程序中不出现任何界面控件元素属性的相关操作,如调整界面控件位置,控制控件的显示/隐藏。即在不重新编译程序的情况下,仅通过修改界面配置文件(XML)和脚本文件,即可加载一个新的界面效果。
理论上来说,Win32控件库不能做到界面与逻辑的完全分离。比如MFC框架,更是将界面与逻辑完全融合在一起。这也是很多大的互联网公司花重金研发完全的DirectUI界面引擎的原因,这类公司基本都是快速开发模式,产品更新快,界面UI设计更新快,常常一个软件开发出来,皮肤已经换了好几套了,界面调整无数次了。如果采用传统的方式,这里面会带来巨大的工作量及重复工作。
以上几点是一个基于DirectUI技术的界面库可以实现的,但基于Win32控件的界面库难以实现的。但同时我们也会发现,还没有一个通用的DirectUI界面库产品中实现以上所有特性;即DirectUI的真正优势还未能在实践中实现。以下的关键点是一个完整,通用的DirectUI界面库难以实现的原因。
DirectUI界面框架开发的关键点(或者称为难点)
-
DirectUI界面库整体架构设计
一个完整的DirectUI界面库,可以等同于一个Mini的QT、WPF,Flash等。需要一整套的系统级别的架构,而不仅仅只是界面元素的绘制。这个架构非常重要,同时也对软件架构师有非常高的要求。
-
完整的事件响应模块
Win32控件的事件很多,而一般的DirectUI界面库指实现基本的几个事件如单击,mouse in, mouse leave。其他一些事件如双击,右键,滚轮这些,也许不常用,但如果不能提供这些事件,会是一个比较头疼的问题。
-
复杂控件的支持
复杂控件的支持也是众多DirectUI界面库的软肋。复杂的控件如Menu,list control,tree control,Edit等,也许实现起来必须并不复杂,但要实现一个可完全替代Win32标准控件的控件就比较麻烦了。这涉及到三个方面:
功能特性的完整性
很多DirectUI提供商实际上只实现了部分的功能就宣称支持某某控件,这种说法是不负责任的。例如树形控件,其涉及的接口函数有40多个,Notify消息有20多个。这些函数和消息中,可能常用的只有小部分,但其他不常用的也是不能忽略的。
效率问题
拥有这个功能的实现,不一定代表能广泛通用。是否能承受大数据量的插入?是否保证内存的占用问题?这些都是我们在测试一个自绘控件需要考虑的问题。 另外也需要保证在自绘模式下的效率问题。
-
剪贴,拖拽,热键快捷键等
Windows标准控件我们用了好久了,但其中很多我们非常常用的功能,会常常被的DirectUI的设计者忽略。也许正因为这些功能太平常,太常用了,所以容易被人忽略。如剪贴,拖拽,热键,快捷键,tooltips等。这些功能特性也是不能缺少的,因为太常用了!
-
界面样式多样性的支持
目前有些DirectUI类的产品在控件设计时只是模仿MFC等相应控件的API。例如:
ListView::SetItemImage函数,用来为list的一个item设置图片。但实际上当前软件界面中,设置一张图片是远远不够的,一般Item中不仅需要根据程序逻辑动态显示多个图片,而且还需要显示一些可以响应事件的图片,如QQ好友列表树。对于DirectUI类产品来说,应该对这些提供完整支持,而不是仅仅提供一个自绘结构,让用户自己来处理。
-
高效灵活的自绘机制
当前的软件界面控件的样式是多样的,需要有灵活高效的自绘机制来保证。
Windows标准控件提供了非常灵活的自绘处理,我们可以在WM_PAINT,WM_ERASEGRND等消息中绘制自己的界面。同时对于Button,Menu,List Control,Tree Control, list Box等控件,微软提供WM_DRAWITEM, CustomDraw 等机制,使得我们可以随心所欲的绘制item内容。而各种情况下的效率则由标准控件内部保证。我们只需要在OnDrawItem等消息中绘制item内容即可。
众观所有UI框架,QT,WPF等都提供了完整的自绘机制。如QT甚至提供了CSS等方式来配置界面。足以看出灵活的自绘机制对一个界面产品的重要性。如果DirectUI类界面库不能提供一种高效,灵活的自绘机制,则无法满足软件对界面库的基本需求。
-
与脚本语言的整合
我们坚持认为一个完整的DirectUI界面库应该提供完整的脚本支持。如果将内部的XXLabel, XXButton, XXProgress, XXSliderCtrl等内部类或结构暴露给界面库的使用者,则势必带来界面和逻辑的重新糅合,同时使得应用程序变得深度依赖界面库,带来很多不稳定因素。如无法将界面和逻辑很好的分离,DirectUI就变得没有意义。
一些知名的互联网公司不但在自己的DirectUI系统中深度整合脚本语言,在脚本语言的选择上也在变化,之前常用的是vbscrip/jsscript语言,目前多使用lua脚本语言,lua脚本为开源项目,其特点是灵活,高效,容易扩展。
与DirectUI界面库相比,DSkinLite界面库的优势
-
对开发人员界面开发能力要求低
如上面所描述的,由于目前还未有一个完整的DirectUI类型界面库,大多数情况我们需要在DirectUI界面库的源码上做开发,这对参与二次开发的人员有很高要求,需要对界面开发的各方面有所积累。而DSkinLite界面库主要基于Win32控件,封装完整,无需开发人员熟悉界面开发,同时我们设计时非常重视界面库的易用性,对MFC,WTL,Win32控件有些基本了解的开发人员即可胜任。
-
可迅速实施到项目中
如果已有VC项目,使用DSkinLite这类Win32控件库,可以很容易整合到现有项目中,基本无需修改已有程序逻辑。对于新的项目由于省去了整合并扩展DirectUI框架的工作,使用DSkinLite也会比较快。
-
项目风险小,投入少
由于一个完整的DirectUI库相当于一个新的GUI Framework框架,这样DirectUI界面库本身在架构设计,程序代码质量等方面会给项目带来新的风险。同时需要对项目增加相应的界面开发人员,用以维护DirectUI界面库产品。而基于Win32控件的DSkinLite界面库没有方面的问题。
分享到:
相关推荐
DirectUI是一种用于Windows GUI开发的技术,它通过提供一套高级的用户界面组件库,极大地提升了Windows应用程序的界面表现力和交互性。开源DirectUI的相关资料包括源码、帮助文件以及入门教程,这对于学习和掌握这项...
DirectUI是Microsoft DirectDraw User Interface的缩写,它是一种用于构建高效、高性能图形用户界面的技术。在Delphi编程环境中,DirectUI被用作一个库,允许开发者创建具有丰富视觉效果和自定义界面元素的应用程序...
DirectUI是微软Windows API的一个扩展,它为开发者提供了一种更高效、更灵活的方式来创建用户界面。这个"Ex_DirectUI2.0.zip"压缩包很可能是关于DirectUI的升级或增强版本,版本号2.0,暗示了相对于之前的版本可能...
DirectUI 是一种高效且灵活的用户界面开发框架,它允许开发者通过XML来定制应用程序的皮肤,从而实现丰富多样的界面效果。这个皮肤组件提供了一系列强大的功能,如皮肤自由组合、皮肤合并等,使得客户端软件的界面...
在本教程"Delphi10_2_简单DirectUI界面开发"中,我们将深入探讨如何在Delphi 10.2中利用DirectUI技术创建出引人注目的应用程序界面。 首先,理解DirectUI的核心概念是至关重要的。DirectUI提供了一种基于控件的界面...
### DirectUI使用教程知识点解析 #### 一、DirectUI技术简述 **1.1 什么是DirectUI?** - **定义**: DirectUI是一种基于“直接绘图”技术的用户界面库,它允许开发者通过直接在父窗口上绘制子组件的方式来构建...
DirectUI是一种用户界面开发技术,源自Microsoft Direct3D的一个扩展,它允许开发者创建高效、高性能且高度自定义的图形用户界面。DirectUI的核心是利用硬件加速的图形渲染,通过直接操作GPU来提升UI的视觉效果和...
DirectUI是一种用户界面(UI)开发技术,主要用于Windows平台上的应用程序设计。它是由Microsoft提出的一种高效、灵活的界面设计框架,可以实现高度定制化的界面效果。DirectUI的核心是通过硬件加速来提升界面渲染性能...
【标题】"Delphi7_DirectUI_简单界面源码" 涉及到的是使用 Delphi 7 开发工具,结合 DirectUI 技术创建一个具有美化效果的简单用户界面。Delphi 7 是一款经典的面向对象的编程环境,基于 Pascal 语言,广泛用于 ...
DirectUI是一种基于Windows API的用户界面开发框架,它极大地简化了Windows桌面应用程序的界面设计和实现过程。开源的DirectUI框架提供了丰富的控件和组件,允许开发者以更高效的方式创建美观且功能强大的用户界面,...
DirectUI界面库是一种高效、轻量级的用户界面(UI)开发框架,它基于Windows操作系统提供的Win32 API和GDI+图形库。这个库的主要目的是简化和优化Windows应用程序的界面设计,提供更加灵活和美观的图形用户界面。在...
DirectUI 是一种Windows平台上用于构建用户界面的技术,它是由Microsoft DirectX团队开发的,主要用于提高图形用户界面(GUI)的性能和交互性。在本项目"directui 模仿酷狗播放器"中,开发者利用DirectUI技术来创建...
DirectUI界面开发是一种高效、灵活的用户界面设计技术,它主要特点是无需依赖特定的图形用户界面(GUI)框架,而是直接在Windows API层面上进行绘制和交互。这种技术被广泛应用于许多知名软件如MSN、QQ、IGO和WOW中...
自己写的一套框架结构,原来并不了解DirectUI思想,后来知道这套框架和DirectUI思想基本一致。 整套框架主要就由2个类为基础TransItem,TransWnd 其它类都由其派生出来。 所有控件都是逻辑控件,依赖于最上层的...
开源的Windows CE (Wince) 和 Windows平台的DirectUI界面框架是软件开发中的一个重要工具,尤其对于构建高效、用户友好的图形用户界面(GUI)至关重要。DirectUI是一种基于微软DirectX技术的用户界面开发框架,它...
DirectUI是一种用户界面(UI)设计技术,主要用于Windows操作系统下的应用程序开发。它允许开发者创建更加美观、高效的图形用户界面,提供比标准Windows控件更丰富的视觉效果和交互体验。DirectUI通常与DirectX关联,...
### 开源DirectUI类库介绍及类图分析 #### 一、DirectUI概述 DirectUI是一种专注于提升用户体验的用户界面技术,它通过绕过传统的Windows GDI/User窗口系统,允许开发者自定义绘制每一个用户界面元素,从而实现...
DirectUI是微软Windows API的一个扩展,它为开发者提供了一种更高效、更灵活的方式来创建用户界面。这个"Ex_DirectUI4.1.zip"压缩包很可能是DirectUI库的一个更新版本,版本号4.1,可能包含了改进和新功能。在...
【DIRECTUI实现的2017版360卫士】是基于DirectUI技术构建的,这是一款在2017年推出的360安全卫士版本。DirectUI是一种用户界面(UI)开发技术,它使得软件开发者可以更加便捷地创建出丰富、动态且高效的图形用户界面...
DirectUI for .Net 是一个专为.NET框架设计的界面库,它主要致力于提供高效、高性能且高度可定制的用户界面组件。DirectUI这个名字源于DirectX的UI部分,它在游戏开发中广泛使用,以实现流畅、低延迟的图形界面。...