Paint.Net学习笔记——四、窗体粘靠

本节介绍在Windows应用程序中出现的“控件粘靠”效果的实现。
之前一直用Winamp播放音乐,直到现在使用千千静听和酷狗,这几款音频播放软件界面一脉相承,并都具有“控件粘靠”效果,现在让我们一起来看看PDN里这种效果是如何实现的。
 
在PDN中,实现该效果的是由SnapManager类和SnapObstacle(下称障碍物)抽象类实现的,当然还有一些辅助类,譬如SnapDescription(下称粘靠定义)类。
SnapManager顾名思义是粘靠效果的管理类,负责各障碍物的定位、判断是否需要粘靠、保存加载效果、生成粘靠定义对象等工作。
SnapObstacle是一个抽象类,定义了作为“可粘靠”的控件的必要属性,包括障碍物轮廓,粘靠距离,粘靠事件等。
接下来看看它们是怎样在一起工作的。
 
“粘靠”效果主要应用在浮动窗口(工具栏、历史、颜色和图层)。从上篇文章中,我们已经了解了这几个窗体的继承关系和各自实现的接口,在这里简单复习一下:
PdnBaseForm为所有窗体的父类,实现了ISnapManagerHost接口,所有浮动窗口继承自FloatingToolForm,实现了ISnapObstacleHost接口。所有“粘靠”效果就是由这两个接口提供的。
这两个接口相当简单,各自只提供了一个属性,该属性分别是SnapManager和SnapObstacle。
我们先看看SnapManager类,上面已经解释了该类的主要作用,不再罗嗦,接下来细致看看那里面的代码:
SnapManager字段
obstacles字典保存了“障碍物”和“粘靠定义”的一一对应,一连串的字符串用于获取资源中的初始值以及保存粘靠定义,这些都在LoadSnapObstacleData和SaveSnapObstacleData方法中体现。
 
无论从子类中怎样跟踪进来,我们看见,最重要的,就是AdjustObstacleDestination和AdjustNewLocation方法:
AdjustNewLocation
AdjustObstacleDestination

以上在代码中添加了一些注释,就不再罗嗦了,如果有不懂就请留言或来信询问。

在以上我们看出,对于“障碍物”和“粘靠物”的“粘靠”效果新坐标的计算及管理,都是在SnapManager类中实现的,那么接下来,在“障碍物”中的定义就简单多了,只是在适当的时候,调用SnapManager的AdjustNewLocation方法就可以了,在FloatingToolForm中的实现是这样的:

 

UpdateParking

以上已经很清楚地说明了“粘靠”效果的实现过程,希望能对大家都开发有所帮助!

 

posted @ 2009-04-07 11:53  懵盛盛  阅读(3635)  评论(4编辑  收藏  举报