DirectUI相关文章(三)-DirectUI 设计思路分析

来源:互联网 发布:电厂环保怎样数据作假 编辑:程序博客网 时间:2024/06/06 00:17

 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中画好自己的东西就可以了。
大致就是这样,虽然是很炫的玩意,但还是基于原来的技术的。

原创粉丝点击