📜  windows 形成圆角 - C# (1)

📅  最后修改于: 2023-12-03 15:05:57.697000             🧑  作者: Mango

Windows 形成圆角 - C#

在Windows应用程序中,我们可能想要给窗口或控件添加圆角以改善界面美观度。在C#中,我们可以使用System.Drawing命名空间中提供的方法来实现这一目标。

实现方法

下面是一个示例代码,用于在Windows窗体中为整个窗体添加圆角:

using System;
using System.Drawing;
using System.Windows.Forms;

public class RoundForm : Form
{
    public RoundForm()
    {
        this.FormBorderStyle = FormBorderStyle.None;
        this.DoubleBuffered = true;
        this.SetStyle(ControlStyles.ResizeRedraw, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);
        GraphicsPath path = GetRoundedRect(rect, 20);
        this.Region = new Region(path);
        using (Pen pen = new Pen(Color.Gray, 2))
        {
            e.Graphics.DrawPath(pen, path);
        }
    }

    private GraphicsPath GetRoundedRect(Rectangle rect, int radius)
    {
        GraphicsPath path = new GraphicsPath();
        path.AddArc(rect.X, rect.Y, radius * 2, radius * 2, 180, 90);
        path.AddLine(rect.X + radius, rect.Y, rect.Right - radius * 2, rect.Y);
        path.AddArc(rect.X + rect.Width - radius * 2, rect.Y, radius * 2, radius * 2, 270, 90);
        path.AddLine(rect.Right, rect.Y + radius * 2, rect.Right, rect.Bottom - radius * 2);
        path.AddArc(rect.X + rect.Width - radius * 2, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 0, 90);
        path.AddLine(rect.Right - radius * 2, rect.Bottom, rect.X + radius * 2, rect.Bottom);
        path.AddArc(rect.X, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 90, 90);
        path.AddLine(rect.X, rect.Bottom - radius * 2, rect.X, rect.Y + radius * 2);
        path.CloseFigure();
        return path;
    }
}

在这个例子中,我们创建了一个继承自Form的RoundForm类,然后在该类的构造函数中设置了一些窗体属性来去掉窗体的边框。

接下来,我们在OnPaint方法中通过GetRoundedRect函数获得了一个GraphicsPath对象,该对象表示了一个具有圆角的矩形路径。然后我们把该路径应用于RoundForm类的Region属性上,使得该窗体的不规则形状被正确地定义。最后,我们使用一个画笔画出了该路径的边框。

GetRoundedRect方法

GetRoundedRect方法创建GraphicsPath对象来描述一个具有圆角的矩形路径。该方法接受两个参数——一个表示矩形区域的Rectangle对象和一个表示圆角半径的整数值。

下面是一个GetRoundedRect方法的实现:

private GraphicsPath GetRoundedRect(Rectangle rect, int radius)
{
    GraphicsPath path = new GraphicsPath();
    path.AddArc(rect.X, rect.Y, radius * 2, radius * 2, 180, 90);
    path.AddLine(rect.X + radius, rect.Y, rect.Right - radius * 2, rect.Y);
    path.AddArc(rect.X + rect.Width - radius * 2, rect.Y, radius * 2, radius * 2, 270, 90);
    path.AddLine(rect.Right, rect.Y + radius * 2, rect.Right, rect.Bottom - radius * 2);
    path.AddArc(rect.X + rect.Width - radius * 2, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 0, 90);
    path.AddLine(rect.Right - radius * 2, rect.Bottom, rect.X + radius * 2, rect.Bottom);
    path.AddArc(rect.X, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 90, 90);
    path.AddLine(rect.X, rect.Bottom - radius * 2, rect.X, rect.Y + radius * 2);
    path.CloseFigure();
    return path;
}

该函数的实现过程是以逆时针方向绘制圆角的,具体如下:

  1. 从左上角开始,通过AddArc方法向GraphicsPath对象添加一个具有180度起点角度,90度的终点角度的圆弧段。
    path.AddArc(rect.X, rect.Y, radius * 2, radius * 2, 180, 90);
    
  2. 从圆弧段的结束点开始,通过AddLine方法向GraphicsPath对象添加一条连接线条。
    path.AddLine(rect.X + radius, rect.Y, rect.Right - radius * 2, rect.Y);
    
  3. 重复第1、2步,在GraphicsPath对象中添加三个圆弧段和三条连接线条,分别对应整个矩形的四个角。
  4. 关闭GraphicsPath对象的路径,使得该路径是一个封闭的多边形。
    path.CloseFigure();
    
结论

通过本文的介绍,我们了解了如何在C#中使用System.Drawing命名空间中的方法,为Windows窗体添加圆角。这种技术不仅可以应用于窗体,还可以应用于其他的Windows控件上。