zoukankan      html  css  js  c++  java
  • 【转】使用DirectUI技术实现QQ界面

    转自http://bbs.csdn.net/topics/350023031

    一.介绍

    DirectUI技术说白了就是XML配置文件+图片+JavaScript控制界面。这点与网页css+图片+JavaScript十分相似,就是如开发网页一般开发桌面程序界面,这个开发效率当然大大的提高。将程序员从繁琐的界面绘制工作中解脱出来,专心开发逻辑代码。还能大大减少代码量,因为据统计,传统MFC程序中,界面代码大约占总代码的1/3强!也就是说,这个1/3的代码都可以由xml+javascript替代!

    同理,如果网页开发时,每个图片都需要由web程序绘制,你能想象一个网页的代码量有多少吗?

    简直不能想象,而传统Window程序就是如此!

    DirectUI技术最早被用于window xp资源管理器左边栏,被称为task folder.而DirectUI被广为国人所知,还得感谢腾讯公司。QQ2009的界面就是使用DirectUI技术开发的。类似的有微软的MSN,OCS和百度Hi。最近的Office2007 Ribbon界面,如果使用Spy++查看,可以见到一个名为"NetUI"的窗口,其实这也是微软内部DirectUI的一个变种。不过无论是微软,腾讯,还是百度,都使用了DirectUI技术来开发自己的软件界面,却不肯将其公开。本文将介绍如何使用DirectUI技术开发一个类似QQ的界面演示程序。

    二.背景

    与DirectUI最相似的要数微软最近推出的WPF,其设计思想是相同的。只不过WPF只能运行于托管环境下。window下的C++程序员一直呼吁微软推出native WPF,也就是非托管的WPF。不过微软给出的答案是:NO。所以WPF将定位于为.NET战略服务。使用WPF开发的界面程序,必须带上庞大的.NET运行环境。不过随着Window 7的普及,这个状况会有所改变(window 7继承了.NET环境)。

    不过,我想,如果许多公司的产品都是需要支持Window XP(最少QQ现在还是支持Window 2000),所以WPF不是桌面应用程序界面开发的首选。

    三.实现

    废话不多说,先看演示程序的图片,足够以假乱真吧?!图片呢?不知道呀,转的时候就没有

    在xml文件中也引入了网页中样式(style)的概念,style控制着网页中一个元素的外观。同理,directui xml文件中的样式(style)控制着一个控件的外观。同样的一个button,使用了不同的style,外观也不一样。如下面的代码及图片所示。

    参照网页开发中的JavaScript,DirectUI JavaScript可以控制控件的状态、文本、显示/隐藏、位置等等属性。DirectUI JavaScript是基于事件,比如在button1点击事件中,改变button2的文本。或者button1点击事件之后,button1就要禁用。像这样的需求,在界面开发中是比较常见的。

    在c++代码中,剩余的只是界面与程序逻辑的借口。比如,QQ2009中从服务器接收添加用户的通知,然后操作界面将此用户显示出来。如此看来,c++代码中完全没有了绘制界面的代码。

    四.后话

    DirectUI是个好技术,只是微软不愿将其公开,其中最大的原因是与它的.NET战略冲突。而由DirectUI技术演变而来的WPF只适用于托管环境。不过,还是有几个公司或者个人开发了自己的DirectUI界面库。我知道的,有:

    DirectUI.com // 公司开发的。居然连试用版也没有,要付了钱才给你用。

    Bodsoft DirectUI // 公司开发的。有试用版。设计工具不是太强大,还凑合。

    UIEasy DirectUI // 个人开发的,比较简单。没设计工具。

    看文章什么的时候一定要看评论哟,,,

    评论什么都是精华

    几乎90%介绍DirectUI的人,都抓不住重点:像界面和逻辑分开、用XML来配置界面,都和DirectUI没有半点关系。
    具体来说:只要界面是用文件来配置,都是界面和逻辑分开,VC的用的是*.rc文件,WPF用的是*.xaml文件、LibUIDK用的是*.ui文件。难道VC的对话框程序就不是界面和逻辑分开吗?难道必须用xml文件吗?
    DirectUI仅仅是又实现了一遍微软已经成熟的控件,这样做有个好处:不受制于微软相关控件的约束。比如要做一个List控件,它的某些Item也需要用List来表达。如果是用CListCtrl,那么有两种办法:在CListCtrl中再创建几个CListCtrl,用来表示Item。但这有些弊端:一个窗口内子窗口的数量有限、使CListCtrl过于庞大,影响性能。还有一种方法就是,自己写一个类似于List的东东,来当作Item。这个实现上就有点接近DirecutUI了。如果自己写的这个List不但可以作为Item,还可以作为父控件,那它就是一个DirecutUI的控件了。
    由于不受限于微软的很多约束,所以自由发挥的余地比较大。但发挥到什么程序,还要看各厂家的实力。所以不是说用DirectUI就一定可以开发QQ、MSN类似的界面,也不是说不用DirectUI就不能开发这样的界面。它们也是没有任何关系的。
    当然,什么东东都是有利有弊的。当你抛弃微软,自己开发控件时,有多大的机率能比微软开发的强?有微软的稳定?有微软的兼容性好?还有一个问题是:由于这些控件都是各厂家自己开发的,那么原来mfc程序员需要对这些新的控件进行重新学习。有多少人愿意学习一种不通用的技术?
    DirectUI还有一个好处:让自己的界面变得不标准。这要带来的直接好处是:增加Hack成本。比如想截获QQ的密码,如果是标准程序,正常情况下,把一个dll注入到QQ进程,然后拿到Edit的窗口句柄,就可以得到*号密码。现在用了DirectUI的edit,那么就没有句柄,也不支持标准CEdit的接口,就不能通过常规方法得到密码。让界面变得不标准,也是有利有弊的。如果自己的软件,希望第三方厂家为自己开发插件,那就最好不要用DirectUI。

  • 相关阅读:
    Codeforces 845E Fire in the City 线段树
    Codeforces 542D Superhero's Job dp (看题解)
    Codeforces 797F Mice and Holes dp
    Codeforces 408D Parcels dp (看题解)
    Codeforces 464D World of Darkraft
    Codeforces 215E Periodical Numbers 容斥原理
    Codeforces 285E Positions in Permutations dp + 容斥原理
    Codeforces 875E Delivery Club dp
    Codeforces 888F Connecting Vertices 区间dp (看题解)
    Codeforces 946F Fibonacci String Subsequences dp (看题解)
  • 原文地址:https://www.cnblogs.com/landv/p/3567609.html
Copyright © 2011-2022 走看看