【转】使用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。
【转】使用DirectUI技术实现QQ界面的更多相关文章
- Vue3.0网页版聊天|Vue3.x+ElementPlus仿微信/QQ界面|vue3聊天实例
一.项目简介 基于vue3.x+vuex+vue-router+element-plus+v3layer+v3scroll等技术构建的仿微信web桌面端聊天实战项目Vue3-Webchat.基本上实现 ...
- swift:用UITabBarController、UINavigationController、模态窗口简单的搭建一个QQ界面
搭建一个QQ界面其实是一个很简单的实现,需要几种切换视图的控制器组合一起使用,即导航控制器.标签栏控制器.模态窗口.其中,将标签栏控制器设置为window的rootViewController,因为Q ...
- Qt实现QQ界面
1.Qt实现QQ界面是通过QToolBox类来实现的,基本结构是:QToolBox里面装QGroupBox,然后QGroupBox里面装QToolButton,设置好相关属性即可 2.定义类继承QTo ...
- WPF系列教程——(一)仿TIM QQ界面 - 简书
原文:WPF系列教程--(一)仿TIM QQ界面 - 简书 TIM QQ 我们先来看一下TIM QQ长什么样,整体可以将界面分为三个部分 TIM QQ 1. 准备 阅读本文假设你已经有XAML布局的基 ...
- iOS 实现QQ界面
应师傅要求编写个QQ界面来不吝赐教下我的代码问题. 编写个QQ界面.有三个组,每一个组有人.并显示在线不在线. 先看一下效果图 这里省了事由于我的图片仅仅用了一张.假设要依据人的不同设置,仅仅要在ce ...
- 使用WPF技术模拟手机界面
原文:使用WPF技术模拟手机界面 1. 前言 WPF(Windows Presentation Foundation),即"Windows呈现基础",它的目的非常明确,就是用来把数 ...
- 循序渐进实现仿QQ界面(一):园角矩形与双缓冲贴图窗口
印象里仿QQ界面的程序应该有很多,搜了一下,虽然出来一大堆,排除了重复的,却只有两三个,没我想象的好.经常看到CSDN上有人问,QQ这个功能怎么实现,那个界面怎么实现,归纳了一下,决定写这么一个仿QQ ...
- 循序渐进实现仿QQ界面(三):界面调色与控件自绘
本篇讲述如何进行界面调色.界面调色一般有两种方法,调色板和HSL色彩变换.调色板局限于256色,这里不采用,因此用HSL色彩变换实现.首先要了解一下什么是HSL色彩空间,完整且详尽的知识请到维基百科去 ...
- 程序员的出路在哪里?挣钱的机会来了续-福利来了,仿QQ界面,放出全部源码,打造创业框架及实现思路
上一篇:程序员的出路在哪里?挣钱的机会来了!, 原来搞技术,挣钱,不一定非得要多高精尖,有时候抓住小白用户,解决他们一个很小但是很常用的功能,也是一条很好的出路. 其实很多软件产品,要实现出来没有你想 ...
随机推荐
- Java特性
1. Java面向对象三大特性 封装: 将客观事物封装成抽象的类,并且可以针对里面的数据和方法提供不同级别的保护. 继承: 可以基于已经存在的类构造一个新类.继承已经存在的类就可以复用这些类的方法和域 ...
- 灾情巡视C语言代码
/*"水灾巡视问题"模拟退火算法.这是一个推销员问题,本题有53个点,所有可能性大约为exp(53),目前没有好方法求出精确解,既然求不出精确解,我们使用模拟退火法求出一个较优解, ...
- 读取Zip文件内容
第一步,上次文件并保存到服务器目录下 /// <summary> /// 上传压缩文件 /// </summary> protected void UploadZip() { ...
- mac 配置快捷键快速锁屏
mac下锁屏方式有很多: 快捷键control+shift+power 在其他中打开钥匙串访问,讲屏幕锁定按钮显示在menu bar中 这两种方法存在弊端: 按三个键去锁定屏幕太费劲,况且让使用外接键 ...
- Android Studio Gradle project refresh failed No such property classpath for class
新建的一个 android 项目居然发现不能运行,gradle 无法启动,奇怪: Gradle 'Meitian' project refresh failed: No such p ...
- noip2015Day2T1-跳石头
题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有N ...
- 第三课3、ROS的launch文件
1.launch 参数说明: pkg为节点的功能包,type为需要运行的那个节点,name为节点的名字,后面的参数可选 举个例子: 在工作空间中新建一个包: 然后再回到工作空间中去编译: 再在包目录下 ...
- Java、C#双语版配套AES加解密示例
这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解 ...
- Sass与Compress实战:第八章
概要:帮助你实现样式表的最佳性能 本章内容: ● 样式表拼接 ● 样式表和资源压缩 ● 减少和并行图片请求的策略 ● 选择器性能和优化策略 1. 测量客户端性能 性能优化的起点和终点都是测量.在第一次 ...
- assign retain copy
举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'装梵几的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一 ...