这两天在网上闲逛,发现了这个东西,觉得很有趣,认真的搜了几下,呵,没想到,世界已经这么精彩,CSDN上的文章有很多了,搜到的搜不到的,从目前学习得经验看,其实就是为了更好的控制界面,直接操作绘图DC,甚至直接操作显卡的绘图动作,然后用XML文件来配置相对应的数据位置。
据说人们发现这个东西是因为用SPY++查看MSN发现一些窗口没有句柄(不要告诉我你不知道WIN下窗口和句柄你不知道哦),后来很多国产软件象QQ啥滴也纷纷举起这个大旗,这个东西谈不上技术多么先进,只是现在应用的面儿广了起来,所以大家觉得不错了,我觉得有点儿象AJAX技术,别人用得好了,然后大家都看着眼红,于是一窝蜂的冲了上去。不过话说回来,这东西在游戏方面还是应用的很广泛的,应用到具体的若用上层应用软件倒不是很多,毕竟人们习惯了WIN下的控件编程,特别是一些强大的IDE,让后来编程的人们基本丧失了手动绘制界面的能力。这也是我劝后来的人们多向嵌入式发展的一些原因,在嵌入式上,还保存着大量的类似于早期PC编程的技术,象这个所谓的DirectUI技术,在嵌入式里不仍然是这么写么,特别是在单片和ARM9以下的ARM处理器上,由于只能使用简单操作系统,UI都得自己画,虽然不能说是一回事儿,但原理是一样的,直接操作绘制,不借助于外来的库或通信机制。
微软有个DirectUI库,大家如果喜欢可以从http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.automationelementinforma
转一个别人的这方面的帖子:
DirectUI最早见到时是拿spy++照microsoft的msn发现的,有人在论坛上抱怨说软件的mfc自己人都不用,其中就有举例说msn得directUI结构。其实我倒觉得,各有各的长处,directUI的设计初衷是去除窗口的概念,所有的元素都是逻辑上的窗口,而不是真正意义上有句柄的窗口。即这些元素都是直接在"父窗口"中绘制并响应事件。
这个也不是什么新的思路,VCL中早就有这种实现,VCL的TControl和从TControl继承的类都可以响应事件,而从TControl继承的可以是无句柄的组件。所以看看VCL的设计,就大概知道一个无句柄的DirectUI该什么设计了。所有的大型网游客户端基本上都是DirectUI的方式来创建的,所不同的是,普通的应用程序的DirectUI方式界面库中如Edit,ComboBox,ListCtrl等复杂控件还是使用win32控件来创建的,其虚拟的只是Static,Button,progressBar等控件。而一些大型的游戏客户端可能这些元素可能也是自己处理。
说说directUI的好处,没了句柄和窗口的概念,首先得一个好处是要做一些好的界面效果变得更加容易。举例来说在有窗口句柄时要实现Static,Button等控件是见麻烦的事,Static还好说,win32有WM_CTRLCOLOR消息支持,可以做透明,Button或者别的控件就麻烦了,需要采用发消息给父窗口,让父窗口在子窗口的DC上先绘制,然后子窗口再绘制自己的TEXT。而在DirectUI下,这种效果简直太简单了,子元素只绘制自己的Text,那就是透明效果。这中情况下,很容易做出带底纹的,比较炫一些的界面。
另一个好处就是一些效率问题,现在我们实际上处理的界面只有父窗口,如果我们实现皮肤换色,换肤等效果,效率要提高许多。实际上我们处理的界面或者说DC要少了很多,这样效率或者逻辑应该就相对简单了,同时对系统资源的占用也少了很多。
Q: 对于使用DirectUI的窗口,如何去找到他的“子窗口”的位置和其他“属性”(如果有的话)?
A:是这样的,位置在DirectUI里肯定是一个区分消息分配的重要条件,但不是唯一条件。一般实现DirectUI的库里面都会采用配置文件或者XML来描述界面,这样程序在加载的时候实际上就已经得到了一个所有控件位置的表,而DirectUI中控件的属性肯定是自己根据需要来定义的,比如left,top,width,height,是否透明等。还是需要有个对象如DirectUIButton来和这个虚拟的对象绑定的。
具体可以参考下现在QQ的版本,QQ的主窗体实现是一个DirectUI的方式,在皮肤目录下有个config.xml,还有个脚本文件.vbs的VB脚本。 这方面进来接触了些,有时间可能会做个比较完整的出来。主要就是分割区域然后画了,至于他们怎么知道位置,很简单,里面有对象来处理这些,比如你的鼠标在(x,y)单击了一下,父窗口就会向所有的子对象(内部对象,没有Handle属性)转发这个消息,或者查找位于这个位置的最上层对象,然后转发消息给他,这样就可以做到那个对象响应这个消息了(和Button处理方式一样,只是没有句柄了,也不依赖以Windows来分发消息)。至于WM_Paint消息比较好处理,父窗口先将底色画好,然后就分发这个消息给所有子对象,子对象根据自己记录的位置和范围,在指定的Rect中画好自己的东西就可以了。大致就是这样,虽然是很炫的玩意,但还是基于原来的技术的。
童鞋们,回到现在,所以说,这个东西不是什么新技术,大家要好好滴温习一下功课啦。有时间抽一点儿功夫学习,抽一点儿功夫总结过去,未尝不是一件大益事。
最后,大家可以看一看蒋晟童鞋的BLOG,http://blog.csdn.net/jiangsheng/archive/2010/03/22/5404320.aspx,上面也有较清楚的说明。而且在网上有一个炫彩界面的东西好象也用的这个技术,大家可以一并下对比一下。大家一起学习,一起努力,一起向着更远,更高的方向上前进!生命不息,努力不辍!!!