【问题标题】:Gradient fill in VB.NETVB.NET中的渐变填充
【发布时间】: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 上对其进行了测试,得到了相同的结果。下一步是检查我的系统主板。 ;-)

标签: vb.net graphics gdi+


【解决方案1】:

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

【讨论】:

  • GraphicsPath 必须包含要填充的矩形 - 因此必须添加它。 GP
【解决方案2】:

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

  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

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

【讨论】:

  • 这不是答案。它没有解释为什么刷子在您的机器上出现异常。
  • 不知怎的,我碰巧同意你的观点:)。我会等待更好的候选人被标记为答案。
  • @dotNET 您的代码不应编译,因为 LinearGradientMode 枚举没有“None”成员。顺便说一句,使用 @ 和用户名通过 cmets 向该用户发送通知。
  • @LarsTech:我认为帖子所有者的 cmets 被定向到最后一个评论者。
  • 哦……那你是自己的 LinearGradientMode 枚举吗?这可能会造成一些破坏。
【解决方案3】:

测试这段代码:

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

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多