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

C# 圖形高級篇:文檔物件模型與自訂枚舉器實作(第七講·上中)

     編輯:關於C語言

文檔物件模型 (DOM) 三層架構

  • PointArrayList:可變長度點座標列表,實作 ICollection、自訂枚舉器,提供 Add/RemoveAt/Clear/Offset、Bounds(外切矩形)。
  • PenMarkInfo:單一簽名資訊(建立者、時間、顏色、寬度、Lines: PointArrayList[]),提供 Bounds、Draw、CreateBitmap。
  • PenMarkInfoDocument:簽名文檔根節點,管理多簽名,支援 XML 序列化儲存/載入。

C# 自訂枚舉器深度解析

foreach 背後機制

  1. 型別必須實作 IEnumerable(唯一方法 GetEnumerator())。
  2. GetEnumerator() 回傳實作 IEnumerator 的物件(MoveNext、Current、Reset)。
  3. 需定義兩個類別:一個實作 IEnumerable,一個實作 IEnumerator,內部邏輯完全自訂。

PointArrayList 實作策略

  • 直接實作 ICollection(繼承 IEnumerable)→ 自動支援 foreach。
  • 內部定義 MyPointEnumerator : IEnumerator 封裝陣列索引遍歷邏輯。
  • 提供 Bounds 屬性快速取得所有點的外切矩形(用於剪切優化與命中測試)。

PenMarkInfo 關鍵屬性與序列化控制

[XmlArrayItem(typeof(PointArrayList), ElementName = "Line")]
public ArrayList Lines { get; } // XML 序列化時元素名為 
  • XmlArrayItem 屬性指定集合元素型別與 XML 元素名稱。
  • Bounds:聚合所有 PointArrayList.Bounds 取聯集。

PenMarkInfo.Draw 實作(重申核心)

public void Draw(Graphics g, Rectangle clipRect) {
    using (Pen pen = new Pen(Color, LineWidth)) {
        foreach (PointArrayList line in Lines)
            if (clipRect.IntersectsWith(line.Bounds))
                g.DrawLines(pen, line.ToArray());
    }
}

DrawLines 單呼叫繪製全線條,**端點自動連接**,配合 clipRect.IntersectsWith 剪切優化。

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