С# эффект лучевой градиентной градиентности в GDI и winforms

Я создал приложение windows С# и написал 75% кода. Программа позволяет пользователю создавать блок-схему и затенять фигуры в соответствии с их статусом. Я хотел, чтобы они стали 3d-кнопками, такими как Gel Button с веб-сайта Webdesign.org

Вместо того, чтобы создавать PNG для каждой кнопки, я хотел создать их на С# с помощью кистей или другой техники, например:

// Create solid brush.
SolidBrush blueBrush = new SolidBrush(Color.Blue);
// Create points that define polygon.
PointF point1 = new PointF(50.0F, 50.0F);
PointF point2 = new PointF(100.0F, 25.0F);
PointF point3 = new PointF(200.0F, 5.0F);
PointF point4 = new PointF(250.0F, 50.0F);
PointF point5 = new PointF(300.0F, 100.0F);
PointF point6 = new PointF(350.0F, 200.0F);
PointF point7 = new PointF(250.0F, 250.0F);
PointF[] curvePoints = {point1, point2, point3, point4, point5, point6, point7};
// Define fill mode.
FillMode newFillMode = FillMode.Winding;
// Fill polygon to screen.
e.Graphics.FillPolygon(blueBrush, curvePoints, newFillMode);

Я знаю, что WPF имеет радиальные градиенты, но могу ли я сделать что-то симулятивное в CGI?

Ответы

Ответ 2

В отличие от WPF, GDI +/WinForms не имеет RadialGradientBrush. Однако вы можете добиться такого же эффекта, используя PathGradientBrush.

Вот пример:

Rectangle bounds = ...;
using (var ellipsePath = new GraphicsPath())
{
    ellipsePath.AddEllipse(bounds);
    using (var brush = new PathGradientBrush(ellipsePath))
    {
        brush.CenterPoint = new PointF(bounds.Width/2f, bounds.Height/2f);
        brush.CenterColor = Color.White;
        brush.SurroundColors = new[] { Color.Red };
        brush.FocusScales = new PointF(0, 0);

        e.Graphics.FillRectangle(brush, bounds);
    }
}

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