我有一个代码可以帮助我制作圆角的无边框WinForm
。它工作正常,但事实是它没有边框,因此我想向其中添加圆形边框。另外,我只希望将TopLeft
和BottomRight
的角圆角。
这是我当前的代码:
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
中实现呢?
我该怎么办?
答案 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);
}
结果: