GraphicsPath - странности с отрисовкой.
От: bober_maniac Россия http://bober-maniac.livejournal.com/
Дата: 21.08.09 23:13
Оценка:
Вознамерился я тут сделать на 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 жутко тяжело применять.

Может, кто что знает по этой теме? Я уже всю голову сломал, всю документацию перечитал и весь гугл перерыл — нигде ничего интересного.
Re: GraphicsPath - странности с отрисовкой.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 22.08.09 03:29
Оценка:
Здравствуйте, 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);
A journey of a thousand miles must begin with a single step © Lau Tsu
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.