/* * Create By : 李绍良[lsl](zyzx)
* Create Time : 2015-03-19
* 转载请注明来源:http://www.cppblog.com/zyzx/category/21065.html
*/
前几章已经将UI的基础部分介绍完毕,这章思考了很久,不知道如何下笔。干脆就以入门界面时的考虑作为切入点。
就以使用windows界面为例,如下入是使用spy++截取的窗口截图。
当spy++落在某个区域,周围的一个黑框,就表示的是这个窗口所在区域。不停的移动spy++查找窗口,我们可以发现如下图的规律:
看到什么没有,如果认真学习过数据结构,就知道这是一颗树。所有的UI元素都在这颗树里面,一个对话框,也就可以看成是一个树,窗口结构也可以使用树这种数据结构来表达。
那么Windows的窗口结构就不难理解了,要么认为是一个以“系统”为根的大树,要么也可以认为是去除“系统”这个根的一片森林。而在某时刻,永远只有一个处于激活的最顶层窗口,也就是得到鼠标等响应的那颗树。
Windows把窗口搞了很多概念出来,拨开这些迷雾,实际上在我看来只需要“对话框”与“控件”足以表达纷繁复杂的UI界面。对话框与控件都是衍生自窗口的概念。对话框与控件唯一的区别在于:只有对话框才拥有线程执行权。
这里先只讨论如何将这颗树绘制成一副UI图片。其实也很简单,就是遍历整颗树,使得每个节点窗口绘制(OnPaint函数)属于自己管辖的区域。采用画家算法(后面绘制会把前面绘制的覆盖),如此UI界面就绘制出来了。
如下图,中间的对话框。目前代码只实现了窗口绘制的一小部分,控件啥也没有。