Image1.canvas.MoveTo(0,20);
Image1.canvas.LineTo(112,24);
画上箭头做标记,如何实现!

解决方案 »

  1.   

    Image1.canvas.MoveTo(0,20);
    Image1.canvas.LineTo(312,324);
    Image1.canvas.MoveTo(300,300);
    Image1.canvas.LineTo(312,324);
    Image1.canvas.MoveTo(296,320);
    Image1.canvas.LineTo(312,324);
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;const
      Penwidth = 5;//画笔的粗细
      Len = 20;//箭头线的长度
      {说明:这两个常量应该一起变化,具体值由效果来定。
      当Penwidth很小时,显示的效果不是太好}type
      TForm1 = class(TForm)
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      xs, ys: integer;//画线开始处的坐标
      xt, yt: integer;//记录鼠标前一时刻的坐标
      xl, yl: integer;//记录第一条箭头线的端点坐标
      xr, yr: integer;//记录第二条箭头线的端点坐标
      b: boolean;//判断是否已经开始画线implementation{$R *.dfm}procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      b := False;
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      xs := x;
      ys := y;
      xt := x;
      yt := y;
      xl := -1;
      yl := -1;
      xr := -1;
      yr := -1;
      b := True;
    end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if b then
      begin
        Form1.Canvas.Pen.Mode := pmNotXor;
        Form1.Canvas.Pen.Color := clRed;
        Form1.Canvas.Pen.Width := PenWidth;
        Form1.Canvas.MoveTo(xs, ys);
        Form1.Canvas.LineTo(xt, yt);
        Form1.Canvas.MoveTo(xs, ys);
        Form1.Canvas.LineTo(x, y);
        if xl <> -1 then
        begin
          Form1.Canvas.MoveTo(xt, yt);
          Form1.Canvas.LineTo(xl, yl);
          Form1.Canvas.MoveTo(xt, yt);
          Form1.Canvas.LineTo(xr, yr);
        end;
        xt := x;
        yt := y;
        if x > xs then
        begin
          xl := trunc(x + Len * Cos(pi - ArcTan((y - ys) / (x - xs)) + Pi / 6));
          yl := trunc(y - Len * Sin(pi - ArcTan((y - ys) / (x - xs)) + Pi / 6));
          xr := trunc(x + Len * Cos(pi - ArcTan((y - ys) / (x - xs)) - Pi / 6));
          yr := trunc(y - Len * Sin(pi - ArcTan((y - ys) / (x - xs)) - Pi / 6));
          Form1.Canvas.MoveTo(x, y);
          Form1.Canvas.LineTo(xl, yl);
          Form1.Canvas.MoveTo(x, y);
          Form1.Canvas.LineTo(xr, yr);
        end
        else
          if x < xs then
          begin
            xl := trunc(x - Len * Cos(pi - ArcTan((y - ys) / (x - xs)) + Pi / 6));
            yl := trunc(y + Len * Sin(pi - ArcTan((y - ys) / (x - xs)) + Pi / 6));
            xr := trunc(x - Len * Cos(pi - ArcTan((y - ys) / (x - xs)) - Pi / 6));
            yr := trunc(y + Len * Sin(pi - ArcTan((y - ys) / (x - xs)) - Pi / 6));
            Form1.Canvas.MoveTo(x, y);
            Form1.Canvas.LineTo(xl, yl);
            Form1.Canvas.MoveTo(x, y);
            Form1.Canvas.LineTo(xr, yr);
          end
          else
            if y < ys then
            begin
              xl := trunc(x + Len * Sin(Pi / 6));
              yl := trunc(y + Len * Cos(Pi / 6));
              xr := trunc(x - Len * Sin(Pi / 6));
              yr := trunc(y + Len * Cos(Pi / 6));
              Form1.Canvas.MoveTo(x, y);
              Form1.Canvas.LineTo(xl, yl);
              Form1.Canvas.MoveTo(x, y);
              Form1.Canvas.LineTo(xr, yr);
            end
            else
            begin
              xl := trunc(x + Len * Sin(Pi / 6));
              yl := trunc(y - Len * Cos(Pi / 6));
              xr := trunc(x - Len * Sin(Pi / 6));
              yr := trunc(y - Len * Cos(Pi / 6));
              Form1.Canvas.MoveTo(x, y);
              Form1.Canvas.LineTo(xl, yl);
              Form1.Canvas.MoveTo(x, y);
              Form1.Canvas.LineTo(xr, yr);
            end;
      end;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      Form1.Color := clWhite;
      xt := -1;
      yt := -1;
      xl := -1;
      yl := -1;
      xr := -1;
      yr := -1;
    end;end.
    //////////////////////////////////////////////////////////
    新建一个Application,上面的代码Copy一下,在属性框中下来设置好Form1的事件,然后Run就可以看到效果
    楼主如果想要填充的三角箭头很难,Delphi中只能填充长方形,填充三角形必须自己写代码,通过画点来实现填充,这是计算机图形学里面的东东,很麻烦的。
    ///////////////////////////////////////////////////
    对了,楼主,是不是加点分,为你的这个问题写了两个小时的代码,要不就把这个贴加FAGQ中去,让我好涨点信誉分,觉得信誉分太少了。