c#如何使用图形路径制作平滑的弧形区域

我正在尝试用圆边制作标签控件。 这是我在inheritance自Label的myclass中的OnPaint()重写方法中的代码。

protected override void OnPaint(PaintEventArgs e) { e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear; e.Graphics.CompositingQuality = CompositingQuality.HighQuality; e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle, GradientColor1, GradientColor2, 90); e.Graphics.FillRectangle(brush, new Rectangle(new Point(0, 0), new Size(this.Width, this.Height))); using (GraphicsPath gp = new GraphicsPath()) { gp.AddArc(new Rectangle(new Point(0, 0), new Size(this.Height, this.Height)), 90, 180); gp.AddLine(new Point(this.Height / 2, 0), new Point(this.Width - (this.Height / 2), 0)); gp.AddArc(new Rectangle(new Point(this.Width - this.Height, 0), new Size(this.Height, this.Height)), -90, 180); gp.CloseFigure(); this.Region = new Region(gp); } base.OnPaint(e); } 

问题是它没有平滑两侧的曲线并显示毛刺。 这是控件的屏幕截图:

在此处输入图像描述

如评论中所述,您无法对该区域进行消除锯齿,因此您必须使用图形的FillPath方法才能使绘图消除锯齿

 protected override void OnPaint(PaintEventArgs e) { e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear; e.Graphics.CompositingQuality = CompositingQuality.HighQuality; e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle, Color.Aqua, Color.Blue, 90); using (GraphicsPath gp = new GraphicsPath()) { gp.AddArc(new Rectangle(new Point(0, 0), new Size(this.Height, this.Height)), 90, 180); gp.AddLine(new Point(this.Height / 2, 0), new Point(this.Width - (this.Height / 2), 0)); gp.AddArc(new Rectangle(new Point(this.Width - this.Height, 0), new Size(this.Height, this.Height)), -90, 180); gp.CloseFigure(); e.Graphics.FillPath(brush, gp); } base.OnPaint(e); } 

如果你真的需要改变区域,我想你将不得不使用一个稍大的区域,然后用于绘图:

 protected override void OnPaint(PaintEventArgs e) { e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear; e.Graphics.CompositingQuality = CompositingQuality.HighQuality; e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle, Color.Aqua, Color.Blue, 90); using (GraphicsPath gp = new GraphicsPath()) { AddRoundedRectangle(gp, new Point(1, 1), new Size(this.Size.Width - 2, Size.Height - 2)); e.Graphics.FillPath(brush, gp); } using (GraphicsPath gp = new GraphicsPath()) { AddRoundedRectangle(gp, new Point(0, 0), this.Size); this.Region = new Region(gp); } base.OnPaint(e); } private void AddRoundedRectangle(GraphicsPath gp, Point upperLeft, Size size) { gp.AddArc(new Rectangle(upperLeft, new Size(size.Height, size.Height)), 90, 180); gp.AddLine(new Point(size.Height / 2 , upperLeft.Y), new Point(size.Width - (size.Height / 2), upperLeft.Y)); gp.AddArc(new Rectangle(new Point(size.Width - size.Height, upperLeft.Y), new Size(size.Height, size.Height)), -90, 180); gp.CloseFigure(); } 

第二个选项的优点是可以影响像MouseHover这样的事件,但可能会遇到你看到该区域的“边界”的问题。