2013-03-20 232 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