为什么在世界上,以下简单代码会失败?无论我使用哪种线性gradeientmode的值,该代码总是从左到右的梯度填充路径。GraphPath是在其他地方创建的Graphicpath对象(基本上是圆形矩形):
Dim gradBrush as New LinearGradientBrush(rect, color1, color2, LinearGradientMode.Vertical)
graphics.FillPath(gradBrush, graphPath)
更新
对于每个人都感到奇怪,即使这失败了(水平绘制)。只需创建一个新的vb.net winforms项目,然后将以下代码粘贴到Form1的油漆事件中:
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 而不是我的代码。仅供参考
最后
首先,感谢所有帮助我发现它的伟人。问题在于我正在编辑其他人的代码,该代码创建了一个名为LineargradientMode的枚举(以支持他为其目的所需的无选项)。现在,当他将此枚举的对象发送到线性涂线刷的构造函数时,C#编译器会认为最接近的匹配过载是采用"角度"参数的一个(这是我的理论),并且会将我的梯度模式的价值转换为等效int(0、1、2、3和4是值),并调用该构造函数,每种情况下都会产生(几乎)水平梯度。
再次感谢所有参加的人。
确保您的矩形已添加到GraphicsPath中。
我通过手动创建每个梯度模式的起点和终点,然后使用构造函数的两个点过载来解决问题(错误?)。如果有人感兴趣,这是代码:
Dim st, en As Point
Select Case mGradientMode
Case LinearGradientMode.Vertical
st = New Point(CInt(rect.X + rect.Width / 2), rect.Y)
en = New Point(CInt(rect.X + rect.Width / 2), rect.Bottom)
Case LinearGradientMode.Horizontal
st = New Point(rect.X, CInt(rect.Y + rect.Height / 2))
en = New Point(rect.Right, CInt(rect.Y + rect.Height / 2))
Case LinearGradientMode.ForwardDiagonal
st = rect.Location
en = New Point(rect.Right, rect.Bottom)
Case LinearGradientMode.BackwardDiagonal
st = New Point(rect.Right, rect.Bottom)
en = rect.Location
End Select
If Me.mGradientMode = LinearGradientMode.None Then
gradBrush = New LinearGradientBrush(st, en, color1, color1)
Else
gradBrush = New LinearGradientBrush(st, en, color1, color2)
End If
我将等待更多输入,然后将其标记为答案。
测试此代码:
Me.CreateGraphics.FillRectangle(New Drawing2D.LinearGradientBrush(Me.ClientRectangle, Color.Blue, Color.Black, Drawing2D.LinearGradientMode.BackwardDiagonal), Me.ClientRectangle)