【问题标题】:C# How to Add Round Corner to buttonC#如何为按钮添加圆角
【发布时间】:2011-04-19 15:12:04
【问题描述】:

我需要有关如何为每个角添加曲线的帮助。

这是我的代码..

using (Graphics btnG = pevent.Graphics)
using (SolidBrush btnBGSB = new SolidBrush(Color.FromArgb(107, 109, 110)))
using (SolidBrush lblBrush = new SolidBrush(Color.FromArgb(255, 255, 255)))
{
    Rectangle btnBG = new Rectangle(0, 0, this.Width, this.Height);

    btnG.FillRectangle(btnBGSB, btnBG);

    RectangleF lblRec = new RectangleF(0, 0, this.Width - 1, this.Height - 1);
    StringFormat lblSf = new StringFormat();
    lblSf.Alignment = StringAlignment.Center;
    lblSf.LineAlignment = StringAlignment.Center;    

    btnG.DrawString(this.Text, new Font("tahoma", 10.0f, FontStyle.Bold), lblBrush, lblRec, lblSf);
}

这是我第三天玩 c#.. 只是我的 TCPSocket 应用程序的 GUI.. :)

【问题讨论】:

  • 如果您正在寻找这样的样式,那么 WPF 或 Silverlight 可能是一个更好的起点。
  • 按钮.. 按钮是 WinForms 吗? :) 对不起,我对这种语言真的很陌生..
  • 这不是 Windows 应用程序的工作方式。它们与您使用 CSS 设计的网页不同。所有按钮都具有相似的外观。原因是它们可以作为按钮进行区分。忘记用圆角绘制它们的想法。
  • 我编辑了您的代码并正确处理了对象(一旦经过同行评审就会显示出来)
  • @vrynxzent 如果您来自网络背景,WPF 似乎比 win 表单更自然。 visualstudiogallery.msdn.microsoft.com/… 开始使用 WPF。

标签: c# winforms


【解决方案1】:

这是我用来制作圆角的一种方法:

    public static void DrawRoundedRectangle(this Graphics g, Color color, Rectangle rec, int radius,
                                            RoundedCorners corners)
    {
        using (var b = new SolidBrush(color))
        {
            int x = rec.X;
            int y = rec.Y;
            int diameter = radius * 2;
            var horiz = new Rectangle(x, y + radius, rec.Width, rec.Height - diameter);
            var vert = new Rectangle(x + radius, y, rec.Width - diameter, rec.Height);

            g.FillRectangle(b, horiz);
            g.FillRectangle(b, vert);

            if ((corners & RoundedCorners.TopLeft) == RoundedCorners.TopLeft)
                g.FillEllipse(b, x, y, diameter, diameter);
            else
                g.FillRectangle(b, x, y, diameter, diameter);

            if ((corners & RoundedCorners.TopRight) == RoundedCorners.TopRight)
                g.FillEllipse(b, x + rec.Width - (diameter + 1), y, diameter, diameter);
            else
                g.FillRectangle(b, x + rec.Width - (diameter + 1), y, diameter, diameter);

            if ((corners & RoundedCorners.BottomLeft) == RoundedCorners.BottomLeft)
                g.FillEllipse(b, x, y + rec.Height - (diameter + 1), diameter, diameter);
            else
                g.FillRectangle(b, x, y + rec.Height - (diameter + 1), diameter, diameter);

            if ((corners & RoundedCorners.BottomRight) == RoundedCorners.BottomRight)
                g.FillEllipse(b, x + rec.Width - (diameter + 1), y + rec.Height - (diameter + 1), diameter, diameter);
            else
                g.FillRectangle(b, x + rec.Width - (diameter + 1), y + rec.Height - (diameter + 1), diameter,
                                diameter);
        }
    }

    public enum RoundedCorners
    {
        None = 0x00,
        TopLeft = 0x02,
        TopRight = 0x04,
        BottomLeft = 0x08,
        BottomRight = 0x10,
        All = 0x1F
    }

这样您就可以指定要圆角的角。

如果你想在它周围有一个边框,使用这个方法:

    public static void DrawRoundedBorder(this Graphics g, Color color, Rectangle rec,
                                         int radius, int borderWidth, RoundedCorners corners)
    {
        using (Bitmap b = new Bitmap(rec.Width, rec.Height))
        using (Graphics gb = Graphics.FromImage(b))
        {
            var gfRec = new Rectangle(0, 0, rec.Width, rec.Height);
            gb.Clear(Color.Green);

            gb.DrawRoundedRectangle(color, gfRec, radius, corners);

            gfRec.Height -= borderWidth << 1;
            gfRec.Width -= borderWidth << 1;
            gfRec.X += borderWidth;
            gfRec.Y += borderWidth;
            gb.DrawRoundedRectangle(Color.Green, gfRec, radius - borderWidth, corners);

            var maskAttr = new ImageAttributes();
            maskAttr.SetColorKey(Color.Green, Color.Green);

            g.DrawImage(b, rec, 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, maskAttr);
        }
    }

【讨论】:

  • 我可以在我的代码中实现这个吗?我只需要在我的代码中将其作为方法调用吗?对不起我的新手问题..
  • 是的,你可以在你的代码中实现它。您需要记住的一件事是丢弃您的 SolidBrushes!
  • 你可以这样调用这个方法:btnG.DrawRoundedRectangle(Color.Blue, btnBG, 10, RoundedCorners.All);
  • 我收到此错误扩展方法必须在非泛型静态类中定义并指向我的类|||命名空间 KamoteButtonTest { 类 KamoteButton : 按钮 {
  • 你需要创建一个也是静态的类并将这些方法放入其中。或者只是取出Graphics参数前面的this:)
猜你喜欢
  • 1970-01-01
  • 2019-09-14
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2011-06-30
  • 2019-05-17
相关资源
最近更新 更多