给我封装一个让窗口无锯齿圆角化的代码方法 以便我调用
时间: 2024-09-30 20:15:09 浏览: 19
为了封装一个通用的方法,让你可以在任何时候轻松地给Windows窗体中的任意控件应用无锯齿圆角效果,你可以创建一个自定义的控件或者包装类。这里提供一个简单的自定义控件示例,以`Control`为基础,增加无锯齿圆角功能:
```csharp
using System;
using System.Drawing;
using System.Windows.Forms;
public class SmoothRoundedControl : Control
{
private const float CornersRadius = 10f; // 圆角半径,默认值
// 封装圆角大小的属性
[Category("Appearance")]
[Description("设置无锯齿圆角半径")]
public float Corners
{
get => CornersRadius;
set
{
if (value > 0)
{
CornersRadius = value;
UpdateLayout();
Invalidate();
}
else
{
throw new ArgumentOutOfRangeException(nameof(Corners), "圆角半径必须大于0");
}
}
}
protected override void OnPaint(PaintEventArgs pevent)
{
using (Graphics g = pevent.Graphics)
{
DrawSmoothRoundedRectangle(g, ClientRectangle, CornersRadius);
}
base.OnPaint(pevent);
}
private void DrawSmoothRoundedRectangle(Graphics g, Rectangle rect, float radius)
{
Pen pen = new Pen(Color.Black, 1f);
SolidBrush brush = new SolidBrush BackColor);
Region oldRegion = g.Clip;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
// 创建一个区域,用于平滑边缘
Region region = new Region(rect);
region = region.Combine(new Region(new Ellipse(rect.Location, rect.Size + new Size(radius * 4, radius * 4))));
g.Region = region;
g.DrawRectangle(pen, rect);
g.FillRectangle(brush, rect);
g.RestoreClip(oldRegion);
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x28; // WS_EX_COMPOSITED,启用硬件加速和透明度
return cp;
}
}
// 更新布局以反映新的圆角大小
protected override void UpdateLayout()
{
base.UpdateLayout();
Size newSize = ClientSize;
if (CornersRadius != 0 && CornersRadius > Height / 2 || CornersRadius > Width / 2)
{
// 确保圆角不会超过控件本身的实际尺寸
CornersRadius = Math.Min(Math.Min(Height, Width) / 2, CornersRadius);
}
ClientSize = newSize;
Location = new Point((newSize.Width - Width) / 2, (newSize.Height - Height) / 2);
}
}
// 要使用此控件,只需在窗体上添加它,例如:
public Form MainForm
{
public MainForm()
{
Controls.Add(new SmoothRoundedControl { Dock = DockStyle.Fill, Corners = 15 });
}
}
```
现在你就可以通过`Corners`属性来给任何继承了`SmoothRoundedControl`的控件设置无锯齿圆角。请注意,这个示例假设所有子窗体都开启了硬件加速。
阅读全文