Как получить согласованную градиентную заливку в GDI+ при использовании повернутой LinearGradientBrush?

Я использую GDI+ в своем приложении, и мне нужно использовать повернутую кисть LinearGradientBrush, чтобы точно так же нарисовать несколько прямоугольников. Однако, хотя я вызываю один и тот же код для заполнения каждого прямоугольника, результаты не такие, как я ожидал. Вот код для создания градиентной заливки, где rcDraw — это прямоугольник, содержащий область для рисования для каждого прямоугольника. Эти координаты находятся в координатах родительского окна, поэтому они не идентичны для двух прямоугольников.

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). Вы можете видеть, что заливка из первого прямоугольника продолжается во второй. Я действительно хочу, чтобы два прямоугольника выглядели одинаково. Я думаю, что смогу сделать это, если нарисую каждый прямоугольник отдельно, используя его собственные клиентские координаты, но для целей моего приложения мне нужно использовать координаты родительского окна.

Я думаю, что я спрашиваю, как GDI+ вычисляет «происхождение» заливки? Всегда ли он основан на 0,0 в используемой вами системе координат? Есть ли способ сдвинуть его? Я попробовал TranslateTransform, но, похоже, заливка не смещается так, как я считаю предсказуемым или понятным.


person Warner Young    schedule 17.11.2010    source источник


Ответы (2)


Прямоугольник, переданный кисти линейного градиента, определяет, где будут располагаться левый и правый цвета, и градиент будет нарисован внутри этого прямоугольника.

Итак, я думаю, вам нужно создать кисть для каждого прямоугольника, который вы рисуете, где прямоугольник, который вы рисуете, также передается конструктору для кисти с линейным градиентом.

person Nick    schedule 18.11.2010
comment
Ник, спасибо, но в основном это то, чем я уже занимаюсь. Я вставил неправильный код в свой вопрос. Правильный код должен иметь rcDraw.left для левой стороны прямоугольника и 1 для ширины. Это по-прежнему дает тот же тип результата: он выглядит как 1 повторяющаяся заливка, охватывающая все прямоугольники. - person Warner Young; 18.11.2010

Мой опыт «преобразования» кистей с линейным градиентом совпадает с вашим; Я не мог понять, что он должен делать.

Вы можете думать о кисти в GDI+ как о функции, отображающей мировые координаты в цвет. То, как выглядит кисть в данной точке, не зависит от заполняемой формы.

Он меняется с преобразованием объекта Graphics, на котором вы рисуете. Итак, если вы не хотите менять кисть, вы можете временно изменить преобразование объекта Graphics, чтобы рисуемый прямоугольник имел определенный, известный размер и положение в мировых координатах. Методы BeginContainer и EndContainer должны упростить эту задачу.

(Существует также свойство RenderingOrigin, но оно влияет только на штриховые кисти, на которые, как ни странно, не влияют преобразования мира.)

person Esme Povirk    schedule 12.10.2014