雖然現代企業應用以 Web 為主流,但瀏覽器、IDE、作業系統本身皆為圖形密集型軟件。圖形開發與 Web 開發在思維模式、技術棧、除錯手段上有本質差異:
| 維度 | Web 資料庫開發 | 圖形開發 |
|---|---|---|
| 領域導向 | 業務邏輯、資料結構 | 演算法、幾何、渲染管線 |
| 資料庫依賴 | 核心依賴 | 輕度依賴,重介面與文檔輸出 |
| 設計模式 | MVC、Repository 等 | 文檔-視圖、命令、觀察者等進階模式 |
| 除錯難度 | 中等,可斷點、日誌 | 高,視覺結果不可序列化,抗閃爍優化極具挑戰 |
| 應用場景 | 企業資訊系統 | 瀏覽器引擎、CAD、編輯器、圖表、遊戲、OS Shell |
掌握圖形開發能顯著提升軟體架構能力,也是打造差異化技術競爭力的關鍵。
Windows 啟用保護模式,應用程式無法直接存取顯卡、印表機等硬體。所有繪圖請求必須經由 GDI32.dll(核心圖形 API)轉發:
LineTo、TextOut)理解顯卡獨立掃描顯存是消除閃爍的關鍵:畫面撕裂發生在 CPU 寫入顯存與 GPU 讀取顯存的競態條件間,雙緩衝/垂直同步即為解決之道。
Device Context (DC, HDC) 是 Windows 圖形編程的核心抽象:
Graphics 物件即為 HDC 的託管封裝這是橋接模式的經典應用:抽象(繪圖邏輯)與實作(具體裝置驅動)分離,便於擴展新輸出裝置。
| 特性 | 矢量圖形 | 位圖 |
|---|---|---|
| 描述方式 | 幾何基元(點、線、貝茲曲線、路徑) | 像素二維陣列 |
| 資料量 | 小 | 大 |
| 縮放品質 | 無損,任意解析度 | 放大產生鋸齒 |
| 渲染複雜度 | 高(需光柵化) | 低(直接拷貝像素) |
| 典型例子 | Flash/SVG、TrueType 字型、PDF | BMP/JPG/PNG、畫圖板、位圖字型 |
.NET System.Drawing 主力支援矢量繪圖(Graphics),亦提供 Bitmap 處理像素層級操作。
標準 X-Y 軸,原點預設於客戶區左上角,X 向右、Y 向下。所有圖形元素由座標 + 尺寸定義:點、線段、矩形、橢圓(外接矩形)。
.NET GraphicsUnit 列舉定義標準單位;Graphics.PageUnit 可切換度量單位,列印時建議使用實體單位。
三大基本變換:平移、旋轉、縮放。內部以 3×3 齊次矩陣運算實現:
// 範例:文字垂直顯示
g.TranslateTransform(100, 100); // 移動原點
g.RotateTransform(-90); // 逆時針 90 度
g.DrawString("垂直文字", font, brush, 0, 0);
.NET Matrix 類別封裝矩陣運算,支援疊加多重變換,是進階特效(鏡像、剪裁、非軸向縮放)的基礎。
平面幾何基元:文字、直線、矩形、橢圓/圓、橢圓弧/圓弧、貝茲曲線。
兩大基本操作:描邊、填充。組合即可構建絕大多數 UI。
Windows UI 中最高頻:文字(單行/多行、對齊/縮排/省略)與 矩形(視窗、按鈕、面板、網格儲存格)。
Windows 以訊息驅動通知事件,.NET 封裝為事件/虛擬方法雙模式:
control.Paint += ...protected override void OnPaint(...)(建議,效能略優、封裝性佳)多視窗重疊導致局部遮蔽/顯示。Windows 計算剪裁矩形,僅通知需重繪區域。.NET PaintEventArgs.ClipRectangle 提供此資訊,繪圖時略過不相交圖形可大幅提升效能。
MouseDown/Move/Up、Enter/Leave、Wheel、DoubleClickKeyDown/Up(實體鍵)、KeyPress(字元)MouseEventArgs 提供:按鍵狀態、滾輪值、客戶區座標Timer.Tick:週期性動畫/輪詢DragEnter/DragDrop 等,支援跨應用檔案/資料傳遞Graphics、GraphicsPath、Pen/Brush、Font/StringFormat、Matrix、Region本講建立了 Windows 圖形開發的完整概念地圖:從硬體抽象層到座標數學,從基本繪圖元素到事件驅動模型。這些知識是後續所有 C# 圖形實戰(按鈕、網格、編輯器、圖表…)的通用底座。下一講我們將正式動手,打造第一個橢圓按鈕控件,將理論轉化為程式碼。