要實現一個非矩形的按鈕,核心在於「點擊測試」。我們利用 GraphicsPath 建立一個橢圓路徑,再呼叫 IsVisible 方法判斷滑鼠座標是否落在路徑內。若判斷結果與上一幀不同,即切換懸停狀態旗標 bolMouseHoverFlag,並觸發重繪,讓按鈕瞬間呈現視覺回饋。
重繪控件有兩條路徑:
Invalidate 因 Windows 底層訊息機制導致明顯可感延遲時才使用。兩者分別封裝了 Win32 API InvalidateRect 與 UpdateWindow。深入圖形開發終將觸及 Win32,這也是 .NET 圖形程式設計學習曲線陡峭的原因之一——脫離不了底層,才能真正駕馭上層。
人眼對畫面變化極其敏感(數十毫秒即可感知),遠超大腦反應與手部操作速度。因此圖形程式碼的執行效率直接決定使用者體驗,必須在 OnPaint 中極度精簡邏輯,善用 ClipRectangle 只繪製必要區域。
MouseEventArgs 中的客戶區座標,呼叫 CheckMouseHover 判斷是否進入橢圓區。Control.MousePosition 轉為客戶區座標(PointToClient),再次以 CheckMouseHover 驗證,通過才呼叫 base.OnClick 觸發事件。EllipseButton。Click 撰寫測試碼(如 MessageBox.Show)。.dll 交付客戶。本講以不足百行程式碼,串聯了自訂控件生命週期、GDI+ 路徑運算、Win32 訊息機制、座標轉換、非同步重繪策略等核心知識。圖形開發與傳統 Web 資料庫開發思維迥異:前者重「像素級控制與即時回饋」,後者重「資料流與業務邏輯」。
課後挑戰:請在今日基礎上,自行實作一個三角形按鈕控件(提示:GraphicsPath.AddPolygon)。下一講我們將進軍更複雜的圖形軟體開發,敬請期待!