2013-03-20 2 views
3

나는이 동안 꽤 오랫동안 검색해 왔지만 대답을 얻을 수 없었다.이미지에 다각형 그리기

이미지에 다각형을 그리고 싶지만 점을 만들어서이 작업을하고 싶습니다. MouseCursor으로이 특정 점을 만들고 단추로이 점들을 따라 선을 그립니다. 이것은 내가 원하는,하지만 차이가 등이 MouseEvent와 사용자가 주어진다는 Point[1], Point[2]입니다

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; 

:

나는이 발견했다.

+4

같은 코드를 사용할 수 있습니까? –

+0

OnClick 이벤트를 처리하고 포인트 목록에 포인트를 추가하십시오. –

+0

질문은 어떻게 onclick 이벤트로 Array에 점을 저장합니까? – Fruit

답변

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

안녕하세요 bummi, 나는 네가 정말 좋아한다고 생각했다. FPointArray : TPointArray;를 선언해야했습니다. 'FPointArray : Tpoint의 배열'로 표시됩니다. 프로젝트는 잘 작동하지만 어떻게 그 영역을 페인트하지 않는 다각형을 위해 만들 수 있습니까? 그냥 점들을 따라 선을 그린다 고요? – Fruit

+0

내 생각에 이것은 아주 좋은 접근 방법입니다. 'TPaintBox.OnPaint' 이벤트에서'TImage' 그림을 직접 렌더링하고 그 'TImage' 구성 요소를 제거합니다. 빈 폴리곤을 그려야한다면 여기에서'Polygon' 함수를 호출하기 전에'PaintBox1.Canvas.Brush.Style : = bsClear;'줄을 넣으십시오. [+1] – TLama

+1

@ TLama 나는 TPaintbox의 사용법도 선호합니다. 그러나 가능성이있는 Fruit은 모든 단계가 끝나면 결과를 유지하려고합니다. – bummi

2

양식에 의해 관리되는 점의 배열을 만듭니다. 양식 클래스에서 동적 배열 필드를 선언 : 당신의 OnClick 경우

private 
    FPoly: array of TPoint; 

를 배열을 연장하고 새로운를 추가 그것에 좌표,

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

+0

예, 포인트를 그릴 필요가 있습니다.하지만 그건 당신의 질문에 관한 것이 아닙니다. "onclick 이벤트를 사용하여 Array에 점을 저장하는 방법은 무엇입니까?" 모든 점을 알기 전까지는 다각형을 그릴 수 없으므로 OnClient 이벤트에서 다각형을 페인트하고 싶지는 않습니다. –

+0

예, 그들을 저장하고 다음 단추 등을 그립니다 ... mouseclick 이벤트에서 내가 포인트를 저장할 때, 내가 어디에 포인트가 볼 수 있다면 더 좋지 않을까요? – Fruit