Установка стилей lineend для Canvas.LineTo
Есть ли способ установить стиль для lineends для метода TCanvas.LineTo? Кажется, по умолчанию используются закругленные концы, что выглядит очень плохо для нескольких строк в строке разных цветов, когда для параметра Pen.Width установлено большое значение (например, 9).
Это выглядит так (закругленные концы):
********........******
**********........******
**********........******
********........******
(где * например синий и желтый желтый)
Еще хуже, если две средние линии нарисованы после средней линии:
********........******
**********......********
**********......********
********........******
Я хотел бы, чтобы это выглядело так (прямое окончание):
********........******
********........******
********........******
********........******
Ручка, кажется, не предлагает никаких настроек для этого, как и метод LineTo. Может быть, я могу вызвать функцию Windows API?
2 ответа
Может быть, ExtCreatePen поможет. Проверить PS_ENDCAP_*
а также PS_JOIN_*
флаги.
Пример кода с форума DelphiPraxis (немецкий язык)
procedure TForm1.FormCreate(Sender: TObject);
var LogBrush:TLOGBRUSH;
begin
ZeroMemory(@LogBrush, SizeOf(LogBrush));
LogBrush.lbColor:=ColorToRGB(Canvas.Pen.Color);
LogBrush.lbHatch:=0;
DeleteObject(Canvas.Pen.Handle);
Canvas.Pen.Handle:=ExtCreatePen(PS_Geometric or PS_Solid or PS_EndCap_Square or PS_Join_Miter, 10, LogBrush, 0, nil);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.MoveTo(0, 0);
Canvas.LineTo(50, 50);
end;
Я не думаю, что это возможно с 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.....