1

我在我的应用程序中使用 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,但它似乎并没有以我认为可预测或可理解的方式改变填充。

4

2 回答 2

0

我对线性渐变画笔“变换”的经验与您的相匹配;我一直无法理解它应该做什么。

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

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

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

于 2014-10-12T16:12:31.877 回答
0

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

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

于 2010-11-18T18:52:39.793 回答