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

C# 文本編輯器開發實戰(四):換行演算法、對齊修正與髒矩形渲染優化

     編輯:關於C語言

換行核心流程

TextContainer.RefreshLine() 驅動遞迴分行,產生 TextLine 物件集合(Lines 屬性),每行記錄:行距、元素集合、首尾元素、視圖區座標、內容寬度、所屬容器。

分行迴圈邏輯

  1. 清空 Lines,建立參與分行的元素集合(扁平化容器結構)。
  2. 順序遍歷元素:製表符/水平線重算寬度;子容器遞迴 RefreshLine。
  3. 累加元素寬度,超過容器顯示寬度(情況 1)或元素獨佔一行 → 結束當前行。
  4. 強制換行元素(段落符、軟換行)→ 結束當前行。
  5. 行首/行尾禁忌字符檢查:標點不得行首、開括號不得行尾等。TextElement.CanBeLineHead/CanBeLineEnd 虛方法由具體元素實作。需防死循環(容器過窄導致無法放置任何字符)。

行結束後的幾何修正

  • 右邊緣對齊(情況 1):計算總寬度與容器寬度差值,均勻分配至元素間隙,存入 TextElement.WidthFix。Word 採用此策略,IE 則不修正。
  • 段落對齊(強制換行):依段落物件設定(左/右/置中),計算空白分配至 WidthFix。
  • 垂直基線對齊:同一行元素高度不一,以最高元素高度為行高,計算各元素 Top 使底緣對齊。

座標映射與髒矩形優化

  • 行座標 = 容器視圖座標 + 累加行距;元素視圖座標 = 行座標 + 元素行內相對座標。
  • 位置變更偵測:比較元素舊/新 BoundingBox,不同則加入重繪矩形集合。
  • 重繪合併:所有髒矩形做聯集運算,取得最小重繪區域,大幅減少閃爍與 GPU 負載。

效能瓶頸與展望

萬字符文檔分行明顯延遲。優化方向:增量分行(僅重算受影響段落)、背景執行緒預排版、佈局快取與脏標記機制。歡迎高手指教。

文檔與內容管理物件

  • TextDocument:頂層文檔物件,提供刪除、複製貼上等高層操作、VBA 介面。
  • Content:管理元素清單(Elements)、插入點(SelectStart)、選取範圍(SelectLength 正負表方向)。
  • 插入點移動支援 AutoClearSelection:按 Shift 時擴展選取,否則清除。選取變更優化:連續選取區間變更最多影響兩個不連續區塊,僅重繪這兩區塊元素。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved