установка стилей lineend для Canvas.LineTo - PullRequest
3 голосов
/ 15 декабря 2008

Есть ли способ установить стиль для концевых линий для метода TCanvas.LineTo? Кажется, по умолчанию используются закругленные концы, что выглядит очень плохо для нескольких строк в строке разных цветов, когда для параметра Pen.Width установлено большое значение (например, 9).

Это выглядит так (закругленные концы):

 ********........******
**********........******
**********........******
 ********........******

(где *, например, синий, желтый.)

Еще хуже, если после средней линии нарисованы две внешние линии:

 ********........******
**********......********
**********......********
 ********........******

Мне бы хотелось, чтобы это выглядело следующим образом (заканчивается прямо):

 ********........******
 ********........******
 ********........******
 ********........******

Перо, похоже, не предлагает никаких настроек для этого, равно как и метод LineTo. Может быть, я могу вызвать функцию Windows API?

Ответы [ 2 ]

5 голосов
/ 15 декабря 2008

Может быть ExtCreatePen помогает. Проверьте флаги PS_ENDCAP_* и PS_JOIN_*.

0 голосов
/ 15 декабря 2008

Я не думаю, что это возможно с Delphi, возможно, Windows API LineTo имеет лучшие функции (в других языках программирования это часто упоминается как linecap или что-то подобное).

Обходным решением будет нарисовать два квадрата в начальной и конечной точках вашей линии, но это работает только для горизонтальных / вертикальных линий, вам придется поворачивать квадраты для других линий.

Вы также можете попытаться использовать OpenGL для линейного рисования, когда заглушки glLineWidth не округляются, хотя они остаются горизонтальными / вертикальными даже для таких диагональных линий, как этот:

........            .........
..xxxxx.            ..x......            
.xxxxx.. OpenGL way .xxx..... correct way (not quite exact, I hope you get it)
xxxxx...            xxxxx.... 
xxxx....            xxxx.....
...