本节介绍在Windows应用程序中出现的“控件粘靠”效果的实现。
之前一直用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";