【发布时间】:2012-12-09 04:24:05
【问题描述】:
为什么下面的简单代码会失败?无论我使用哪个 LinearGradientMode 值,此代码始终使用从左到右的渐变填充路径。 graphPath 是在别处创建的 GraphicPath 对象(基本上是圆角矩形):
Dim gradBrush as New LinearGradientBrush(rect, color1, color2, LinearGradientMode.Vertical)
graphics.FillPath(gradBrush, graphPath)
更新
令所有人惊讶的是,即使这样也失败了(水平绘制)。只需新建一个 VB.NET WinForms 项目并将以下代码粘贴到 Form1 的 Paint 事件中:
Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim gradBrush As New LinearGradientBrush(Me.ClientRectangle, Color.Red, Color.White, LinearGradientMode.BackwardDiagonal)
e.Graphics.FillRectangle(gradBrush, Me.ClientRectangle)
End Sub
所以我认为这与路径构造无关。
注意
如果有人能确认这个问题也发生在他们的机器上,我会很高兴,这样我们就知道这是 GDI+ 的问题,而不是我的代码。仅供参考,我已经在带有 .NET Fx 4.0 客户端配置文件和完整版的 WinXP VM 和 Win7 机器(32 位,Aero 模式)上进行了尝试。
终于
首先,感谢所有帮助我发现它的伟大人物。问题是我正在编辑其他人的代码,该代码创建了一个精确命名为 LinearGradientMode 的枚举(以支持他为实现其目的所需的 None 选项)。现在,当他将此枚举的对象发送给 LinearGradientBrush 的构造函数时,C# 编译器会认为最接近匹配的重载是带有“角度”参数的重载(这是我的理论),并将我的渐变模式的值转换为等效的 int (0、1、2、3 和 4 是值)并调用该构造函数,从而在每种情况下产生(几乎)水平梯度。
再次感谢所有参与的人。
【问题讨论】:
-
rect中包含什么? Win32 文档指出,提供的矩形会影响渐变的方向。 -
rect 只是定义圆角矩形形状的“容器”区域。
-
你是如何创建路径的?
-
好的,您粘贴的示例代码对我来说很好。 (不过,我 am 在 Mono 上。)你的 .NET 还好吗? :D
-
运气不好。我检查了我机器上的 .NET Fx 是否真的有问题,并在 XP VM 上对其进行了测试,得到了相同的结果。下一步是检查我的系统主板。 ;-)