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

C# 文本編輯器開發實戰(三):容器元素、分行物件模型與指令基礎架構

     編輯:關於C語言

容器元素:TextContainer 核心功能

元素插入與移除

  • InsertBefore、InsertRangeBefore:在指定元素前插入單個或批次元素。
  • 特殊「尾端元素」保護:段落尾標記、其他容器專屬結尾元素不可刪除。虛擬方法 AddLastElement、IsLastElement 由子類實作,刪除前必經檢查。

尺寸重算與分行入口

  • 覆寫 RefreshSize:遞迴計算所有子元素顯示尺寸。
  • 虛擬方法 RefreshLine:啟動分行流程,產生 TextLine 物件樹。

分行資料結構:TextLine

承載單行佈局資訊:

  • LineSpacing、Elements、FirstElement、LastElement
  • RealLeft、RealTop:行在視圖區絕對座標
  • Container、ContentWidth:所屬容器與行內容寬度

容器 Lines 屬性(ArrayList)保存所有行物件,避免重複計算。

分行演算法詳細步驟

  1. 清空 Lines,準備參與分行元素集合。
  2. 遍歷元素:製表符/水平線重算寬度;容器元素遞迴 RefreshLine。
  3. 累加寬度,超過容器寬度或獨佔行 → 觸發「情況 1」結束當前行。
  4. 強制換行元素 → 結束當前行。
  5. 行首/行尾禁忌檢查:CanBeLineHead/CanBeLineEnd。若違反則回退當前元素至下一行(亦屬情況 1)。防死循環機制:容器過窄時強制允許違規,避免無限迴圈(曾因該 Bug 耗費數日)。

行結束幾何計算

  • 元素在行內相對位置:情況 1 需分配 WidthFix 均勻對齊右緣;強制換行依段落對齊分配。
  • 垂直對齊:以最高元素高度為行高,計算各元素 Top 使底緣對齊。
  • 完成行加入 Lines,建立新行繼續迴圈。

視圖座標映射

依容器視圖座標與行距累加,計算各行絕對座標;元素視圖座標 = 行座標 + 行內相對座標。

指令基礎架構:EditorAction

為避免 TextDocument 膨脹,抽離指令概念:

  • 屬性:HotKey、KeyCode、ShiftKey、ControlKey、AltKey、MouseX/Y、MouseButton、Param1~3。
  • 方法:TestHotKey(熱鍵判斷)、ActionName、IsEnabled、Execute(核心邏輯)。
  • TextDocument.Actions 初始化註冊所有內建指令,外部可動態擴展。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved