如何在带有边框的winform中创建2个圆角?

时间:2019-05-15 08:26:56

标签: c# .net winforms

我有一个代码可以帮助我制作圆角的无边框WinForm。它工作正常,但事实是它没有边框,因此我想向其中添加圆形边框。另外,我只希望将TopLeftBottomRight的角圆角。

这是我当前的代码:

public partial class mainForm : Form
{
    [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
    private static extern IntPtr CreateRoundRectRgn
    (
        int nLeftRect,     // x-coordinate of upper-left corner
        int nTopRect,      // y-coordinate of upper-left corner
        int nRightRect,    // x-coordinate of lower-right corner
        int nBottomRect,   // y-coordinate of lower-right corner
        int nWidthEllipse, // height of ellipse
        int nHeightEllipse // width of ellipse
    );
}

public Form1()
{
    InitializeComponent();
    this.FormBorderStyle = FormBorderStyle.None;
    Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20));
}

WPF中很容易实现,但是如何在WinForms中实现呢?

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您可以在客户区域中手动绘制边框。这很简单,但是您必须谨慎安排子控件的间距。

但是,这仍然是一个挑战,因为只有Graphics.FillRegion,并且没有办法绘制轮廓或DrawRegion方法。

我们可以创建GraphicsPath并用Graphics.DrawPath绘制它,但是创建它很棘手,例如this implementation与使用CreateRoundRectRgn()方法创建的不匹配。

因此,有一个技巧有2个区域:较大的区域带有边框颜色,较小的区域带有客户颜色。这样会留下少量的外部区域,从而在视觉上创建边框。

readonly Region _client;

public Form1()
{
    InitializeComponent();
    // calculate smaller inner region using same method
    _client = Region.FromHrgn(CreateRoundRectRgn(1, 1, Width - 1, Height - 1, 20, 20));
    Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20));
}

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    // FillRectangle is faster than FillRegion for drawing outer bigger region
    // and it's actually not needed, you can simply set form BackColor to wanted border color
    // e.Graphics.FillRectangle(Brushes.Red, ClientRectangle);
    e.Graphics.FillRegion(Brushes.White, _client);
}

结果: