人妻夜夜爽天天爽三区丁香花-人妻夜夜爽天天爽三-人妻夜夜爽天天爽欧美色院-人妻夜夜爽天天爽免费视频-人妻夜夜爽天天爽-人妻夜夜爽天天

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

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

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

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

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

主要特性

  • 可自定義邊框大小

  • 可自定義圓角半徑

  • 可自定義邊框顏色

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

  • 平滑的圓角渲染效果

實現步驟

創建自定義按鈕類

首先創建一個繼承自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

主站蜘蛛池模板: 大帝av在线一区二区三区 | 国产免费伦精品一区二区三区 | 久久中文字幕伊人 | 国产精品熟女人妻 | 免费一级特黄欧美大片久久网 | 色情无码永久免费网站WWW | 久久草这在线观看免费 | 91精品国产免费久久久久久婷婷 | 国产精品久久久久无码人妻 | 精品成人免费自拍视频 | 国产精品国产三级国v麻豆 国产精品国产三级国产 | 精品三级黄色片日韩三极片 | 波多野结衣在线观看 | 久久久无码A片观看免费 | 999二区在线 | 亚洲第一区欧美 | 久久久久久精品中文无码dvd | 精东视频在线观看 | 国产精品人妻一区二区三区无码 | 精品久久久久久久国产潘金莲 | 2021最新国产成人精品 | A片娇妻被交换粗又大又硬V | 国产激情一区二区三区在线观看 | 日韩专区中文字幕aa一级毛片 | 欧美网站精品久久丁香五月 | av天堂高清国产资源网 | 国产又爽又大又黄A片小说 国产又爽又黄无码无遮挡在线观看 | 亚洲桃色天堂网 | 国产热久久精 | 丰满人爽人妻A片二区 | 国产熟女一区 | 国产成人精品无码一区国产免 | 国产国产人免费视频成69大陆 | md豆传媒一二三区 | 日韩aⅴ无码精品久久人 | 日韩aⅴ人妻无码一区二区 日韩aⅴ无码精品久久人 | 日本亚洲国产一区二区三区 | 欧美中文字幕亚洲精品 | 国产精品毛片∧v卡在线 | av狼论坛地址电视剧在线观看 | 国产成人亚洲综合一 |