GraphicsPath 封裝了由直線、曲線組成的幾何路徑。本例中呼叫 AddEllipse(clientRect) 即在控件客戶區建立一個封閉橢圓路徑——客戶區即控件可繪製內部區域,若有邊框則小於控件尺寸,建議統一用 ClientSize 取得。
// 正確順序:先填充,再描邊
using (SolidBrush b = new SolidBrush(backColor)) g.FillPath(b, path);
using (Pen p = new Pen(borderColor, 2)) g.DrawPath(p, path);
若先 DrawPath 再 FillPath,填充會覆蓋邊框導致邊框消失或變細。**圖形程式極度依賴繪製順序**,這也是除錯困難的主因——後繪製者勝出,需靜態審視代碼順序。
SolidBrush、Pen、GraphicsPath 皆實作 IDisposable,內含非託管 GDI 物件。**務必以 using 區塊包裹**,確保離開作用域即釋放,避免 GDI 物件洩漏導致繪圖失效或程式崩潰。
引入 bolMouseHoverFlag,懸停時切換 HoverBackColor/HoverBorderColor,離開還原 ButtonBackColor/BorderColor,構成「亮一下」的即時回饋。
using (StringFormat f = new StringFormat()) {
f.Alignment = StringAlignment.Center; // 水平置中
f.LineAlignment = StringAlignment.Center; // 垂直置中
f.FormatFlags = StringFormatFlags.NoWrap; // 單行不換行
g.DrawString(caption, font, brush, clientRect, f);
}
DrawString 參數依序為:文字、字型、畫刷、版面矩形、格式物件。
編譯後在設計工具工具箱即可看到 EllipseButton,拖放到表單、設定文字、執行——此時按鈕如靜態圖片般毫無生機。**下一節將注入滑鼠事件,賦予它「生命」**。