当前位置: 首页 > news >正文

DirectUI

DirectUI意为直接在父窗口上绘图(Paint on parent dc directly,直接在父窗口设备上下文中绘制)。即子窗口不以窗口句柄的形式创建(windowless,无窗口),只是逻辑上的窗口,绘制在父窗口之上。微软的“DirectUI”技术广泛的应用于Windows XP,Vista,Windows 7,如浏览器左侧的TaskPanel,控制面板导航界面,Media Player播放器,即时通讯工具MSN Messager等。(DC是Device Context的意思)。其实DirectUI实就是为了更好的控制界面,直接操作绘图DC,甚至直接操作显卡的绘图动作,然后XML文件来配置相对应的数据位置

DirectUI简介

DirectUI好处在于可以很方便的构建高效,绚丽的,非常易于扩展的界面。国外如微软,国内如腾讯,百度等公司的客户端产品多采用这种方式来组织界面,从而很好的将界面和逻辑分离,同时易于实现各种超炫的界面效果如换色,换肤,透明等。 DirectUI 旨在满足客户端界面快速开发的需要,同时融入业界前沿的皮肤技术,为用户创建更加高效,专业的界面。

DirectUI使用的是DirectX核心。

DirectUI 主要特性

◆ 支持皮肤对象的布局

◆ 支持皮肤脚本(JavaScript)控制,可以让界面与逻辑彻底分离

◆ 支持bmp、png、jpg、gif、tga等图片格式

◆ 支持多图层Alpha混合特效

◆ 提供界面设计工具DirectUI Builder,支持拖拽式界面设计,让界面开发所见即所得

◆ 开放式开发平台,所有控件均为插件方式管理,支持用户自定义控件开发,与DirectUI平台无缝兼容

◆ 支持Windows平台所有的开发工具(VC++、VB6、VS Net、PowerBuilder、Delphi、C++Builder、E语言)

◆ 支持所有标准控件的换肤

◆ 支持皮肤对象的导出与导入

◆ 支持Windows主题导入,让标准界面皮肤的制作简单快捷

◆ 让客户端代码简洁明了

◆ 支持动画特效,滑动、淡入淡出

directUI的设计初衷是去除窗口的概念,所有的元素都是逻辑上的窗口,而不是真正意义上有句柄的窗口。即这些元素都是直接在"父窗口"中绘制并响应事件。这个也不是什么新的思路,VCL中早就有这种实现,VCLVCL是Visual Component Library的缩写,即可视组件库,是Delphi,C++Builder等编程语言的基本类库。TControl和从TControl继承的类都可以响应事件,而从TControl继承的可以是无句柄的组件。所以看看VCL的设计,就大概知道一个无句柄的DirectUI该什么设计了。 所有的大型网游客户端基本上都是DirectUI的方式来创建的,所不同的是,普通的应用程序的DirectUI方式界面库中如Edit,ComboBox,ListCtrl等复杂控件还是使用win32控件来创建的其虚拟的只是Static,Button,progressBar等控件。而一些大型的游戏客户端可能这些元素可能也是自己处理。
说说directUI的好处,没了句柄和窗口的概念,首先得一个好处是要做一些好的界面效果变得更加容易。举例来说在有窗口句柄时 要实现StaticButton等控件是见麻烦的事,Static还好说,win32WM_CTRLCOLOR消息支持,可以做透明,Button或者别的控件就麻烦了,需要采用发消息给父窗口,让父窗口在子窗口的DC上先绘制,然后子窗口再绘制自己的TEXT。而在DirectUI下,这种效果简直太简单了,子元素只绘制自己的Text,那就是透明效果。这中情况下,很容易做出带底纹的,比较炫一些的界面。另一个好处就是一些效率问题,现在我们实际上处理的界面只有父窗口,如果我们实现皮肤换色,换肤等效果,效率要提高许多。实际上我们处理的界面或者说DC要少了很多,这样效率或者逻辑应该就相对简单了,同时对系统资源的占用也少了很多。

位置在DirectUI里肯定是一个区分消息分配的重要条件,但不是唯一条件一般实现DirectUI的库里面都会采用配置文件或者XML来描述界面,这样程序在加载的时候实际上就已经得到了一个所有控件位置的表,而DirectUI中控件的属性肯定是自己根据需要来定义的,比如lefttopwidthheight,是否透明等。还是需要有个对象如DirectUIButton来和这个虚拟的对象绑定的。 具体的你可以参考下现在QQ的版本,QQ的主窗体实现是一个DirectUI的方式,在皮肤目录下有个config.xml,还有个脚本文件.vbs VB脚本。
这方面进来接触了些,有时间可能会做个比较完整的出来。 主要就是分割区域然后画了,至于他们怎么知道位置,很简单,里面有对象来处理这些,比如你的鼠标在(x,y)单击了一下,父窗口就会向所有的子对象(内部对象,没有Handle属性)转发这个消息,或者查找位于这个位置的最上层对象,然后转发消息给他,这样就可以做到那个对象响应这个消息了(和Button处理方式一样,只是没有句柄了,也不依赖以Windows来分发消息)。至于WM_Paint消息比较好处理,父窗口先将底色画好,然后就分发这个消息给所有子对象,子对象根据自己记录的位置和范围,在指定的Rect中画好自己的东西就可以了。大致就是这样,虽然是很炫的玩意,但还是基于原来的技术的。

相关文章:

  • 托管与非托管
  • 什么是回调函数?
  • ShowWindow与UpdateWindow
  • VS2015无法打开源文件#include “iostream.h“的解决方法
  • BHO
  • 开放平台
  • js(=>) 箭头函数
  • JavaScript中的回调函数(callback)
  • com教程(使用VS2015编写ATL示例)
  • 控制台console使用MFC库函数,Cout输出CString的方法
  • PDFsharp使用介绍
  • 详解开源免费且稳定实用的.NET PDF打印组件itextSharp
  • 机器人是什么
  • C++中L和_T()之区别
  • 关于 wcout 输出中文的问题
  • JS 中的深拷贝与浅拷贝
  • 「面试题」如何实现一个圣杯布局?
  • 「译」Node.js Streams 基础
  • 【Linux系统编程】快速查找errno错误码信息
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • es6
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • java概述
  • Java面向对象及其三大特征
  • Java应用性能调优
  • JWT究竟是什么呢?
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python 基础起步 (十) 什么叫函数?
  • Sequelize 中文文档 v4 - Getting started - 入门
  • spring boot 整合mybatis 无法输出sql的问题
  • 闭包--闭包作用之保存(一)
  • 程序员该如何有效的找工作?
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端设计模式
  • 十年未变!安全,谁之责?(下)
  • 思考 CSS 架构
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 学习使用ExpressJS 4.0中的新Router
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​TypeScript都不会用,也敢说会前端?
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • (0)Nginx 功能特性
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (06)金属布线——为半导体注入生命的连接
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (20050108)又读《平凡的世界》
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计高校学生选课系统
  • (强烈推荐)移动端音视频从零到上手(上)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (生成器)yield与(迭代器)generator