简论Direct Ui的体系架构
Direct UI自从某个大牛第一次使用以后,获得了越来越多的人的追捧。究其原因,无外乎,DirectUI由于是整个窗口只有一个句柄,重绘只有一个句柄掌握,效率高。同时DirectUI窗口更容易实现皮肤效果的统一,例如任一控件可以实现背景透明,不规则形状等等。换肤也比以前简单的多,贴图而已。效果参见qq2009,2010.
这里简要说明下自己研究DirectUI的心得。传统的GUI程序中,大部分控件都是有句柄的。有句柄也就意味着其具有独立的消息队列,独立承担自绘的任务。由于其有句柄,因此整个体系架构简单得多,想让某个控件发生某种状态或响应,直接用其句柄对其发送消息即可。
但是DirectUI窗口中,由于所有控件都是无句柄的,无法直接响应消息,那么怎么办呢?
看下以下的体系架构:
这里处于整个架构顶端的directui基类,这是个有句柄的窗口类,其首先根据配置绘制出所有的directui控件,并保存每个directui控件的指针(取代句柄)。之后响应消息,并通过位置判断等将消息用指针指向进行派发到下级的directui控件中,而不需要sendmessage和postmessage这种方式,类似于delphi控件组中的perform方法。下级控件获得响应的消息,并进行响应,并且调用响应的回调函数。
也就是说,整个架构中,必然存在一个directui基类,这个基类必然是有句柄的,只有这个有句柄的基类的存在,才能保证directui界面中的所有控件能正常响应消息,因为这个基类起到了一个绘制和无句柄情形下消息分发的作用。
以qq2010为例,其directui基类就是TXGuiFoundation类,所有窗口都由此类产生并绘制。

这种什么都在主窗口绘制的方法,注定是不先进的。也违背面向对象思想。WPF虽然没有窗口句柄,但仍然是每个控件各画各的。windowless的致命缺点有几个:
1、无窗口句柄,所有您以前关于“窗口”概念的知识都白学了。您将不可能使用::ShowWindow(hWnd, SW_HIDE)来隐藏一个窗口,也不能使用::MoveWindow来移动一个窗口。
2、所有您以前学习的关于“消息”的知识也作废了。您不可能使用::SendMessage(m_hWnd, WM_SETTEXT, 0, (LPARAM)_T(“Hello world”));来设置窗口标题。
3、如果您的程序已经写好,需要花费比开发程序还要长的时间来移值到DirectUI界面上。
4、重新学习一套系统接口和概念,如果不是国际知名的大公司的windowless产品、这些知识对您的职业生涯没有太多好处,反而浪费了您的时间。
5、如果不是国际知名公司的产品,产品的稳定性和可发展性无法保证。
6、如果您的功能层代码需要与UI层交互,例如,要向UI窗口发送消息,那么您的功能层代码也要做相应的修改,所以windowless类的界面库,不仅仅影响UI层,还影响功能层。
楼主能否提供些学习资料?
@向北
可参考开源的duilib,www.duilib.com