之前一直用Winamp播放音乐,直到现在使用千千静听和酷狗,这几款音频播放软件界面一脉相承,并都具有“控件粘靠”效果,现在让我们一起来看看PDN里这种效果是如何实现的。
在PDN中,实现该效果的是由SnapManager类和SnapObstacle(下称障碍物)抽象类实现的,当然还有一些辅助类,譬如SnapDescription(下称粘靠定义)类。
SnapManager顾名思义是粘靠效果的管理类,负责各障碍物的定位、判断是否需要粘靠、保存加载效果、生成粘靠定义对象等工作。
SnapObstacle是一个抽象类,定义了作为“可粘靠”的控件的必要属性,包括障碍物轮廓,粘靠距离,粘靠事件等。
接下来看看它们是怎样在一起工作的。
“粘靠”效果主要应用在浮动窗口(工具栏、历史、颜色和图层)。从上篇文章中,我们已经了解了这几个窗体的继承关系和各自实现的接口,在这里简单复习一下:
PdnBaseForm为所有窗体的父类,实现了ISnapManagerHost接口,所有浮动窗口继承自FloatingToolForm,实现了ISnapObstacleHost接口。所有“粘靠”效果就是由这两个接口提供的。
这两个接口相当简单,各自只提供了一个属性,该属性分别是SnapManager和SnapObstacle。
我们先看看SnapManager类,上面已经解释了该类的主要作用,不再罗嗦,接下来细致看看那里面的代码:
SnapManager字段
1private Dictionary<SnapObstacle, SnapDescription> obstacles =new Dictionary<SnapObstacle, SnapDescription>();
2private const string isSnappedValueName = "IsSnapped";
3private const string leftValueName = "Left";
4private const string topValueName = "Top";
5private const string widthValueName = "Width";
6private const string heightValueName = "Height";
7private const string nullName = "";
8
9private const string snappedToValueName = "SnappedTo";
10private const string horizontalEdgeValueName = "HorizontalEdge";
11private const string verticalEdgeValueName = "VerticalEdge";
12private const string xOffsetValueName = "XOffset";
13private const string yOffsetValueName = "YOffset";
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!