转自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。

【转】使用DirectUI技术实现QQ界面的更多相关文章

  1. Vue3.0网页版聊天|Vue3.x+ElementPlus仿微信/QQ界面|vue3聊天实例

    一.项目简介 基于vue3.x+vuex+vue-router+element-plus+v3layer+v3scroll等技术构建的仿微信web桌面端聊天实战项目Vue3-Webchat.基本上实现 ...

  2. swift:用UITabBarController、UINavigationController、模态窗口简单的搭建一个QQ界面

    搭建一个QQ界面其实是一个很简单的实现,需要几种切换视图的控制器组合一起使用,即导航控制器.标签栏控制器.模态窗口.其中,将标签栏控制器设置为window的rootViewController,因为Q ...

  3. Qt实现QQ界面

    1.Qt实现QQ界面是通过QToolBox类来实现的,基本结构是:QToolBox里面装QGroupBox,然后QGroupBox里面装QToolButton,设置好相关属性即可 2.定义类继承QTo ...

  4. WPF系列教程——(一)仿TIM QQ界面 - 简书

    原文:WPF系列教程--(一)仿TIM QQ界面 - 简书 TIM QQ 我们先来看一下TIM QQ长什么样,整体可以将界面分为三个部分 TIM QQ 1. 准备 阅读本文假设你已经有XAML布局的基 ...

  5. iOS 实现QQ界面

    应师傅要求编写个QQ界面来不吝赐教下我的代码问题. 编写个QQ界面.有三个组,每一个组有人.并显示在线不在线. 先看一下效果图 这里省了事由于我的图片仅仅用了一张.假设要依据人的不同设置,仅仅要在ce ...

  6. 使用WPF技术模拟手机界面

    原文:使用WPF技术模拟手机界面 1. 前言 WPF(Windows Presentation Foundation),即"Windows呈现基础",它的目的非常明确,就是用来把数 ...

  7. 循序渐进实现仿QQ界面(一):园角矩形与双缓冲贴图窗口

    印象里仿QQ界面的程序应该有很多,搜了一下,虽然出来一大堆,排除了重复的,却只有两三个,没我想象的好.经常看到CSDN上有人问,QQ这个功能怎么实现,那个界面怎么实现,归纳了一下,决定写这么一个仿QQ ...

  8. 循序渐进实现仿QQ界面(三):界面调色与控件自绘

    本篇讲述如何进行界面调色.界面调色一般有两种方法,调色板和HSL色彩变换.调色板局限于256色,这里不采用,因此用HSL色彩变换实现.首先要了解一下什么是HSL色彩空间,完整且详尽的知识请到维基百科去 ...

  9. 程序员的出路在哪里?挣钱的机会来了续-福利来了,仿QQ界面,放出全部源码,打造创业框架及实现思路

    上一篇:程序员的出路在哪里?挣钱的机会来了!, 原来搞技术,挣钱,不一定非得要多高精尖,有时候抓住小白用户,解决他们一个很小但是很常用的功能,也是一条很好的出路. 其实很多软件产品,要实现出来没有你想 ...

随机推荐

  1. Memory Limits for Windows and Windows Server Releases

    来源:https://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx Limits on memory ...

  2. H264帧内预测模式编号的编码过程

    1 本文词汇约定 宏块:H264编码基本单元,16x16像素(或采样)构成 块:   由8x8像素(或采样)构成的单位 子块:   由4x4像素(或采样)构成的单位 2 帧内亮度预测模式 H264规范 ...

  3. List集合分页显示

    package com.mshc.util; import java.util.Arrays; import java.util.Collections; import java.util.List; ...

  4. MyBatis-防止Sql注入以及sql中#{}与${}取参数的区别

    #{}能够更安全的取出参数 ${}取出的参数不安全 尽量不要使用${}取参数 原因: A:select * from table where a = '10001' and b = ${paramet ...

  5. kinect2 body joints 的25个点

    JointType_SpineBase    = 0,        JointType_SpineMid    = 1,        JointType_Neck    = 2,        J ...

  6. Go-利用Map实现类似Python的Set数据结构

    该笔记参考<Go并发编程实战> 首先实现一个自定义的HashSet 利用interface{}作为键,布尔型作为值. package main import ( "bytes&q ...

  7. HDU - 3966 Aragorn's Story(树链剖分入门+线段树)

    HDU - 3966 Aragorn's Story Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

  8. ensp实战之防火墙安全转发策略

    本次实验用防火墙是USG6000V,拓扑图如下: 步骤一: 按上面配好PC1.2.3以及WWW服务器的IP地址.子网掩码以及网关: 步骤二: 进入防火墙的CLI命令模式下,按一下命令配置: 配置各个接 ...

  9. Java线程的几种状态

    一. 线程状态类型1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运 ...

  10. BOS物流管理系统-第五天

    BOS物流管理系统-第五天-定区管理-WebServcie远程调用 主要内容: 分区设置-导出(分区条件查询后的结果导出为Excel-POI生成Excel和文件下载) 定区管理---定区添加(定区关联 ...