пятница, 1 февраля 2013 г.

Широкие пунктирные линии

Можно столкнуться с проблемой при отрисовке пунктирных линий на канве с шириной более единицы:
Canvas.Pen.Width := 2;
Canvas.Pen.Style := psDot;
Canvas.MoveTo(x, y1);
Canvas.LineTo(x, y2);
Вместо ожидаемого будет проведена прямая шириной в 2 пикселя.
Я решил проблему следующим образом:
procedure LineDotedTo(Canvas: TCanvas; X, Y: Integer);
var
  lb: LOGBRUSH;
begin
  lb.lbStyle := BS_SOLID;
  lb.lbColor := Canvas.Pen.Color;
  Canvas.Pen.Handle := ExtCreatePen(PS_GEOMETRIC or PS_DASH, 
                                    Canvas.Pen.Width,
                                    lb, 0, nil);
  Canvas.LineTo(X, Y);
end;
 
...
 
Canvas.MoveTo(x, y1);
LineDotedTo(Canvas, x, y2);

Комментариев нет:

Отправить комментарий