在界面开发中,眼下DirectUI是个热门的技术名称,由于众多的知名公司都是用DirectUI方式作出了非常炫丽的界面。而对于大多数熟悉Win32控件,熟悉MFC开发的开发者来说,我们应该做何选择?

由于传统的Win32/ MFC大家都比較了解,所以首先我们分析DirectUI,看看DirectUI能完毕哪些普通Win32控件难以实现的功能,同一时候实现一个完整的DirectUI有那些关键点。


基于DirectUI技术的界面库的优势

下面是我们总结的一个完好的DirectUI库的优势,这些特性Win32控件方式难以实现的:

  1. 界面全然换肤

    这里的“界面全然换肤”,是指用户可全然定制化的换肤,软件界面控件大小,位置等都可能有变化等。DirectUI界面库一般都是用XML定义界面虚拟控件并直接布局界面,因此能够实现此功能。但实际上全然的换肤涉及到非常多问题,眼下非常少有界面库产品能够实现这样的全然换肤。从界面设计的发展来看,眼下已经不流行这样的界面的全然换肤,由于这不仅对技术要求比較多,同一时候也对UI设计要求非常高。眼下界面换肤大量採用的是更换色调局部的背景更换(如MSN/QQ最新版本号)。
  2. 理论上更高的效率

    由于在DirectUI控件中,很多其它的控件为逻辑上的虚拟控件。因此理论上来讲DirectUI执行效率会更高一些,但这个效率也与DirectUI界面库总体的软件架构及软件实现有密切关系。在实际考虑时,效率问题应该不是关注的重点,由于眼下设计及实现良好的Win32 界面库在效率方面也没有不论什么问题。
  3. easy实现更加炫丽的动态效果

    因为DirectUI的技术特点,使其更easy实现一些特效的动画效果,如菜单的动态徐徐展开和收缩,窗体的动态渐隐渐显的弹出和关闭,控件的动画展开和关闭。当然以上这些特性也取决于开发团队的技术实力,同一时候也须要顶尖优秀的UI设计师配合,方能带来所期望的炫丽效果。


  4. 防止软件被破解,防外挂

    关于这一点,可能是众多关注DirectUI的人没有考虑到的。但实际上恰恰是这一点可能是最为关键的。众多知名互联网公司不遗余力研发DirectUI界面,这一点也是重要考量。传统的Win32控件因为其消息、原理公开,使得通过一些简单的Hook或其它方式能够非常easy破解软件。而一个全然的DirectUI界面,其界面元素及内部逻辑全然为私有实现,外界无从得知。这就使得破解变得困难的多。
  5. 界面与逻辑的全然分离(须要完整脚本支持)

    在说明这个问题前,我们来了解这个基本问题:



    什么是界面与逻辑的分离?



    界面
    是指涉及界面元素操作的部分代码,比方控件位置大小,控件的状态;窗体的大小;控件界面的绘制代码;控件的动态创建。


    逻辑是指软件的程序逻辑,与界面操作全然无关,如网络操作,内部事件与消息。

      

            在Win32控件或者MFC等设计里,实际上是将界面和程序逻辑全然糅合在一起,这样做的缺陷在于假设界面UI设计有一些改变,我们可能要大面积的改动程序代码并又一次编译,同一时候程序也难以重用,我们可能须要重载好多类如CCongfigButton,CSettingButton,CXXXButton等。每个新的界面效果的添加,我们都须要去改动程序,加入支持。


            眼下来说,基于Win32的大部分界面库已经能最大限度的分离界面与逻辑,最基本的是将界面控件的绘制代码分离出去,使得应用程序变得更加清晰,更加easy维护,easy重用;也能非常easy适应界面UI设计的变化。

    什么是界面与逻辑的全然分离?

    全然分离是指程序中不出现不论什么界面控件元素属性的相关操作,如调整界面控件位置,控制控件的显示/隐藏。即在不又一次编译程序的情况下,仅通过改动界面配置文件(XML)和脚本文件,就可以载入一个新的界面效果。

    理论上来说,Win32控件库不能做到界面与逻辑的全然分离。比方MFC框架,更是将界面与逻辑全然融合在一起。这也是非常多大的互联网公司花重金研发全然的DirectUI界面引擎的原因,这类公司基本都是高速开发模式,产品更新快,界面UI设计更新快,经常一个软件开发出来,皮肤已经换了好几套了,界面调整无数次了。假设採用传统的方式,这里面会带来巨大的工作量及反复工作。

以上几点是一个基于DirectUI技术的界面库能够实现的,但基于Win32控件的界面库难以实现的。但同一时候我们也会发现,还没有一个通用的DirectUI界面库产品中实现以上全部特性;即DirectUI的真正优势还未能在实践中实现。下面的关键点是一个完整,通用的DirectUI界面库难以实现的原因。

 
DirectUI界面框架开发的关键点(或者称为难点)

  1. DirectUI界面库总体架构设计

            一个完整的DirectUI界面库,能够等同于一个Mini的QT、WPF,Flash等。须要一整套的系统级别的架构,而不只不过界面元素的绘制。这个架构很重要,同一时候也对软件架构师有很高的要求。
  2. 完整的事件响应模块

          Win32控件的事件非常多,而一般的DirectUI界面库指实现主要的几个事件如单击,mouse in, mouse leave。其它一些事件如双击,右键,滚轮这些,或许不经常使用,但假设不能提供这些事件,会是一个比較头疼的问题。
  3. 复杂控件的支持

         复杂控件的支持也是众多DirectUI界面库的软肋。复杂的控件如Menu,list control,tree control,Edit等,或许实现起来必须并不复杂,但要实现一个可全然替代Win32标准控件的控件就比較麻烦了。这涉及到三个方面: 


        功能特性的完整性

        非常多DirectUI提供商实际上仅仅实现了部分的功能就宣称支持某某控件,这样的说法是不负责任的。比如树形控件,其涉及的接口函数有40多个,Notify消息有20多个。这些函数和消息中,可能经常使用的仅仅有小部分,但其它不经常使用的也是不能忽略的。 


       效率问题

        拥有这个功能的实现,不一定代表能广泛通用。能否承受大数据量的插入?是否保证内存的占用问题?这些都是我们在測试一个自绘控件须要考虑的问题。 另外也须要保证在自绘模式下的效率问题。
  4. 剪贴,拖拽,热键快捷键等

           Windows标准控件我们用了好久了,但当中非常多我们非经常常使用的功能,会经常被的DirectUI的设计者忽略。或许正由于这些功能太寻常,太经常使用了,所以easy被人忽略。如剪贴,拖拽,热键,快捷键,tooltips等。这些功能特性也是不能缺少的,由于太经常使用了!
  5. 界面样式多样性的支持

          眼下有些DirectUI类的产品在控件设计时仅仅是模仿MFC等对应控件的API。比如:

    ListView::SetItemImage函数,用来为list的一个item设置图片。但实际上当前软件界面中,设置一张图片是远远不够的,一般Item中不仅须要依据程序逻辑动态显示多个图片,并且还须要显示一些能够响应事件的图片,如QQ好友列表树。对于DirectUI类产品来说,应该对这些提供完整支持,而不是只提供一个自绘结构,让用户自己来处理。
  6. 高效灵活的自绘机制

        当前的软件界面控件的样式是多样的,须要有灵活高效的自绘机制来保证。

         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类界面库不能提供一种高效,灵活的自绘机制,则无法满足软件对界面库的基本需求。
  7. 与脚本语言的整合       

           我们坚持觉得一个完整的DirectUI界面库应该提供完整的脚本支持。假设将内部的XXLabel, XXButton, XXProgress,  XXSliderCtrl等内部类或结构暴露给界面库的使用者,则势必带来界面和逻辑的又一次糅合,同一时候使得应用程序变得深度依赖界面库,带来非常多不稳定因素。如无法将界面和逻辑非常好的分离,DirectUI就变得没有意义。

    一些知名的互联网公司不但在自己的DirectUI系统中深度整合脚本语言,在脚本语言的选择上也在变化,之前经常使用的是vbscrip/jsscript语言,眼下多使用lua脚本语言,lua脚本为开源项目,其特点是灵活,高效,easy扩展。

 
与DirectUI界面库相比,DSkinLite界面库的优势

  1. 对开发者界面开发能力要求低

    如上面所描写叙述的,因为眼下还未有一个完整的DirectUI类型界面库,大多数情况我们须要在DirectUI界面库的源代码上做开发,这对參与二次开发的人员有非常高要求,须要对界面开发的各方面有所积累。而DSkinLite界面库主要基于Win32控件,封装完整,无需开发者熟悉界面开发,同一时候我们设计时非常重视界面库的易用性,对MFC,WTL,Win32控件有些基本了解的开发者就可以胜任。
  2. 可迅速实施到项目中

    假设已有VC项目,使用DSkinLite这类Win32控件库,能够非常easy整合到现有项目中,基本无需改动已有程序逻辑。对于新的项目因为省去了整合并扩展DirectUI框架的工作,使用DSkinLite也会比較快。
  3. 项目风险小,投入少

    因为一个完整的DirectUI库相当于一个新的GUI Framework框架,这样DirectUI界面库本身在架构设计,程序代码质量等方面会给项目带来新的风险。同一时候须要对项目添加对应的界面开发者,用以维护DirectUI界面库产品。而基于Win32控件的DSkinLite界面库没有方面的问题。

Direct UI的更多相关文章

  1. [置顶] Direct UI

    有个坑爹的说法:其实Direct UI只是一个思想,要实现这个思想,还要靠自己. 采用windowless方式用api或gdi实现ui的绘制. DirectUI意为直接在父窗口上绘图(Paint on ...

  2. Direct UI 思想阐述(好多相关文章)

    在界面开发中,目前DirectUI是个热门的技术名称,因为众多的知名公司都是用DirectUI方式作出了很炫丽的界面.而对于大多数熟悉Win32控件,熟悉MFC开发的开发人员来说,我们应该做何选择? ...

  3. c++ ui 库

    Dulib 比较流行的direct ui 界面框架 UIStone 据说金山词霸用着,查询资料甚少 DirectUI qq使用了据说,多学习学习吧 基于directUI的dulib不错 c盘没空间,运 ...

  4. windows原生开发之界面疑云

        windows桌面开发,界面始终是最大的困惑.我们对前端工具的要求,其实只有窗体设计器.消息映射,过分点的话自适应屏幕.模型绑定.能够免于手工书写,其实这个问题并不复杂,但VS不实现.QT语法 ...

  5. FireMonkey 平台初探

    最为第一个本地化跨平台的框架:FireMonkey需要处理以及融合不同平台的技术非常之多,所以目前的测试仅仅在于表面现象,至于效率问题还不得而知. 从一个程序员的角度来看这个框架,我觉得有以下这些方面 ...

  6. windowsUI的总结

    1,MFC 基于VC6.0的微软基础库 2,WPF 做绚丽界面一律用WPF,做一般绚丽界面用WinForm,做windows标准界面用MFC WPF也有个致命缺点,就是要.net framework支 ...

  7. 网易云音乐 歌词制作软件 BesLyric

    导读 哈哈,喜欢网易云音乐,又愁于制作歌词的童鞋有福啦! BesLyric 为你排忧解难! 上个周末在用网易云音乐听歌,发现一些喜欢的歌还没有滚动歌词,然而网易云音乐还没有自带的歌词编辑功能,要制作歌 ...

  8. 网易云音乐 歌词制作软件 BesLyric (最新版本下载)

    导读 BesLyric , 一款专门制作 网易云音乐 LRC 滚动歌词的软件! 搜索.下载.制作 歌词更方便! 哈哈,喜欢网易云音乐,又愁于制作歌词的童鞋有福啦!Beslyric 为你排忧解难! 本文 ...

  9. GUI相关学习资料

    分类 1,基于OS,包括windows,linux,android,ios 2,基于语言,包括c++,java,c#,javacript 3,按照技术分类,这个其实和os,编程语言分不开,大概可以分为 ...

随机推荐

  1. 全陷阱破解:在Linux环境下的Jenkins中持续集成Androidproject

    本方案以 RHEL / Centos 64位Linux操作系统为例,由于这是眼下最常见的server环境. 一.安装Java SDK. 建议,不要使用诸如yum之类的玩意自己主动安装,由于openJD ...

  2. 复合文档的二进制存储格式研究[ole存储结构](word,xls,ppt...)[转]

    复合文档文件格式研究   前 言 复合文档(Compound Document) 是一种不仅包含文本而且包括图形.电子表格数据.声音.视频图象以及其它信息的文档.可以把复合文档想象成一个所有者,它装着 ...

  3. 添加Main-Class到manifest中

    Maven默认打包生成的jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中(打开jar文件中的META-INF/MANIFEST.MF文件,将无法看到Main-Clas ...

  4. 使用 Spring RestTemplate 调用 rest 服务时自定义请求头(custom HTTP headers)

    在 Spring 3.0 中可以通过  HttpEntity 对象自定义请求头信息,如: private static final String APPLICATION_PDF = "app ...

  5. Hadoop自定义Counter

    1.通过enum自定义Counter public static num LOG_PROCESSOR_COUNTER { BAD_RECORDS }; 2.在Mapper或者Reducer中操作Cou ...

  6. C++基础学习笔记----第四课(函数的重载、C和C++的相互调用)

    本节主要讲了函数重载的主要概念以及使用方法,还有C和C++的相互调用的准则和具体的工程中的使用技巧. 函数重载 1.基本概念 函数重载就是用同一个函数名来定义不同的函数.使用不同的函数参数来搭配同一个 ...

  7. axure网格设置

    Axure默认的界面是没有吧网格显示出来,没有网格在制作原型的时候,对齐方面不是很好,个人习惯还是把网格显示出来,便于组件对齐和布局. 其实本来这篇文章应该叫做网格与参考线,只是本人对参考线的应用还很 ...

  8. Tomcat 乱码设置

    如果表单是以get方式提交就会出现中文乱码这时可以在tomcat中配置解决中文乱码问题. 方法如下:在tomcat的conf文件夹下的conf中找到server.xml文件 找到 Connector ...

  9. spring Jdbc自己主动获取主键。

    学习了下springjdbc,感觉挺有用的,相对来说springjdbc 扩展性相当好了 package com.power.dao; import java.lang.reflect.Paramet ...

  10. .atitit.web 推送实现解决方式集合(3)----dwr3 Reverse Ajax

    .atitit.web 推送实现解决方式集合(3)----dwr3 Reverse Ajax 1. 原理实现 1 2. Page  添加配置.添加回调函数dwr.engine.setActiveRev ...