GDI+中两个形状之间的空隙问题

3
我试图在GDI+(C#)中绘制自定义阴影,但是效果看起来很尴尬: Preview 我想我可以通过将一个像素添加到弧的宽度来解决它,但是这样形状会重叠。 预览 http://puu.sh/2sv2N 我完全不知道是什么导致了这个小白色区域。
以下是我的代码:
Rectangle drawRect = new Rectangle(10, 10, 400, 400);
radius = 10;
// TOP //
Rectangle topRect = new Rectangle(drawRect.X + radius, drawRect.Y, drawRect.Width - 2 * radius, radius);
LinearGradientBrush topBrush = new LinearGradientBrush(new Rectangle(topRect.X, topRect.Y - 1, topRect.Width,topRect.Height + 2), firstColor, secondColor, 270f);
g.FillRectangle(topBrush, topRect);
topBrush.Dispose();

// LEFT //
Rectangle leftRect = new Rectangle(drawRect.X, drawRect.Y + radius, radius, drawRect.Height - 2 * radius);
LinearGradientBrush leftBrush = new LinearGradientBrush(new Rectangle(leftRect.X - 1, leftRect.Y, leftRect.Width + 2, leftRect.Height), firstColor, secondColor, 180f);
g.FillRectangle(leftBrush, leftRect);
leftBrush.Dispose();

// TOP LEFT //
GraphicsPath topLeftPath = new GraphicsPath();
topLeftPath.StartFigure();
topLeftPath.AddArc(new Rectangle(drawRect.X, drawRect.Y, 2 * radius, 2 * radius), 180, 90);
topLeftPath.AddLine(new Point(drawRect.X + radius, drawRect.Y), new Point(drawRect.X + radius, drawRect.Y + radius));
topLeftPath.AddLine(new Point(drawRect.X + radius, drawRect.Y + radius), new Point(drawRect.X, drawRect.Y + radius + 1));
topLeftPath.CloseFigure();
PathGradientBrush topLeftBrush = new PathGradientBrush(topLeftPath);
topLeftBrush.CenterPoint = new PointF(drawRect.X + radius, drawRect.Y + radius);
topLeftBrush.CenterColor = firstColor;
topLeftBrush.SurroundColors = new Color[] { secondColor };
g.FillPath(topLeftBrush, topLeftPath);
topLeftBrush.Dispose();
topLeftPath.Dispose();

感谢您的提前帮助。

离题评论:你知道在基于XAML的技术(如WPF或WinRT)中可以用2行XAML代码实现相同的效果吗?我想我必须说GDI不支持“好”的东西。 - Federico Berasategui
是的,我知道我应该放弃GDI+并使用WPF,但我不能重新做整个解决方案。 - Serge Morel
1
然而,您可以通过ElementHost将WPF内容集成到现有的winforms应用程序中。使用WPF做事情并通过这种方式集成它们要比尝试通过winforms来获得令人满意的结果容易得多。 - Federico Berasategui
虽然我没有WPF方面的经验,但我仍然想知道为什么会出现这个问题。 - Serge Morel
2
尝试使用e.Graphics.PixelOffsetMode = PixelOffsetMode.Half; - LarsTech
我已经编辑了你的标题。请参阅"问题的标题应该包含“标签”吗?",在那里达成共识是“不应该”。 - John Saunders
1个回答

1
感谢LarsTech,我得到了可行的解决方案。
e.Graphics.PixelOffsetMode = PixelOffsetMode.Half;

搞定了。

谢谢!


请让 Lars 把这个作为答案发布,并接受他的答案。这会对他的贡献给予奖励。 - Wiktor Zychla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接