Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

рисование линий на Canvas-e любой формы, задаваемые шаблоном   Найти похожие ветки 

 
claus   (2003-11-12 12:02) [0]

как на графической канве рисовать линии существующими методами Canvasa, где типов линий не 16, а больше. чтобы их внешний вид можно было задавать неким растровым или  векторным шаблоном. Если есть другие пути решения вопроса, не используя Canvas, сообщите о них. Спасибо.


 
MBo ©   (2003-11-12 13:22) [1]

В NT-системах можно создавать свои типы перьев.
Кроме того, есть процедура LineDDA.


 
Fenik ©   (2003-11-13 09:33) [2]

Привожу вырезку из демострационного проекта, который нашел давно на Королевстве.
Думаю, что этого хватит для понимания сути алгоритма.

Автор: Григорьев Антон (grigorievab@mail.ru), Черноголовка, 1999
Специально для Королевства Delphi (http://delphi.vitpc.com)                    

type
 TLinesForm = class(TForm)
   RGroupLine: TRadioGroup;
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;X,Y:Integer);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState;X,Y:Integer);
   procedure FormCreate(Sender: TObject);
 private
   LineDrawing: Boolean;//  Эта переменная True, если программа находится в режиме
                        //  рисования линии.
   BegX,BegY: Integer;  //  Здесь хранятся координаты начала "резиновой" линии.
   OldX,OldY: Integer;  //  Здесь хранятся координаты конца "резиновой" линии на
                        //  момент её последнего обновления на экране.
   procedure Line(X1, Y1, X2, Y2: Integer);
 end;

...

procedure LineDrawCross(X, Y: Integer; Canvas: TCanvas); stdcall;
//Линия, состоящая из отдельных крестиков.
begin
  with Canvas do
  begin
    MoveTo(X - 2, Y);
    LineTo(X + 3, Y);
    MoveTo(X, Y - 2);
    LineTo(X, Y + 3)
  end;
end;

procedure TLinesForm.Line;
begin
 LineDDA(X1, Y1, X2, Y2, @LineDrawCross, Integer(Canvas));
end;

procedure TLinesForm.FormMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
 if Button = mbLeft then
 begin
   MouseCapture := True;
   OldX := X;
   OldY := Y;
   BegX := X;
   BegY := Y;
   LineDrawing := True
 end
end;

procedure TLinesForm.FormMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);
begin
 if LineDrawing and ((X <> OldX) or (Y <> OldY)) then
   with Canvas do
   begin
     SetROP2(Handle, R2_not);
     Line(BegX, BegY, OldX, OldY);    //    Стираем старую линию.
     Line(BegX, BegY, X, Y);          //    Рисуем новую.
     OldX := X;
     OldY := Y
   end
end;

procedure TLinesForm.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift:TShiftState;X,Y:Integer);
begin
 if (Button = mbLeft) and LineDrawing then
 begin
   case RGroupLine.ItemIndex of
     2: Canvas.Pen.Color := clBlue;
     3: begin
       Canvas.Brush.Color := clRed;
       Canvas.Pen.Color := clRed
     end;
     4: Canvas.Pen.Color := clGreen
   end;
   Line(BegX, BegY, X, Y);
   LineDrawing := False;
   MouseCapture := False
 end
end;


 
Fenik ©   (2003-11-22 22:43) [3]

Лишнего вырезал. Нужен ещё счетчик:

var Count: Integer;

procedure LineDrawCross(X, Y: Integer; Canvas: TCanvas); stdcall;
//Линия, состоящая из отдельных крестиков.
begin
if Count mod 7 = 0 then
with Canvas do begin
 MoveTo(X - 2, Y);
 LineTo(X + 3, Y);
 MoveTo(X, Y - 2);
 LineTo(X, Y + 3)
end;
Inc(Count);
end;

...

procedure TLinesForm.FormMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
if Button = mbLeft then
begin
 Count := 0;
...



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
7-1073572262
Davey
2004-01-08 17:31
2004.03.28
Коммандная строка процесса


1-1078391917
AlexanderSK
2004-03-04 12:18
2004.03.28
Доступ к объекту из нескольких потоков


4-1073827542
Alien
2004-01-11 16:25
2004.03.28
WM_GETICON


6-1073910254
INTAARI
2004-01-12 15:24
2004.03.28
как узнать, что данные дошли в TcpClient


9-1062855848
G A M E R
2003-09-06 17:44
2004.03.28
Как добавить сюда (на дельфи мастера) файл?