现在比较流行DirectUI设计思想,即采用windowless方式用api或gdi实现ui的绘制,其中还是有些好的设计思想值得借鉴,网上也有很多类似的讨论。
其实我觉得,像TX、Baidu这些企业软件,以及哪些个人开发比较成熟(商业化)的UI Library,大部分都是有一套自己的设计构架,但是All roads lead to Rome,在我看来,最基本的DirectUI构架无非就是: DirectUI = Layout Manager + ReDraw + Message Response 首先,要实现一个好的DirectUI,必须设计出一套逻辑性、可编程性及可扩展性非常强的层布局器(Layout Manager ),为什么这样说呢?
因为DirectUI的核心设计思想就是界面自绘,既然很多控件都要用自绘的形式表现在界面上,那么控件与控件之间,一定存在某些逻辑布局上的依赖关系,我们可以把一个app分解成3D构架,横向为X,纵向为Y,内外为Z,那么好了,A控件跟B控件的X、Y相同,但是我要实现成B为A打底,成为A的背景(当然A会绘制成透明背景模式),那么A与B之间只存在Z的关系,即层次性。由此可以看出,一个好的Layout Manager是DirectUI绘制必不可少的关键点,可以将UI所要表达的所有控件(windowless,全部需要绘制出来的)层次分明的一一展现。(题外话:你可以通过任何手段将控件的逻辑位置等信息解析到LM中) 其次,ReDraw,第一点我已经阐明了控件之间层的关系,接下来自然是要通过LM(Layout Manager)将控件一一表现到界面上。如果在你的项目中木有LM,那么你就惨了,你无法判断应该用什么顺序依次往你的程序界面上绘制控件:(,就像一张空白的画纸,而你想往上面画很多漂亮的猫猫狗狗,那究竟是先画猫还是先画狗呢。。。打住,通过LM,你完全很清楚先画什么后画什么,LM设计的时候可以要求传入控件要有父控件节点,哦可!那么在ReDraw的时候,先遍历LM,绘制父节点,再绘制子节点,这样一来,界面就基本具有逻辑雏形了。
最后,该绘制的控件已经都绘制出来了,剩下唯一需要你实现的就是如何响应用户对这些控件的操作,这个应该不用多说了,无非就是捕获用户当前LButtonDone/LButtonUp等鼠标Click事件及rect,然后根据LM反馈出属于那种控件,以及该控件对应的事件即可。
啰嗦一大堆,不知道各位看官有没有对DirectUI实现的背后有所了解呢?
希望以后会有更多优秀的DirectUI软件问世,其实这也算是MS的轻量级WPF的一种吧?对于像我们这种吃VC++这饭的,说实话还是比较嫉妒混.Net的,谁叫VC不是MS亲儿子呢。。。 如果了解了上面的废话,那么你会对“DirectUI必须用XML解析”之类的误导newbie的话语产生呕吐作用,谁说DirectUI不能用TXT解析呢^o^
我就是不用任何file做解析又如何呢?你咬我?! 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mowen99/archive/2010/04/21/5512716.aspx
|
|
来自: 开始到现在 > 《DirectUI》