Установка стилей 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.....
Другие вопросы по тегам