Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Как на канве нарисовать жирную пунктирную линию?


Автор: ДЫМ 20.1.2005, 03:06
Свойство пера Style определяет вид линии. При Pen.Style=psDot выводится пунктирная линия, но это справедливо только для Width = 1. В противном случае линии этих стилей рисуются как сплошные.
Неужели никак нельзя нарисовать пунктирную линию, например для Width = 10?


Автор: mvdr 20.1.2005, 04:00
можно заморочиться и самому нарисовать какой надо пунктир. через цикл рисуем линию через определенное кол-во пикселей.

Автор: RA 20.1.2005, 06:59
Код


 Canvas.Pen.Color:= $484848;
 Canvas.Pen.Style:= psDot;
 Canvas.Pen.Width:= 1;
 Canvas.Rectangle(0, 0, ClientWidth, ClientHeight);


Автор: p0s0l 20.1.2005, 10:25
Borland не стал делать поддержку геометрических pen'ов... Сейчас в TPen реализован только косметический pen. Геометрический же позволяет рисовать и жирные и пунктирные и скругленные, жирные пунктиры могут быть как заливкой так и паттерном/битмапом. Короче возможностей куча, но делать это придется через WinAPI...
Создается это дело через ExtCreatePen..
Щас проверять некогда, уже надо бежать, но можешь попробовать так:
если в TPen можно указывать Handle pen'а, то можно самому вручную создать геометрический pen, и установить его:
TCanvas.Pen.Handle := ExtCreatePen (PS_GEOMETRIC, PS_DASH or PS_ENDCAP_ROUND or PS_JOIN_ROUND, 10, @lb, 0, nil)...
А далее рисовать обычными TCanvas.LineTo и т.д....

Автор: ДЫМ 21.1.2005, 04:39
p0s0l
Цитата

если в TPen можно указывать Handle pen'а, то можно самому вручную создать геометрический pen, и установить его:
TCanvas.Pen.Handle := ExtCreatePen (PS_GEOMETRIC, PS_DASH or PS_ENDCAP_ROUND or PS_JOIN_ROUND, 10, @lb, 0, nil)...
А далее рисовать обычными TCanvas.LineTo и т.д....


Так просто TCanvas.Pen.Handle значение функции не присвоишь, но даже на чистом API ничего не получается.

Что я делаю не так?
Код

procedure TForm1.Button1Click(Sender: TObject);
var lb:tagLOGBRUSH;
   DC: hDC;
   Wnd: HWnd;
   Pen:hPen;
begin
Pen :=ExtCreatePen (PS_GEOMETRIC and PS_DASH, 10, lb, 0, nil);
Wnd:=Form1.Handle;
DC := GetWindowDC(Wnd);
SelectObject(DC, Pen);
Rectangle(DC, 10, 10, 100, 100);

MoveToEx(DC, 100, 100, nil);
LineTo(DC, 200, 200);

DeleteObject(DC, Pen);
end;


Рисуется обычная сплошная линия шириной в 1 пиксель.

Если вместо
Код

Pen :=ExtCreatePen (PS_GEOMETRIC and PS_DASH, 10, lb, 0, nil);

использовать функцию CreatePen
Код

Pen:=CreatePen(PS_GEOMETRIC and PS_DASH,10,10);


то рисуется линия уже шириной 10, но все равно сплошная


Автор: RA 21.1.2005, 10:09
Код


lb.lbColor := ColorToRGB(ClBlack);
lb.lbStyle := bs_Solid;

Pen :=ExtCreatePen (PS_GEOMETRIC or PS_DASH, 1, lb, 0, nil);
Wnd:=Form1.Handle;
DC := GetWindowDC(Wnd);
SelectObject(DC, Pen);
//Rectangle(DC, 10, 10, 100, 100);

MoveToEx(DC, 100, 100, nil);
LineTo(DC, 100, 200);

DeleteObject(Pen); {В D6 только так}



Тоесть нехватало lb.lbStyle := bs_Solid;

Автор: p0s0l 21.1.2005, 12:24
Цитата
Так просто TCanvas.Pen.Handle значение функции не присвоишь, но даже на чистом API ничего не получается.
Только что проверил - спокойно присваивается smile
Код
procedure TForm1.Button2Click(Sender: TObject);
var
 lb : LOGBRUSH;
begin
 lb.lbStyle := BS_SOLID;
 lb.lbColor := clGreen;
 Canvas.Pen.Handle := ExtCreatePen(PS_GEOMETRIC or PS_DASH, 10, lb, 0, nil);
 Canvas.Rectangle(20, 20, 90, 80);
end;



Автор: p0s0l 21.1.2005, 12:26
Перенесено из раздела Дельфи

Автор: ДЫМ 22.1.2005, 02:33
Спасибо, все понял.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)