2013-03-20 188 views
3

我一直在搜索这一段时间,但无法得到答案。在图像上绘制多边形

我想绘制一个图像上的多边形,但我想通过创建点来做到这一点; 用MouseCursor创建这个特定点,并用一个按钮沿着这些点画一条线;

我发现这一点:

var 
    Poly: array of TPoint; 
begin 
    // Allocate dynamic array of TPoint 
    SetLength(Poly, 6); 

    // Set array elements 
    Poly[0] := Point(10, 10); 
    Poly[1] := Point(30, 5); 
    Poly[2] := Point(100, 20); 
    Poly[3] := Point(120, 100); 
    Poly[4] := Point(50, 120); 
    Poly[5] := Point(10, 60); 

    // Pass to drawing routine 
    Canvas.Polygon(Poly); 

    // Redim if needed 
    SetLength(Poly, 7); 
    Poly[6] := Point(1, 5); 

    // Pass to drawing routine 
    Canvas.Polygon(Poly); 
end; 

这就是我想要的,但不同的是Point[1]Point[2]等通过与MouseEvent用户给出。

+4

问题是什么? – 2013-03-20 21:24:52

+0

处理OnClick事件并将点添加到点列表中。 – 2013-03-20 21:36:15

+0

现在的问题是,如何使用onclick事件将点存储在Array中? – Fruit 2013-03-20 21:40:59

回答

4

你可能会叠加在颜料盒的图片,并使用这样的代码

unit Unit3; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, ExtCtrls, StdCtrls; 

type 
    TPointArray=array of TPoint; 
    TForm3 = class(TForm) 
    Image1: TImage; 
    PaintBox1: TPaintBox; 
    Button1: TButton; 
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; 
     Shift: TShiftState; X, Y: Integer); 
    procedure PaintBox1Paint(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private-Deklarationen } 
    FPointArray:TPointArray; 
    public 
    { Public-Deklarationen } 
    end; 
var 
    Form3: TForm3; 
implementation 
{$R *.dfm} 

procedure TForm3.Button1Click(Sender: TObject); 
begin 
    PaintBox1.Visible := false; 
    Image1.Canvas.Polygon(FPointArray); 
end; 

procedure TForm3.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    SetLength(FPointArray,Length(FPointArray)+1); 
    FPointArray[High(FPointArray)].X := X; 
    FPointArray[High(FPointArray)].Y := Y; 
    Paintbox1.Invalidate; 
end; 

procedure TForm3.PaintBox1Paint(Sender: TObject); 
var 
i:Integer; 
begin 
    PaintBox1.Canvas.Brush.Style := bsClear; //as suggested by TLama 
    PaintBox1.Canvas.Polygon(FPointArray); 
    for I := 0 to High(FPointArray) do 
     begin 
     PaintBox1.Canvas.TextOut(FPointArray[i].X-5,FPointArray[i].y-5,IntToStr(i)); 
     end; 
end; 

end. 
+0

hello bummi,我真的很喜欢你的想法。我不得不声明FPointArray:TPointArray;作为'FPointArray:Tpoint数组'。该项目工作正常,但我怎么做的多边形不油漆它的区域?只是沿着点划线? – Fruit 2013-03-20 23:54:33

+0

在我看来,这是比较好的方法。虽然我会在'TPaintBox.OnPaint'事件中自己渲染'TImage'图片,并移除该'TImage'组件。而且,如果你想绘制一个空的多边形,在这里调用'Polygon'函数之前放置'PaintBox1.Canvas.Brush.Style:= bsClear;'行。 [+1] – TLama 2013-03-21 00:19:44

+1

@TLama我也只喜欢使用TPaintbox。但果果可能,如果所有步骤完成,都想坚持结果。 – bummi 2013-03-21 06:33:44

2

制作由您的表单管理的点数组。声明一个动态数组字段在窗体类:

private 
    FPoly: array of TPoint; 

在你OnClick情况下,延长阵列并追加新的坐标它:

procedure TFruitForm.ImageClick(Sender: TObject); 
var 
    p: TPoint; 
begin 
    p := ...; 
    SetLength(FPoly, Length(FPoly) + 1); 
    FPoly[High(FPoly)] := p; 
end; 

要分配p,看到How do I get the coordinates of the mouse when a control is clicked?

除了数组之外,您还可以考虑使用通用列表:TList<TPoint>

+0

感谢您的回复,但是我不需要在图片上画点吗?我分配了p:= ScreenToClient(p); – Fruit 2013-03-20 22:13:45

+0

是的,你需要画点,但这不是你的问题。你问,“我怎么用onclick事件将点存储在Array中?”不过,你显然不想在OnClient事件中绘制多边形,因为在知道所有点之前你不能绘制整个多边形。 – 2013-03-20 22:39:57

+0

是的,将它们存储起来,然后在存储点时在鼠标点击事件中绘制一个按钮或这样的......如果我能够看到点的位置不是更好吗? – Fruit 2013-03-20 22:46:00