金山界面库分析(3)

真实窗口的封装以及实窗口到虚窗口的转化


所谓的DUI库,windowless都是在一个窗口体系内虚拟出来虚窗口概念,并且通过接管界面布局、消息传递和分发以及界面绘制来完成更优秀的界面效果。不过这些的根基却又都要落到真实的窗口上,所以在界面库中需要对真实窗口进行封装,并将真实窗口纳入到我们创建的控件体系当中,并在这个过程中完成windows消息的传递,鼠标键盘事件的分发处理,实窗口上的虚窗口的布局排版和绘制操作。

首先我们看看BKLib中的实窗口体系:


BKLib中并没有自己对windows窗口进行封装,而是使用了WTL的CWindowImpl类,这个类对于windows窗口,以及消息分发、窗口属性设置等进行了封装。对于windows消息分发中有一个重要的地方就是注册的窗口过程是按照窗口句柄进行处理,但是在我们的程序中是窗口类的一个成员方法,如何将窗口句柄和C++类实例之间进行映射就成了一个重要的话题,WTL中主要使用trunk技术,而MFC则使用链表进行查找,具体的细节大家可以在网上查询,这里就不赘述了。

这里我们看一下上面类图中其他几个类的作用:

CBkDialog:无窗口控件,它是我们虚窗口体系的一部分

CBkViewImpl:这个算是一个接口类,不过它提供了我们需要包含虚窗口体系的实窗口所必须具备的一些方法(这句话真绕)

CBkDialogViewImpl:它是一个实窗口了,因为他从封装了实窗口的 CWindowImpl类继承而来,同时他也具有包含虚窗口所必须实现的方法(从CBkViewImpl继承而来),同时他还聚合了我们虚窗口体系的一部分,也就是CBkDialog,但是我们实际使用的类并不是它。

CBkDialogView:这个类在我们的程序中会创建一个真正的窗口的,从CBkDialogViewImpl继承而来,具有了所有的能力,算是这里的中坚力量了。

CBkDialogImpl:它也是一个实窗口,我们自定义窗口就是从此继承创建,同时它还聚合了上面的包含容器窗口(CBkDialogView),所以在BKLib中创建的窗口是有两层窗口的,上面的用于承载控件体系,下面的则是我们需要自定义的窗口。为什么要创建两个窗口我们之后再研究,这里就先不解释了。

了解了上面的窗口体系后,我们就来看看在一个窗口创建过程中,各种消息、排版、绘制是如何从我们封装的实窗口想我们的虚窗口——控件体系上转化的吧。

 

创建过程:


布局过程(WM_SIZE消息处理)


绘制过程(WM_PAINT消息处理)


在实窗口到虚窗口的转化过程中,主要在于CBkDialogViewImpl类中包含三个成员变量:m_bkHeader,m_bkBody,m_bkFooter,这三者的类型均是CBkDialog,也就是我们控件体系的一部分。BkLib中将一个实窗口划分为三个虚窗口:head、body、foot,对于界面的创建、布局、绘制等操作也由这三者传递到虚窗口体系中,并通过递归调用来对所有成员进行处理。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值