Winamp、千千靜聽等播放器常見的「控制項吸附」效果,在 Paint.NET 中由 SnapManager、SnapObstacle、SnapDescription 三大類別實現。
所有浮動視窗(工具箱、歷史、顏色、圖層)繼承 FloatingToolForm 實作 ISnapObstacleHost;主視窗繼承 PdnBaseForm 實作 ISnapManagerHost。兩介面分別暴露 SnapObstacle 與 SnapManager 屬性,串聯吸附邏輯。
AdjustObstacleDestination 兩次呼叫:第一次使移動中障礙物與目標吸附;第二次依 StickyEdges 屬性微調四周吸附。內部遍歷所有障礙物,呼叫 DetermineNewSnapDescription 取得新吸附定義,再經 AdjustNewLocation 計算修正座標。
依 HorizontalSnapEdge (Top/Bottom) 與 VerticalSnapEdge (Left/Right)、SnapRegion (Interior/Exterior) 分四種情況計算 X/Y 偏移量,最終回傳修正後座標。
private void UpdateParking() {
if (固定邊框樣式) {
ISnapManagerHost host = this.Owner as ISnapManagerHost;
if (host != null) host.SnapManager.ReparkObstacle(this);
}
}
於視窗移動/調整大小時呼叫,透過 SnapManager 即時修正位置,實現磁吸效果。