首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Paint.NET 學習筆記(四):視窗吸附效果實作

     編輯:關於.NET

Winamp、千千靜聽等播放器常見的「控制項吸附」效果,在 Paint.NET 中由 SnapManager、SnapObstacle、SnapDescription 三大類別實現。

核心類別職責

  • SnapManager:管理者,負責障礙物定位、判斷是否吸附、儲存/載入吸附資料、產生 SnapDescription。
  • SnapObstacle:抽象基類,定義可吸附控制項的必要屬性:輪廓、吸附距離、吸附事件。
  • SnapDescription:吸附定義,記錄吸附目標、邊緣、偏移、區域(內/外)等資訊。

介面串聯

所有浮動視窗(工具箱、歷史、顏色、圖層)繼承 FloatingToolForm 實作 ISnapObstacleHost;主視窗繼承 PdnBaseForm 實作 ISnapManagerHost。兩介面分別暴露 SnapObstacle 與 SnapManager 屬性,串聯吸附邏輯。

核心演算法:AdjustObstacleDestination

AdjustObstacleDestination 兩次呼叫:第一次使移動中障礙物與目標吸附;第二次依 StickyEdges 屬性微調四周吸附。內部遍歷所有障礙物,呼叫 DetermineNewSnapDescription 取得新吸附定義,再經 AdjustNewLocation 計算修正座標。

AdjustNewLocation 計算邏輯

依 HorizontalSnapEdge (Top/Bottom) 與 VerticalSnapEdge (Left/Right)、SnapRegion (Interior/Exterior) 分四種情況計算 X/Y 偏移量,最終回傳修正後座標。

浮動視窗整合:UpdateParking

private void UpdateParking() {
    if (固定邊框樣式) {
        ISnapManagerHost host = this.Owner as ISnapManagerHost;
        if (host != null) host.SnapManager.ReparkObstacle(this);
    }
}

於視窗移動/調整大小時呼叫,透過 SnapManager 即時修正位置,實現磁吸效果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved