渐变填写VB.NET

时间:2012-12-21 15:21:09

标签: vb.net graphics gdi+

为什么世界上会出现以下简单代码?无论我使用的是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 Client Profile和Full版本的WinXP VM和Win7机器(32位,Aero模式)上进行了尝试。

最后

首先,感谢所有帮助我发现它的伟大人物。问题是我正在编辑别人的代码,他们创建了一个名为LinearGradientMode的枚举(以支持他为此目的所需的None选项)。现在,当他将此枚举的对象发送到LinearGradientBrush的构造函数时,C#编译器会认为最接近的匹配重载是采用“角度”参数(这是我的理论),并将我的渐变模式的值转换为等效的int (0,1,2,3和4是值)并调用该构造函数,在每种情况下产生(几乎)水平渐变。

再次感谢所有参与的人。

3 个答案:

答案 0 :(得分:0)

确保您的矩形已添加到GraphicsPath。

答案 1 :(得分:0)

通过手动为每个渐变模式创建起点和终点,然后使用构造函数的两点重载,我解决了这个问题(bug?)。以下是有人可能感兴趣的代码:

  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

在将此标记为答案之前,我会等待更多输入。

答案 2 :(得分:0)

测试此代码:

Me.CreateGraphics.FillRectangle(New Drawing2D.LinearGradientBrush(Me.ClientRectangle, Color.Blue, Color.Black, Drawing2D.LinearGradientMode.BackwardDiagonal), Me.ClientRectangle)