Cell 為國產電子表格元件,5.0 版本全面重寫圖表引擎,達到與 Excel 圖表相當的功能與互動體驗。本文解析其核心物件模型、拖曳互動機制、合併儲存格資料源支援、元素自動佈局演算法,展示國產元件在複雜視覺化領域的技術深度。
圖表物件拓撲結構
圖表區 (ChartArea) 為根容器,包含:
- 繪圖區 (
PlotArea):座標軸、數據系列、網格線
- 標題 (
Title):主標題、副標題
- 圖例 (
Legend):系列名稱、圖示、位置
- 座標軸 (
Axis):X/Y 軸、刻度、標籤、標題、主/次網格線
- 數據系列 (
Series):點集合、類型 (柱/線/餅/散點)、樣式
每個元素為獨立物件,擁有共同屬性 (顏色、字型、尺寸) 及專屬屬性 (軸刻度間距、系列標記形狀)。物件間透過觀察者模式聯動:資料變更 → 系列更新 → 軸重新計算刻度 → 繪圖區無效化重繪。
互動設計:拖曳即時修改資料
Cell 5.0 圖表支援**滑鼠拖曳數據點/系列直接修改底層儲存格數值**,雙向綁定:
| 拖曳類型 | 涉及邏輯 |
| 整體系列平移 | 所有點同步位移 → 批次更新儲存格區域 → 軸範圍自動調整 |
| 單點垂直拖曳 | 修改單一儲存格值 → 該點重繪 → 相關軸刻度重算 → 圖例同步 |
| 餅圖半徑/角度拖曳 | 極座標系:半徑對應數值大小、角度對應百分比 → 同步更新儲存格 |
關鍵技術:
- 命令模式:每次拖曳封裝為
UndoableCommand,支援無限級復原/重做。
- 座標系映射:螢幕座標 ↔ 資料座標 雙向轉換,處理對數軸、日期軸、類別軸非線性映射。
- 效能優化:拖曳過程僅重繪受影響區域 (Dirty Rect),利用雙緩衝避免閃爍。
合併儲存格資料源支援 (獨特優勢)
Excel 圖表對合併儲存格處理簡單:僅取左上角儲存格值,忽略合併範圍語意。Cell 5.0 **完整語意解析合併儲存格**:
- 合併區域視為單一資料實體,對應單一數據點/類別標籤。
- 跨列/跨行合併自動識別為多維度類別 (如「產品 → 季度 → 地區」三層)。
- 取消合併時自動拆分數據系列,保持圖表與資料同步。
使用者操作完全透明:選取含合併儲存格區域 → 插入圖表 → 自動正確解析,無需額外設定。
元素位置自動計算演算法
多系列、長標籤、小畫布時,Excel 常出現標籤重疊、圖例遮擋繪圖區。Cell 5.0 採用**約束式佈局引擎**:
- 計算各元素「理想尺寸」 (字型渲染度量、圖例項目排版)。
- 建立約束關係:繪圖區邊距 ≥ 軸標籤寬度 + 間距;圖例不與繪圖區重疊;標題置中不超邊界。
- 迭代求解:優先保證繪圖區最大化,其次壓縮圖例/標題字型、調整軸標籤角度 (傾斜 45°/90°)、省略次要刻度。
- 極限情況:啟用捲軸或分頁顯示。
效果:同等資料下,Cell 5.0 圖表可讀性顯著優於 Excel (見附圖對比)。
與 Cell 表格元件無縫整合
- 資料鏈結:圖表數據僅持有儲存格引用 (Range Reference),儲存格變更 → 事件通知 → 圖表自動更新;拖曳圖表點 → 寫回儲存格 → 觸發公式重算。
- 介面命令:
Chart.FillSpreadsheet() 鋪滿整個工作表;Chart.MoveToRange(range) 移動至指定區域;Chart.SetSourceRange(range) 重設資料來源。
- 樣式同步:儲存格字型/顏色/邊框變更可選擇同步至圖表對應元素。
架構擴充性
- 圖表類型插件化:新增圖表類型 (雷達圖、漏斗圖、桑基圖) 僅需實作
ISeriesRenderer 介面,註冊至工廠。
- 統計屬性:趨勢線、誤差棒、移動平均線、回歸分析作為獨立模組掛載至系列。
- 3D 化路線圖:引入 Direct3D 轉場、光照、材質,保持 2D API 相容。
- 樣板系統:預設配色、字型、佈局主題一鍵套用,支援匯入/匯出 .ccht 檔。
總結
Cell 5.0 圖表展示了國產元件在「表格+圖表」一體化領域的深度積累:物件模型清晰、互動機制完善、合併儲存格語意支援業界領先、自動佈局演算法解決實際痛點。對開發類似視覺化元件的團隊極具參考價值。完整架構圖、介面定義、核心演算法偽碼請參考附件原始碼 (含 ChartArea/PlotArea/Axis/Series/Legend 類別實作)。
- 上一篇文章: Visual C++ 模擬鍵鼠實現 QQ 訊息群發:視窗尋找、RichEdit 寫入與按鈕點擊自動化
- 下一篇文章: MFC 分割視窗限制分割條移動範圍:重寫 OnMouseMove 實現固定最小寬度
Copyright ©
程式碼之家 All Rights Reserved