2016-01-30 2 views
3

Я хочу, чтобы нарисовать пунктирную сетку на холсте TPaintBox в FireMonkey проект, результат должен быть именно таким:Как нарисовать пунктирную линию в Firemonkey?

enter image description here

Для начала я думал, что рисовать вертикальные пунктирные линии, а затем горизонтальные пунктирные линии, так что с учетом этого я попытался нарисовать одну линию первой в попытке получить внешний вид только право, это то, что я пробовал:

Canvas.Stroke.Color := TAlphaColorRec.Black; 
Canvas.Stroke.Dash := TStrokeDash.Dot; 
Canvas.Stroke.Kind := TBrushKind.Solid; 
Canvas.Stroke.Thickness := 1; 
Canvas.DrawLine(PointF(0, 0), PointF(0, 150), 1); 

результат не то, что я надеялся, что, на самом деле форма TLine может выполнять пунктирную линию h ой, я хочу, чтобы это:

enter image description here

Но мне нужно сделать рисунок себя на холсте, а не использовать дополнительные элементы управления. Для записи TLine просто нужно изменить свойство Stroke.Dash на Dot.

Итак, используя холст в проекте Firemonkey, как я могу нарисовать пунктирную линию так же, как TLine, делает так, что я могу нарисовать сетку, как первый образец изображения?

+1

Только примечание Я добавляю здесь, устанавливая толщину на 2 показа в виде пунктирной линии, но не малой/достаточно высокой. – Craig

+1

Дополнительное примечание: не понимал, что вы можете использовать значения float, такие как 0,5 для толщины, но все равно не можете получить обратную линию, выглядящую правильно. – Craig

ответ

4

Не вдаваясь в «почему это работает», вы можете достичь 1 пиксельной пунктирной линии (например, в TLine), добавив (или вычитая) половину ширины линии в координаты. Я получил идею, прослеживая то, что делает TLine; во время рендеринга используется

InflateRect(Result, -(FStroke.Thickness/2), -(FStroke.Thickness/2)); 

Применение модификации 0.5 к координатам линии дает тот же результат.

procedure TForm24.PaintBox1Paint(Sender: TObject; Canvas: TCanvas); 
var 
    a: integer; 
begin 
    Canvas.BeginScene; 
    try 
    Canvas.Stroke.Dash := TStrokeDash.Dot; 

    for a := 0 to 10 do 
     Canvas.DrawLine(PointF(a * 20 + 0.5, 0.5), PointF(a * 20 + 0.5, 200.5), 1); 

    for a := 0 to 10 do 
     Canvas.DrawLine(PointF(0.5, a * 20 + 0.5), PointF(200.5, a * 20 + 0.5), 1); 

    Canvas.DrawLine(PointF(0.5, 0.5), PointF(200.5, 200.5), 1); 
    Canvas.DrawEllipse(RectF(5.0, 5.0, 195.5, 195.5), 1); 
    finally 
    Canvas.EndScene; 
    end; 
end; 

производит этот результат:

enter image description here enter image description here

вид Лупа 500%

Редактировать 2018.02.23:

Альтернативный способ, стоит проверить, необходимо изменить формыQuality property to HighPerformance

+0

Фантастический! По общему признанию, я до сих пор не использую Firemonkey, но могу видеть некоторые из магии в вашем ответе :) – Craig

+0

И хорошее место, смотрящее в TLine, я также пробовал смотреть через источник, но мне не всегда все ясно. – Craig

Смежные вопросы