2025澳门开彩结果历史记录-2025澳门开彩结果-2025澳门开彩查询记录-2025澳门聚宝盆-2025澳门九点半一肖一码-2025澳门精准资料免费全览

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C# WinForms 自定義圓角按鈕實現教程

admin
2025年2月3日 1:21 本文熱度 20

在WinForms開發中,默認的Button控件外觀比較單調,且圓角效果顯示質量較差。本文將介紹如何使用GDI+創建一個高質量的自定義圓角按鈕控件。

這個控件參考了油管一個大神的寫法,確實用的技術一樣,雙層繪制機制是重點,他寫的確實漂亮?。。?/span>

主要特性

  • 可自定義邊框大小

  • 可自定義圓角半徑

  • 可自定義邊框顏色

  • 支持背景色和文本顏色設置

  • 平滑的圓角渲染效果

實現步驟

創建自定義按鈕類

首先創建一個繼承自Button的自定義類:

using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.ComponentModel;

public class RoundButton : Button
{
    // 字段定義
    private int borderSize = 0;
    private int borderRadius = 20;
    private Color borderColor = Color.PaleVioletRed;
}

添加屬性

為按鈕的自定義特性添加屬性:

[Category("Round Button")]
public int BorderSize
{
    get => borderSize;
    set
    {
        borderSize = value;
        Invalidate();
    }
}

[Category("Round Button")]
public int BorderRadius
{
    get => borderRadius;
    set
    {
        borderRadius = value;
        Invalidate();
    }
}

[Category("Round Button")]
public Color BorderColor
{
    get => borderColor;
    set
    {
        borderColor = value;
        Invalidate();
    }
}

[Category("Round Button")]
public Color BackgroundColor
{
    get => BackColor;
    set => BackColor = value;
}

[Category("Round Button")]
public Color TextColor
{
    get => ForeColor;
    set => ForeColor = value;
}

構造函數實現

設置按鈕的默認外觀:

public RoundButton()
{
    FlatStyle = FlatStyle.Flat;
    FlatAppearance.BorderSize = 0;
    Size = new Size(15040);
    BackColor = Color.MediumSlateBlue;
    ForeColor = Color.White;
    Resize += new EventHandler(Button_Resize);
}

private void Button_Resize(object sender, EventArgs e)
{
    if (borderRadius > Height)
        borderRadius = Height;
}

圓角路徑生成

實現圓角圖形路徑的生成方法:

private GraphicsPath GetFigurePath(Rectangle rect, float radius)
{
    GraphicsPath path = new GraphicsPath();
    float curveSize = radius * 2F;

    path.StartFigure();
    // 左上角
    path.AddArc(rect.X, rect.Y, curveSize, curveSize, 18090);
    // 右上角
    path.AddArc(rect.Right - curveSize, rect.Y, curveSize, curveSize, 27090);
    // 右下角
    path.AddArc(rect.Right - curveSize, rect.Bottom - curveSize, curveSize, curveSize, 090);
    // 左下角
    path.AddArc(rect.X, rect.Bottom - curveSize, curveSize, curveSize, 9090);
    path.CloseFigure();

    return path;
}

重寫OnPaint方法

實現按鈕的繪制:

protected override void OnPaint(PaintEventArgs pevent)
{
    base.OnPaint(pevent);
    Rectangle rectSurface = ClientRectangle;
    Rectangle rectBorder = Rectangle.Inflate(rectSurface, -borderSize, -borderSize);
    int smoothSize = 2;

    if (borderSize > 0)
        smoothSize = borderSize;

    if (borderRadius > 2// 圓角按鈕
    {
        using (GraphicsPath pathSurface = GetFigurePath(rectSurface, borderRadius))
        using (GraphicsPath pathBorder = GetFigurePath(rectBorder, borderRadius - borderSize))
        using (Pen penSurface = new Pen(Parent.BackColor, smoothSize))
        using (Pen penBorder = new Pen(borderColor, borderSize))
        {
            pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
            // 按鈕表面
            Region = new Region(pathSurface);
            // 繪制表面邊框
            pevent.Graphics.DrawPath(penSurface, pathSurface);
            // 按鈕邊框
            if (borderSize >= 1)
                pevent.Graphics.DrawPath(penBorder, pathBorder);
        }
    }
    else // 普通按鈕
    {
        pevent.Graphics.SmoothingMode = SmoothingMode.None;
        // 按鈕表面
        Region = new Region(rectSurface);
        // 按鈕邊框
        if (borderSize >= 1)
        {
            using (Pen penBorder = new Pen(borderColor, borderSize))
            {
                penBorder.Alignment = PenAlignment.Inset;
                pevent.Graphics.DrawRectangle(penBorder, 00, Width - 1, Height - 1);
            }
        }
    }
}

處理父容器顏色變化

為確保按鈕在父容器顏色變化時正常顯示:

protected override void OnHandleCreated(EventArgs e)
{
    base.OnHandleCreated(e);
    Parent.BackColorChanged += Container_BackColorChanged;
}

private void Container_BackColorChanged(object sender, EventArgs e)
{
    Invalidate();
}

?

雙層繪制機制

外層路徑(pathSurface):定義按鈕的整體形狀
內層路徑(pathBorder):定義邊框的位置 代碼說明一下。

protected override void OnPaint(PaintEventArgs pevent)  
{  
    base.OnPaint(pevent);  
    // 獲取按鈕的客戶區矩形  
    Rectangle rectSurface = ClientRectangle;  
    // 根據邊框大小計算內層矩形  
    Rectangle rectBorder = Rectangle.Inflate(rectSurface, -borderSize, -borderSize);  
    int smoothSize = 2;  
    if (borderSize > 0)  
        smoothSize = borderSize;  

    if (borderRadius > 2// 圓角按鈕  
    {  
        using (GraphicsPath pathSurface = GetFigurePath(rectSurface, borderRadius))          // 外層路徑  
        using (GraphicsPath pathBorder = GetFigurePath(rectBorder, borderRadius - borderSize))  // 內層路徑  
        using (Pen penSurface = new Pen(Parent.BackColor, smoothSize))                      // 外層畫筆  
        using (Pen penBorder = new Pen(borderColor, borderSize))                            // 邊框畫筆  
        {  
            pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;  
            // 1. 設置按鈕區域  
            Region = new Region(pathSurface);  
            // 2. 繪制外層邊緣  
            pevent.Graphics.DrawPath(penSurface, pathSurface);  
            // 3. 繪制內層邊框  
            if (borderSize >= 1)  
                pevent.Graphics.DrawPath(penBorder, pathBorder);  
        }  
    }  
}

注意事項

  1. 圓角半徑不能大于按鈕高度

  2. 為獲得最佳顯示效果,建議使用AntiAlias模式

  3. 需要正確處理父容器顏色變化的情況

  4. 編譯項目后才能在工具箱中使用該控件

總結

通過繼承Button類并使用GDI+繪圖技術,我們實現了一個可自定義的圓角按鈕控件。該控件不僅提供了良好的視覺效果,還支持多種自定義選項,可以滿足大多數界面設計需求。


閱讀原文:原文鏈接


該文章在 2025/2/5 17:28:53 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 特彩吧!天下彩免费资料 | 2025澳门六开彩开奖资料 | 澳门金牛网正版免费资料最新版2 | 六盒宝典2025年最新版 | 2025新奥免费资料(官网)轻量版直装 | 黄大仙论坛精选六肖黄大仙 | 2025年澳门正版资料大全免费大全 | 澳门2025年经济同比实质增长80.5% | 最准一肖一码一一中一特 | 2025新澳门今晚开奖号码 | 今期管家婆大图彩图142期 | 二四六香港精选资料下载 | 2025年澳门传真免费资料 | 49图库大全免费资料图2025下载 | 新奥开奖结果怎么查询的到 | 澳门璀璨烟花填满夜空 | 2025澳门特马今晚开奖53期 | 夜明珠高手资料 | 2025年香港资料精准 | 澳门传真澳门传真 | 新澳门资料大全免费安装 | 2025年香港资料免费大全 | 澳门精选免费资料大全 | 全网最精准澳门资料龙门客栈澳 | 今夜无人入睡在线观看完整版免费新版 | 49图库安卓app下载app下载 | 三肖三码三期必开一期 | 管家婆一肖一码最准资料公开021期23 | 香港正版最快免费更新资料 | 澳门金牛版免费资料网下载(2025已更新 | 老版彩库宝典下载安装iOS | 同福心水论坛一肖一码 | 2025年香港内部公开资料最准 | 全香港最快最准的资料免费版 | 彩库宝典下载安装免费 | 新澳2025最新资料大全 | 蓝月亮精选免费资料大全期期准 | 2025年香港今晚开什么特马 | 新澳内部一码精准公开 | 彩库宝典大全安卓版下载安装 | 2025今天澳门买什么好 |