exciting

只用一样东西,不明白他的道理,实在不高明

导航

转: 关于UI开发(总结一些技术和一些论坛牛人讨论)

1MFC

基于VC6.0的微软基础库

2WPF

做绚丽界面一律用WPF,做一般绚丽界面用WinForm,做windows标准界面用MFC 

WPF也有个致命缺点,就是要.net framework支持 

3DirectUI

Windowsless或者Handleless,也就是无句柄窗口

4,迅雷界面引擎

http://xldoc.xl7.xunlei.com/ 

迅雷7应用开发在线文档

Thunder7

XAP

界面引擎

迅雷下载开放引擎

迅雷基础库

5,网上讨论

///////////////////////////////////////////////////

(1)windowless或者称handleless,也就是无句柄窗口,在设计和实现的时候,每个控件都自己实现,最后画到父窗口中。另一个伪windowless是用标准mfc控件,然后通过hook或其它远程线程注入等技术,让spy++等软件,看不到窗口句柄。这主要是为了防止盗号木马通过edit窗口句柄,盗取用户名和密码。 

(2)windowless 或 handleless 或 DirectUI 技术,将首选 WGI !WGI 后生可畏,将是永远的经典! http://code.google.com/p/oic-wgi/downloads/list 基于C语言

(3)qq和msn都是windowless方式 

(4)windowless技术并不是适用所有的软件界面。这一点还需要开发者自已分清楚。

就目前来讲windowless比较适用于基于对话框的应用程序。 

(5)DirectUI是目前windows平台上最流行的一种无窗口界面技术
显然是最不流行的技术,使用无句柄方式的软件,只是凤毛麟角。
所有控件都是虚拟控件没有实际窗口,因此效率更高,更安全。
这个有什么必然联系吗?为什么效率会高呢?安全性更是无从谈起呀。用windowless就安全?

国内流行的QQ/MSN/迅雷等都采用此种技术
这个说对了。但是,msn虽然没有窗口句柄,但是有另一种句柄,为此,软件还做了类似spy++的工具来获得这个句柄 

(6)界面开发主要解决的问题是:如何把美工的创意,更方便的用代码实现。或者,界面开发技术限制了哪些美术创意的实现? 

(7)感觉windowless,DirectUI这种技术,只有这种大公司才有能力搞。
听说QQ 搞这个东西都搞了快5年了,开发投入超千万。

感觉这种东西要做出通用的太难了
你看QQ的所有软件,也不是所有的软件都是这种windowless的。
微软的就不用说了,在msn,xp里面有些部分应用。

我猜测他们做的这个东西,虽然可以用了,但内部没有全部推广使用。原因可能是还不够通用,还不够成熟。

(8)微软是因为内部太多界面库了。各个部门各用各的。

QQ这种,纯粹是为了自己产品服务的,人家也不会卖自己的库,所以不需要通用。自已的产品需要什么控件,就往库里开发什么控件。 

(9)windowless作为一种新的界面技术,当然要重新实现Win32界面原来的提供的机制了,
窗口的剪裁、激活、绘制、消息循环,每一个新的界面机制都要自己实现这些东西的,
这怎么算致命的缺点呢?

我个人还是很喜欢windowless的界面机制的,非常自由,开发者可以天马行空的实现自己的想法创意,
传统的win32架构界面开发总有种带着镣铐跳舞的感觉。 

(10)windowless可以增加破解外挂的难度,也就是增加了破解的门槛,不是随便会弄个对话框程序就可以破解,但还是不能根本解决问题,QQ登录密码,一样可以拿到。 

(11)wpf慢死你~学那么多技术干嘛,学好win32就可以了。wpf过几年没了,就出来了fpw了 

(12)从CWnd直接派生,也可以天马行空的实现自己的想法创意。并且在实现创意是,不用考虑另人头痛的剪裁、焦点、消息循环等等与界面不相关的东东。 

(13)wpf与我讨论的windowless不是一个概念。
我说的windowless,是指咱们普通人或一般公司开发的。wpf也是windowless,当然不致命,也不是缺点了。并且大部分界面编程的人,都应该学学的。你学习一个小公司内部的windowless产品,说句不好听的,跳槽也不好找工作,当然,如果你是这个windowless产品的设计者,那你还是很吃香的。wpf虽然已经诞生很多年了,但国内到现在依然没有普及,那是因为xp现在还占据大部分人的桌面,学习wpf,会有更多工作机会。我考查了部分windowless产品,包括号称轻量化wpf的windowless的产品,离wpf相去甚远,wpf中的数据绑定、布局、资源、事件、动画、3D等等核心或非核心技术,统统没有。 

(14)其实楼主说了这么多,无非就是一点:“windows做完这一整套东西已经是相当大的工作量,大家再重新开发完全得不偿失而且难以达到Windows gui的稳定性”。
  但在看来,Windows那套框架由于开发的年代太久,很多概念太落后了。各种元素的复用性太差。这点和swing对比就知道。所以自己开发Windowless的好处就是锻炼自己的构架能力。
  不过我还是比较同意楼主的观点。要想写成Windows那么稳定的gui,要相当大的耐心和工作量。
  而楼主赞同wpf,我不敢苟同,具体可见:http://topic.csdn.net/u/20110125/14/4702420d-8d03-46cb-99a7-8001771e2127.html?62503  
里面有段话很经典:“第五个问题是慢,惊人的慢。大家可以看看“飞信”,这是一个微软控主导决策的,嗯,使用.net 2.0。为了解决程序发布的问题,专门弄了个微型的.net框架,但是你将它与QQ比,是不是觉得慢得太多?持续多年以后,移动的先生们不耐烦了,才有的现在的基于C++的原生版本,请比较一下速度。这里特别提醒一下,飞信的开发,是中国移动投入巨资、得到微软中国整个团队无微不至的支持的,这些高人甚至赤膊上阵亲自动手,这样使用他们的开发工具,历时数年也不过是做出一个被淘汰的产品。先生,请掂量一下,你比他们这些家伙更厉害吗?你比孩子的母亲对孩子更了解吗?” 

(15)如果需要文档/视图的话,还是用mfc好了,现在mfc很漂亮了,像office2007。
vs2010貌似wpf做的,恩 确实佩服。
不知道office2010是怎么做的。

紧跟大公司新技术吧,要不就找个认为设计的好的开源项目,一直用、一直改。不过跟着大公司走还是最好的选择吧 

(16)丢一个这东西出来好了。
http://www.viksoe.dk/code/windowless1.htm
虽然这东西的模型设计的我不太喜欢,不过绝对是学习的好材料。而且本身也非常美观,这是gdi做的windowsless。 

(17)我其实把mfc和windowless都归到win32技术体系的,实现上windowless也是用mfc开发,只不过不使用它默认的CButton等这些控件,仍然使用GDI或GDI+等技术来绘制。正如你说的,这个体系有点久远,所以微软设计了wpf,来逐步代替win32。到目前为止wpf还是不成功的。但我坚信,迟早一天会成功的。wpf开发的产品,体积又大,运行速度又慢,是制约它发展的最大瓶颈。不过vs2010采用wpf开发后,发现,像vs2010这么大规则的项目,其实运行速度已经很快了,不比vs2008差多少。或许microsoft做过优化? 

(18)到讨论成这样了,那gtk,qt这类的怎么活啊.

我也抛一个出来,娱乐一下
Nana C++ Library
http://stdex.sourceforge.net 

(19)嘿嘿, 我喜欢GTK。 见到看到一篇文:Qt vs GTK

另外, VS2010中,MFC已经做了大量的扩充,可以做出漂亮的界面的 

(20)如果非要用Direct UI做项目,从研发成本考虑,还不如直接花钱买一套UI库,我看这个公司的就不错:http://www.directui.com/,所有的控件全部用接口的形式访问。 

(21)对微软来说,做一个NATIVE-WPF易如反掌。蒋晟大大也说过,微软内部也讨论过这个问题,不过最终放弃了。这个可以理解,WPF是.NET的杀手锏,如果把这个杀手锏转交给非托管语言,对.NET战略是致命的。我还真想知道,如果没有WPF,还有多少人会选择.NET。讨论这个没有意义。

还是回到windowless吧。近几年很多人关注DirectUI/Windowless,却不知DirectUI为何物。我曾经在某个帖子里面做过比喻:DirectUI = Window + Windowless,所有在屏幕上显示的东西都是DirectUI方式,3D是,浏览器是,连普通窗口也是,大家都在显存的同一块区域显示所有内容,哪里分什么有窗口无窗口。为什么要把窗口分成有句柄和无句柄呢?因为微软的有句柄窗口是工业标准,操作方式有章可循,窗口API大家耳熟能详,家家户户都用没有锁的门窗,所有人都知道该怎么操作窗口,偷鸡摸狗的人当然也知道,所以第一个问题就是标准带来了更高的安全风险,于是乎很多人开始希望在自家门窗上加一把锁,而且只有自己有钥匙。最早加锁的人还是微软自己,MSN要保护用户隐私,搞了个DirectUIHWND,被人发现后,DirectUI这个名称就逐渐扩散开来,也有越来越多的软件给自己的窗口加了锁。从这个时候起,DirectUI = Windowless,就是为了跟不安全的有句柄窗口区别开来。DirectUI 的另一层含义就是隐秘、非标准,这个概念会在用户心里生根,一旦有哪家的所谓 DirectUI 窗口因为流行而不幸成为另一个标准,它绝对会被人们踢出 DirectUI 阵营,结局跟有句柄窗口没什么两样,就因为太标准而失去了隐秘的特性。也正是因为隐秘、非标准的特性,多少人削尖脑袋想找到 DirectUI 框架、类库、标准,结果是找不到的,因为没有标准。反过来说,只要不是标准的,都可以叫做 DirectUI,人人都可以自夸我的窗口是 DirectUI,其实不用夸,本来就是,夸多了会误导更多人。

当然,Windowless 不仅仅是为了安全,在能力上自然也有自己的过人之处,这些能力就交给楼主来总结吧,我只举个最小的例子:如果想让一个窗口的某个子控件藏在背景贴图的后面,普通窗口是办不到的,对Windowless来说轻而易举。 

(22)你忽视了handless一个最大的好处,就是无闪烁绘图,使用思想老旧的win32控件是很难做到毫无闪烁的。

p.s 现在腾讯全系列产品都是DirectUI。可以看到,它所有窗口的类名是TXGuiFoundation,它的目的很明显就是想成为腾讯的MFC(Microsoft Foundation Classes)。 

(23)duilib 库不错,是开源的。。现在正在发展。希望各位可以参与
www.duilib.org 

(24)这个和闪烁没有任何关系。win32方式,可以做的一点闪烁也没有。windowless,如果做不好,也是非常闪的。另外,所我了解,DirectUI是有copyright的,是个公司的产品名,不能随便叫。

腾讯公司使用这种无窗口方式,一是为了防止第三方外挂。人家自己开发自己用,当然一点问题没有。某个人离职了,还会有新来的人开发,不用担心出了问题没人管。 

(25)楼主洋洋洒洒写了这么多,从你列举的诸多缺点里面我可以看出你的水平,你最多只是了解一些MFC,你可知除了MFC框架还有很多,而且更加优秀。
其他的不讨论,我就把你所说的缺点一条一条的给你反驳吧

1:无窗口句柄只是内部的显示控件没有句柄,对这些控件的显示与否完全可以通过 一个Show方法重新进行封装,而且可控性更强
  每个控件也同样有自己的坐标属性,比如Top,Left 来进行移动!

2:消息从来没有作废,每个控件也同样有自己的消息处理函数,只是我们在窗体消息循环里面把需要的消息派发给这些自定义控件就可以了

关于以上两点你可以了解一下VCL,可以说用Delphi随便拖几个控件(从TGraphicControl继承)上去就是一个 Windowless界面了。有时你甚至感觉不出来
这些TGraphicControl控件和不同的标准控件有什么不同。

3:如果你的程序写好了,更换界面需要花费的时间比开发时间还长,只能说这个软件架构就是一坨屎!连最简单的逻辑和界面分离都没有把握好?

4:你用过别人开发的windowless控件吗? 学习更多地东西会影响你的职业生涯吗?  

5:软件的稳定和可靠性完全不是界面的事! 你还是先分清界面和逻辑功能的不同吧。

6:还是架构问题!功能层代码应该完全和界面分离,如果你采用发送消息就已经是把功能和界面绑死了! 为什么不把界面设计成实现一个接口,比如有Update()
  方法,不管界面采用何种方式,只要实现了接口中的Update方法就可以了。  

7:这些都有成熟的机制,裁剪和坐标变化就两个函数,绘制如果想要漂亮的界面不管你采用什么方法,都要绘制的。

8: 按你这条的意思在C#,JAVA刚出来的时候我也可以这样说:全球几乎所有的软件都是使用C,C++开发的.......。
  Windowless也是一种思想,wpf只不过是这种思想的一种实现罢了。

9:后期汉化..对这条:配置文件!你不是用过ini,xml吗? 对多语言的支持不仅仅是翻译一下,界面也要进行调节,
  你就是采用标准的win32控件不也要配置? 后面的运行去其他程序发来的标准消息,这个需求我不懂什么时候要用到: 给木马病毒留的后门?

10:这条才是你真是水平! 文档/视图不是MFC的专利,这是一种架构思想,如果脱离了MFC就不能使用文档/视图架构只能说
  你就是一个填代码的苦力。 那我又问你: 你们项目采用Wpf,里面也没有文档/视图架构啊! 你不快终结项目,继续MFC。。。

 你眼中这些技术仅仅是表面的技术,完全没有看到各种架构,各种设计的本质思想,所以你不会熟练运用它们,最后只会调用现成的方法!
 我最后总结:你仅仅是弄了几年界面,抢了美工的活! 

///////////////////////////////////////////////////

(1)DirectUI是一种技术简称,也叫windowless,不要被忽悠了。
国内做DirectUI的公司很多,有bodsoft,uieasy,uipower。
还有开源的duilib,那个uipower只是占了个directui的域名而已。

建议考虑迅雷7的界面引擎,目前已经开放了,都可以用。
文档各方面会不断完善,有兴趣可加QQ群:62552336
http://xldoc.xl7.xunlei.com/0000000018/index.html 

(2)迅雷7用DirectUI做出的效果就很漂亮。 

(3)如果大家有兴趣,可以看看SKINSE界面库。至于SKINSE到底怎么用?我相信下载看过的人会明白!!!
http://www.skinse.com/ 

(4)DirectUI做出的界面效果还可以,不过自身也要有过硬的技术做基础。
楼主可以借鉴一下qq的界面,貌似qq从2007开始就一直在用DirectUI做界面。不过真实性无从考证。 

(5)虽然DirectUI开发界面的效果不错,但是目前国内用DirectUI和懂DirectUI的人并不多。 

(6)如果MFC足够好用,可能会有那么多UI库吗?说句不好听的,如果不是VC捆绑MFC,还会有多少人用不伦不类的垃圾MFC! 

///////////////////////////////////////////////////

(1)今年开始玩DirectUI,参考老外的程序,写了个DirectUI的Demo, 支持各种Layout,实现了各种基本控件(SplitBar, PictureBox, Button, Radio, CheckBox, Label, HyperLink, ProgressBar, trackBar, ListBox, Edit, ComboBox, Tab Control, Toolbar, Menu, tree),支持键盘导航,支持Tooltip,支持多语言,支持换肤,支持异形窗口,支持插件2次开发,支持Alpha通道,支持各种图像处理。

然后最近开始学WPF,学后自己的程序就不想再写了,感觉再写基于GDI的DirectUI已经没多少意义,基本上QQ的UI已是基于GDI的DirectUI的极致了。

感觉理想的DirectUI设计上可以仿WPF,底层Render方式可以切换(Direct3D, OpenGL, GDI), 支持脚本,并且跨平台,应用程序和游戏都可以用,现在我还没找到这么一套东西,不知大家对DirectUI怎么看?

Demo下载:http://download.csdn.net/detail/weiym/3698407 

(2)要是支持那么多功能话,那得多大,这种界面库以尽量轻量级比较好,否则和WPF又有什么区别呢。
你要想那样的话,干脆直接界面用WPF或SilverLight吧,跨平台也支持硬件加速,支持XAML、CSS什么的…… 

(3)这样的东西不一定大的,比如Render方式是可插拔的,根据不同的情况加载不同Render Engine就好了。
脚本支持一般是JavaScript,也是插件的方式,可以打开或关闭,可以考虑用Chrome的V8或是SpiderMonkey, Windows平台上也可以直接用MS IActiveScript.
跨平台很重要,可以在嵌入式里使用,所以Render一般可以用OpenGL,这样MAC什么的都支持。

虽说工程比较庞大,编译出的东西其实不一定大的。就像WPF,如果脱离.Net,其实也就几个DLL。 

(4)WPF和DirectUI确实如出一辙啊!:区别也有些:
就是DirectUI可以是GDI的,也可以是GDI+的。 而WPF本质是GDI+的【底层可能也用到硬件加速】,

另外不同的是WPF的抽象更好,而且WPF/Silverlight更为轻量【当然了,排除掉.Net的部署的考虑】

大多数C++的DirectUI停留在XML配置静态UI,然后C++来实现后台逻辑。
而WPF更近一步,XAML除了配置UI,也可以指定一定的动画。

大多数的C++的一个Xml就是一个完整的UI,不能嵌套,缺乏重用性。
而WPF的XAML可以有更好的模块化,可以通过网络Laz-Loading。
----------------------------------------------------------------------------------------

当然了。。。真正写软件的时候,WPF就靠边站了。。。
QQ是C++DirectUI的,360安全桌面,软件管家是C++DirectUI的,金山很多产品也是C++DirectUI的【而且开源了,有人把它的UI抽出来了】

Qt的QML本质也算是C++DirectUI的。

但是问题是现在C++DirectUI的方式会越来越少了。。。
------------------------------------------------------------------------------------------

Win8会更多支持HTML5,估计WPF也会被支持的很好。
iOS/MAC OS X人家无所谓,UI总是那么简单弱智,没有什么换肤的需求【我很少看到哪个Mac的程序还支持换肤,而且Mac的程序感觉UI都很简单。】 

-------------------------------------------------------------------------------
我自己也在做DirectUI,是基于WTL的,而不是基于MFC的。感觉WTL的消息映射宏很帅! 

(5)目前开源的duilib就支持动态添加控件啊,插入一段Xml控件描述即可生成相应控件,绝不是静态UI
基于gdi的directUI更适合移植 

(6)讨论DirectUI已经没有意思了,这个玩意儿已经被炒烂了,自绘而已,加上一点消息处理,没东西了。

XML描述UI更是噱头,一种配置格式而已,跟INI、对话框模板没有本质区别。再高级再动态的XML描述也摆脱不了需要指定控件位置大小的局限。唯一不需指定控件位置且全自动布局的只有HTML。

脚本就不要强求了,只是一个更具灵活性的扩展方式而已。如果在体系结构上不能整理出完整统一的对象模型,还不如不要脚本,要不然脚本编写者会不停抱怨这个功能没有、那个功能没有,底层更新代码都得累死。

硬件加速的渲染,如果没有足够的积累,还是不要轻易去碰,这是找罪受,不光是门槛太高的原因,个中滋味自己试试就知道了。这句是我最大的忠告。

动画,有一点点就可以了,没有太呆板,多了伤眼睛,我现在很烦浏览器中铺天盖地的FLASH动画。这是UI和游戏的最大区别,游戏没动画就没法玩了。好在动画门槛不高,搞点小特效还算比较容易。做个通用动画也不算太难,WPF中的通用动画技术还是很值得借鉴的,因为人家总结得非常好。

跨平台,见仁见智吧,我觉得自己没有多少发言权。定好目标客户再决定要不要跨平台。跨平台的难度不在于多平台编码经验,而是设计水平。

一家之言,我也是搞UI库的,上面的所有技术我都尝试过。不过可惜,没定好用户群,有严重的方向性错误。 

(7)网上有开原的DUILib,核心的消息分发代码是类似的,你可以直接参考他的学习。 

(8)现在看来WPF是最优秀的DirectUI, 他底层应该是基于D3D的。
配置的XML能处理一些简单的逻辑和动画配置,都是不是太难。
QT没怎么用过,个人觉得它在Windows上的跨平台应该还是基于窗口的。
C++方式的DirectUI,个人觉得在嵌入式应该有广泛应用,在Windows上的话界面和性能要求都比较高的时候还是有竞争力的,当然前提是这套DirectUI基于D3D。 

(9)多谢忠告,个人觉得跨平台是DirectUI的优势,在windows和Mac上它或许没多少竞争优势,但是在嵌入式和手机平台开发上,DirectUI还是很有价值的。另外WPF的设计思想对于设计一套优秀的DirectUI Library 还是很有借鉴意义的。 

(10)你说得对,3D的玩意儿在嵌入式可能更有市场,这也是我努力的目标。为嵌入式设备定制大量的3D特效,也不需要为PC的那些懒用户制作UI设计器了,在桌面市场做3D-UI感觉有点吃力不讨好。 

(11)我在WinCE中使用DirectUI, PC机下确实意义不大,嵌入式的却比较好. 

(12)界面的核心永远在于布局,审美,而不在于技术,DUI已经没嚼头了。

posted on 2012-06-27 18:50  excitingcoder  阅读(5180)  评论(1编辑  收藏  举报