超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# WinForms 自定義圓角按鈕實(shí)現(xiàn)教程

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

在WinForms開發(fā)中,默認(rèn)的Button控件外觀比較單調(diào),且圓角效果顯示質(zhì)量較差。本文將介紹如何使用GDI+創(chuàng)建一個(gè)高質(zhì)量的自定義圓角按鈕控件。

這個(gè)控件參考了油管一個(gè)大神的寫法,確實(shí)用的技術(shù)一樣,雙層繪制機(jī)制是重點(diǎn),他寫的確實(shí)漂亮?。?!

主要特性

  • 可自定義邊框大小

  • 可自定義圓角半徑

  • 可自定義邊框顏色

  • 支持背景色和文本顏色設(shè)置

  • 平滑的圓角渲染效果

實(shí)現(xiàn)步驟

創(chuàng)建自定義按鈕類

首先創(chuàng)建一個(gè)繼承自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;
}

構(gòu)造函數(shù)實(shí)現(xiàn)

設(shè)置按鈕的默認(rèn)外觀:

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;
}

圓角路徑生成

實(shí)現(xiàn)圓角圖形路徑的生成方法:

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方法

實(shí)現(xiàn)按鈕的繪制:

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);
            }
        }
    }
}

處理父容器顏色變化

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

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

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

?

雙層繪制機(jī)制

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

protected override void OnPaint(PaintEventArgs pevent)  
{  
    base.OnPaint(pevent);  
    // 獲取按鈕的客戶區(qū)矩形  
    Rectangle rectSurface = ClientRectangle;  
    // 根據(jù)邊框大小計(jì)算內(nèi)層矩形  
    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))  // 內(nèi)層路徑  
        using (Pen penSurface = new Pen(Parent.BackColor, smoothSize))                      // 外層畫筆  
        using (Pen penBorder = new Pen(borderColor, borderSize))                            // 邊框畫筆  
        {  
            pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;  
            // 1. 設(shè)置按鈕區(qū)域  
            Region = new Region(pathSurface);  
            // 2. 繪制外層邊緣  
            pevent.Graphics.DrawPath(penSurface, pathSurface);  
            // 3. 繪制內(nèi)層邊框  
            if (borderSize >= 1)  
                pevent.Graphics.DrawPath(penBorder, pathBorder);  
        }  
    }  
}

注意事項(xiàng)

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

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

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

  4. 編譯項(xiàng)目后才能在工具箱中使用該控件

總結(jié)

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


閱讀原文:原文鏈接


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