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

C# 圖形開發實戰:OnPaint 完整實作與剪切矩形優化(第五講·中)

     編輯:關於C語言

PaintEventArgs 解剖:畫布與剪切區

OnPaint(PaintEventArgs e) 參數提供兩大核心屬性:

  • Graphics:繪圖畫布,提供 Draw*/Fill* 族群方法、座標轉換、品質設定。
  • ClipRectangle:需重繪區域。若介面複雜,僅繪製與此矩形相交部分可大幅提升效能。本例因橢圓按鈕結構簡單,暫不啟用優化。

完整 OnPaint 代碼逐段解析

protected override void OnPaint(PaintEventArgs e) {
    base.OnPaint(e);  // 必須呼叫基類

    // 1. 建立橢圓路徑(客戶區扣 1 像素避免邊框被切)
    using (GraphicsPath path = new GraphicsPath()) {
        path.AddEllipse(0, 0, ClientSize.Width - 1, ClientSize.Height - 1);

        // 2. 填充背景(懸停/正常雙色系)
        using (SolidBrush b = new SolidBrush(bolMouseHoverFlag ? HoverBackColor : ButtonBackColor))
            e.Graphics.FillPath(b, path);

        // 3. 繪製邊框(懸停/正常雙色系,寬度 2)
        using (Pen p = new Pen(bolMouseHoverFlag ? HoverBorderColor : BorderColor, 2))
            e.Graphics.DrawPath(p, path);
    }

    // 4. 繪製文字(置中、單行)
    if (Caption != null) {
        using (StringFormat f = new StringFormat()) {
            f.Alignment = StringAlignment.Center;
            f.LineAlignment = StringAlignment.Center;
            f.FormatFlags = StringFormatFlags.NoWrap;

            using (SolidBrush b = new SolidBrush(ForeColor))
                e.Graphics.DrawString(Caption, Font, b,
                    new RectangleF(0, 0, ClientSize.Width, ClientSize.Height), f);
        }
    }
}

關鍵細節備忘

  • ClientSize.Width - 1:確保寬度為奇數時橢圓邊框不被切邊。
  • using 巢狀包裹:保證 GraphicsPath、Brush、Pen、StringFormat 全部及時釋放。
  • base.OnPaint(e):若省略,父類背景繪製邏輯將缺失,可能導致殘影。

設計工具即時預覽

編譯專案後,工具箱「我的使用者控件」自動出現 EllipseButton。拖放至表單、設定 Caption 屬性、執行——得到一個**靜態但完美圓潤**的橢圓按鈕。**動態效果待下節注入滑鼠邏輯後誕生**。

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