Вознамерился я тут сделать на WinForms велосипед — кнопку со скругленными углами. Вроде бы, все уже давно разобрано и понятно — перекрываем CreateParams, добавляем стили в конструкторе, перекрываем OnPaint и отрисовываем кнопку с помощью GraphicsPath. С последним случились непонятки.
Дело в том, что кнопка на малых радиусах получалась несколько кособокой — единственным углом, который отрисовывался правильно был левый верхний. Остальные отрисовывались черте как.
Чтобы проверить, не глючит ли меня, я сделал такой код:
GraphicsPath gp = new GraphicsPath();
int r = 8;
int w = 10;
gp.AddArc(10, 10, r, r, 180, 90);
gp.AddArc(10+w, 10, r,r, 270, 90);
gp.AddArc(10+w, 10+w, r, r, 0, 90);
gp.AddArc(10, 10+w, r, r, 90, 90);
gp.CloseFigure();
var g = CreateGraphics();
g.FillPath(Brushes.Black, gp);
Результат поражает воображение

Или, если увеличить изображение

Очевидно, что данная клякса даже примерно не похожа на то, что хотелось бы получить. Хотя бы потому, что все четыре угла у нее совершенно разные.
Если же воспользоваться DrawPath, то результат получится следующий

Очевидно, что это именно то, что хотелось бы получить.
Наиболее интересных эффектов можно добиться, накладывая одно на другое. В частности, если вывести один и тот же контур сначала с помощью DrawPath, а затем — с помощью FillPath, то мы получим следующее

Очевидно, что FillPath слишком вольно обошелся с контуром — где-то заливка прошла по самому контуру, а где-то — не прошла. Причем прослеживается закономерность — заливка проходит по верхнему и левому контуру, и не проходит по правому и нижнему.
В случае, если увеличить размеры фигуры, результат будет несколько менее плачевный, но все равно удручающий.

То есть вольности в отношении заполнения продолжаются — где-то заливка идет по контуру, а где-то — не идет.
Все бы ничего, можно же и не использовать GraphicsPath для простых контуров, но мне кровь из носу необходимы градиентные и штриховочные заливки, которые (особенно градиентные) на сложных контурах без GP жутко тяжело применять.
Может, кто что знает по этой теме? Я уже всю голову сломал, всю документацию перечитал и весь гугл перерыл — нигде ничего интересного.
Здравствуйте, bober_maniac, Вы писали:
Меня напряг 1 пиксель
gp.AddArc(10, 10, r, r, 180, 90);
gp.AddArc(10+w-1, 10, r+1, r, 270, 90);
gp.AddArc(10+w-1, 10+w-1, r+1, r+1, 0, 90);
gp.AddArc(10, 10+w-1, r, r+1, 90, 90);