directui框架,directui教程
一只熊在天上飞知不如行,乐不如好第3页
DirectUI由raphaelzhang于2012年3月21日发表。
为了应对传统的Windows界面开发,有必要在主窗口上放置各种控件。这些控件也是可以响应相应消息的小窗口。一般来说,如果你想制作一个Windows标准风格的界面,可以使用这个方法。但问题是,人们喜欢做出越来越炫的界面,越来越有特色和新颖的界面。比如几乎每两个版本的Office在界面风格上都有很大的变化。
要制作一个令人眼花缭乱的界面,传统的方法是使用窗口的Owner Draw功能。当您将窗口声明为所有者描述时,可以让Windows系统在重绘窗口时调用您自己的窗口绘制代码,而不是默认的绘制代码。具体做法是写一个画图函数,在对应的WM_PAINT消息的事件响应函数中调用。然后,无论何时该窗口上的任何消息(例如鼠标移入、鼠标移出、鼠标按下、鼠标释放、鼠标移动、文本输入等)。)可能会影响窗口的外观,使用Invalidate函数通知窗口重绘,从而调用自己的返回函数。
从上面的描述可以看出,这个过程非常繁琐。特别是,许多控件/窗口有多种状态。例如,按钮至少有四种状态:正常、鼠标移入、按下和获得焦点。更复杂的控件,比如树形视图和列表控件,自己画起来更麻烦。
这些还不够。别忘了,Windows支持多主题。一般来说,自画界面在默认主题下可能会很刺眼,但是换个主题就和环境完全格格不入,看起来极其刺眼。
为了解决上述问题,人们提出了DirectUI的方法。它的基本思想是用一个文件(现在一般是XML文件)来描述整个窗口的界面布局,然后通过画图功能把整个窗口画出来。主窗口没有子窗口,所有的控件,比如按钮,编辑框等。都是通过地图和GDI绘图函数自己绘制的。
例如,以下是DirectUI框架库的界面布局XML的示例:
可扩展的超文本标记语言
123456789101112131415161718192021222324图层title=我的主窗口宽度=504 高度=354 appwin=1
标题宽度=完整高度=29
imgbtn id= 101 skin= BtnSysClose pos=-25,5/
/页眉
车身宽度=完整高度=完整
Text id=106 pos=160,30 标题/文本
Link id= 116 pos= 405,30 href= http://blog.raphaelzhang.com/my博客/link
imgbtn id= 103 skin= Bt n1 pos= 35,79/
imgbtn id= 104 skin= Bt N2 pos= 184,79/
imgbtn id= 105 skin= BTN 3 pos= 333,79/
real wnd id= 138 ctrl id= 138 pos= 30,120,470,290 /
Link id= 107 pos= 43,302 href= http://blog.raphaelzhang.com/visit博客/link
Link id= 108 pos= 167,302 href=张访问代码/link
Link id= 109 pos= 278,302 href= http://blog.raphaelzhang.com/about-me关于/link
/body
页脚宽度=完整高度=0
/页脚
/层
可以看到布局文件把界面描述的非常清楚,包括设置了很多控件,比如text、link、imgbtn等。每个控件的属性,如标题、宽度、高度、id、类等。还可以设置地图等。其实很像一个HTML文件,只是里面没有那么多控件,动态代码,CSS。在程序中,代码可以通过id与每个控件进行通信,以获取或设置其状态,可以达到非常炫目的效果。
其实现在很多软件,比如QQ,360,迅雷等。都是使用DirectUI技术绘制的界面,但是每家每户的框架都是自己开发的DirectUI框架。
目前国内比较知名的开源DirectUI框架有两个,分别是金山的BK win(BK是shell的简称,也是一款木马查杀软件)和雷霆之箭。上面的示例代码是BkWin的界面布局文件格式。
BkWin开源较早,有很多文档和例子,但是我们需要把它的代码从整个金山代码库中分离出来。它是主src/publish/目录下的bkwin、bkres、wtlhelper和tinyxml目录。BkWin是基于WTL开发的,所以在编译之前需要安装WTL。它的程序逻辑在VC的代码中。
Bolt最近刚刚发布。与金山的开源软件不同,它是一个专门的接口库。它使用的界面布局文件也是XML文件,但是仍然需要Lua代码与界面进行通信和交互。其实有点像现在的HTML代码编写。Bolt中的XML对应HTML,而Lua相当于javascript。当然Lua语言本身就很弱,需要和VC代码交互才有真正的功能,比如迅雷的多线程下载。
事实上,用XML编写的接口在Firefox中已经存在很久了。比如打开火狐,在地址栏输入chrome://browser/content/browser . XUL,就可以看到火狐自带的界面。其实火狐自己的界面都是用XUL javascript搭建的,XUL是基于XML的接口语言。在底层,Firefox使用XPCOM(类似微软的COM技术,同样使用IDL作为接口语言,但它是跨平台的,即所谓的Xross平台)。
此外,Glade还使用XML作为界面描述语言,微软的XAML也是这方面的一个努力。
要做一个炫目的界面,DirectUI只是一个选项。事实上,我们可以使用多种技术来实现这一目标。例如:
HTA .简单地说,HTA是本地化的HTML。简单地将一个普通的HTML文件保存为带有HTA后缀的文件,就可以得到一个HTA。但是HTA可以访问任何WSH脚本运行时、WMI和COM自动化组件。更多信息,请参考Javascript在WSH。当然,HTA不适合写复杂的程序,高性能的程序,有秘密源代码的程序。闪蒸空气.在RIA中,Flash Air是一个极其强大的家伙。你可以用Air写代码,然后发布成可执行程序,iPhone App,Android App,或者网页。而且效果可以很炫,功能也可以相当强大。HTML5 .这个新版本的HTML已经完全超越了上一个版本的HTML,几乎无所不能。音频、视频、绘图、数据库、实时通讯……HTML 5 CSS JavaScript可以实现非常丰富的效果。缺点当然是还是网页,不能访问所有本地资源。回到DirectUI,现在看来DirectUI最大的问题如下:
因为他们大多使用XML作为界面语言,需要精细的布局(至少精确到像素),所以他们都需要一个强大的可视化编辑界面,方便设计师快速搭建界面,交付给开发者。目前BkWin和Bolt都没有可视化的界面搭建工具,所以设计师设计完之后,需要手动将其转换成XML,而且每次修改一点点都要这么做,非常麻烦。相对来说,微软的XAML有非常好的工具,需要丰富的界面控件库。否则大部分界面都需要开发者通过程序手绘,非常痛苦,开发周期也会不必要的长。一般来说,在接口和代码之间建立骨架代码还是要花很多时间的。如果框架更完善,规则和工具更多,这些痛苦就可以大大减少。如果能有效解决上述问题,DirectUI一定会发展得更快,用户数量也会大大增加。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。