使用旋转的LinearGradientBrush时如何在GDI +中获得一致的渐变填充?

时间:2010-11-17 00:14:29

标签: rotation gdi+ angle lineargradientbrush

我在我的应用程序中使用GDI +,我需要使用旋转的LinearGradientBrush以完全相同的方式绘制几个rects。但是,虽然我调用相同的代码来填充每个rect,但结果并不是我所期望的。这是创建渐变填充的代码,其中rcDraw是包含要为每个rect绘制的区域的rect。这些坐标位于父窗口的坐标中,因此它们对于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)。您可以看到,就好像第一个矩形的填充继续进入第二个矩形。我真正想要的是让两个看起来相同。如果我使用自己的客户端坐标分别绘制每个rect,我想我可以这样做,但为了我的应用程序,我需要使用父窗口的坐标。

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

2 个答案:

答案 0 :(得分:0)

传递给线性渐变画笔的矩形确定左右颜色所在的位置,渐变将在此矩形内绘制。

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

答案 1 :(得分:0)

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

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

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

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