C#中如何使用图形路径,使光滑的圆弧区域 [英] c# How to make smooth arc region using graphics path
问题描述
我试图与圆边一个标签控件。
这是我在OnPaint()方法,从标签继承MyClass的覆盖方法的代码。
I'm trying to make a label control with rounded sides. Here is my code in OnPaint() overridden method in myclass inherited from Label.
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);
}
的问题是,它不平滑两侧的曲线与示出毛刺。
这里是控制的截图:
The problem is that it is not smoothing the curve on the sides and showing the glitches. Here is the screenshot of the control :
推荐答案
由于在评论中指出,你不能抗混叠的区域,所以你必须使用图形的FillPath方法,以便进行抗锯齿绘图
As stated in the comments, you can't anti-alias the region, so you have to use graphic's FillPath method in order for the drawing to be anti-aliased
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);
}
如果你真的需要改变我猜的区域,你将不得不使用一个稍微大一点的区域,然后一个用于图:
If you really need to change the region I guess you would have to use a slightly bigger region then the one used for the drawing:
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事件的优势,但可能会遇到问题你看到这个地区的边界。
The second option has the advantage of affecting events like MouseHover but may run into problems of you seeing the region's "border".
这篇关于C#中如何使用图形路径,使光滑的圆弧区域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!