【问题标题】:How to get consistent gradient fill in GDI+ when using a rotated LinearGradientBrush?使用旋转的 LinearGradientBrush 时如何在 GDI+ 中获得一致的渐变填充?
【发布时间】:2011-05-11 03:59:52
【问题描述】:

我在我的应用程序中使用 GDI+,我需要使用旋转的 LinearGradientBrush 以完全相同的方式绘制多个矩形。然而,虽然我调用相同的代码来填充每个矩形,但结果并不是我所期望的。这是创建渐变填充的代码,其中 rcDraw 是包含要为每个矩形绘制的区域的矩形。这些坐标在父窗口的坐标中,所以它们对于 2 个矩形并不相同。

g_hbrLinear = new LinearGradientBrush( Rect( 0, rcDraw.top, 0, rcDraw.bottom - rcDraw.top ), clrStart, clrEnd, (REAL) 80, FALSE);

我在屏幕上看到的内容如下所示 (http://www.nnanime.com/bugs/LinGradBrush-rotate10.png)。您可以看到,就好像第一个矩形的填充继续到第二个矩形。我真正想要的是让 2 个矩形看起来相同。如果我使用自己的客户端坐标分别绘制每个矩形,我想我可以做到这一点,但为了我的应用程序的目的,我需要使用父窗口的坐标。

我想我要问的是,GDI+ 如何计算填充的“原点”?它总是基于您使用的坐标系中的 0,0 吗?有没有办法改变它?我尝试了 TranslateTransform,但它似乎并没有以我认为可预测或可理解的方式移动填充。

【问题讨论】:

    标签: rotation gdi+ angle lineargradientbrush


    【解决方案1】:

    传递给线性渐变画笔的矩形决定了左右颜色的位置,渐变将在这个矩形内绘制。

    所以,我认为你需要为你正在绘制的每个矩形创建一个画笔,你正在绘制的矩形也被传递给线性渐变画笔的构造函数。

    【讨论】:

    • 尼克,谢谢,但这基本上就是我已经在做的事情了。我在我的问题中粘贴了错误的代码。正确的代码应该有 rcDraw.left 代表矩形的左侧,而 1 代表宽度。这仍然会产生相同类型的结果:它看起来像 1 个跨越所有矩形的重复填充。
    【解决方案2】:

    我对线性渐变画笔“变换”的体验与你的一致;我一直无法理解它应该做什么。

    您可以将 GDI+ 中的画笔视为将世界坐标映射到颜色的函数。画笔在给定点的外观不会因所填充的形状而改变。

    它确实会随着您正在绘制的 Graphics 对象的变换而改变。因此,如果您不想更改画笔,您可以临时更改 Graphics 对象的变换,以便您绘制的矩形在世界坐标中具有特定的已知大小和位置。 BeginContainer 和 EndContainer 方法应该让这一切变得简单。

    (还有 RenderingOrigin 属性,但它只影响影线刷,奇怪的是不受世界变换的影响。)

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      相关资源
      最近更新 更多