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

C# 圖形中級篇:文檔排版演算法與 AutoScroll 滾動自動化(第六講·中上)

     編輯:關於C語言

RefreshSize:欄寬自適應與文檔尺寸計算

public void RefreshSize(Graphics g) {
    var cells = new ArrayList();
    Size viewSize = Size.Empty;
    int leftCount = 0;

    for (int col = 0; col < 1000; col++) { // 最多 1000 欄
        cells.Clear();
        // 收集該欄所有列的單元格
        for (int row = 0; row < myDocument.Count; row++) {
            var r = myDocument[row];
            if (col < r.Count) {
                var cell = r[col];
                cell.intLeft = leftCount;
                cell.intTop = row * RowHeight;
                cells.Add(cell);
            }
        }
        if (cells.Count == 0) break; // 無更多欄位

        // 計算該欄最大文字寬度
        int maxWidth = 40; // 最小寬度
        foreach (var cell in cells) if (!string.IsNullOrEmpty(cell.Text)) {
            SizeF sz = g.MeasureString(cell.Text, Font, 1000, StringFormat.GenericDefault);
            if (maxWidth < (int)sz.Width) maxWidth = (int)sz.Width;
        }
        maxWidth += 10; // 留白

        // 套用欄寬並更新文檔總尺寸
        foreach (var cell in cells) {
            cell.intWidth = maxWidth;
            cell.intHeight = RowHeight;
            if (cell.Left + cell.Width > viewSize.Width) viewSize.Width = cell.Left + cell.Width;
            if (cell.Top + cell.Height > viewSize.Height) viewSize.Height = cell.Top + cell.Height;
        }
        leftCount += maxWidth;
    }

    viewSize.Width += 10; viewSize.Height += 10; // 邊距
    if (!AutoScrollMinSize.Equals(viewSize)) {
        AutoScrollMinSize = viewSize; // 觸發捲動條自動顯示/隱藏
        Invalidate();
    }
}

關鍵技術點

  • CreateGraphics() 取得螢幕相容 Graphics 供 MeasureString 使用(不可 new Graphics())。
  • 欄寬由內容決定:遍歷同欄所有列,取最大文字寬度作為該欄寬度。
  • AutoScrollMinSize:UserControl 內建自動捲動支援,設定此屬性即可自動管理捲動條顯示與大小變更響應。
  • 排版完成後呼叫 Invalidate() 通知重繪。

OnPaint 完整代碼(含剪切優化與座標轉換)

見 81272,此處不重複。核心差異在於 RefreshSize 已預先計算好每個單元格的 Bounds,OnPaint 僅需遍歷繪製。

架構清晰度

  1. 資料層:Cell/CellRow/CellDocument 純資料結構。
  2. 排版層:RefreshSize 計算幾何資訊。
  3. 繪製層:OnPaint 純渲染邏輯。
  4. 互動層:滑鼠事件處理選取。

分層讓複雜度可控,也是圖形控件開發的標準範式。

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