Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Eine Region erzeugen mit BeginPath ... EndPath (https://www.delphipraxis.net/85293-eine-region-erzeugen-mit-beginpath-endpath.html)

Kostas 28. Jan 2007 20:19


Eine Region erzeugen mit BeginPath ... EndPath
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,

in Zusammenhang mit einem anderen Beitrag, geht es um das erstellen einer Region.
Wie kann ich bitte zwei Bögen und zwei Linien zu einer Region zusammenfassen um danach
die Region mit einer Farbe zu füllen.


Es müßte in etwa so gehen, das funkt jedoch nicht.

Delphi-Quellcode:
  BeginPath(Canvas.Handle);
  Arc(Canvas.Handle, p1.x, p1.y, p2.x, p2.y, e1.x, e1.y, s1.x, s1.y); //Bogen außen
  Arc(Canvas.Handle, p3.x, p3.y, p4.x, p4.y, e2.x, e2.y, s2.x, s2.y); //Bogen innen

  canvas.MoveTo(s1.x,s1.y); canvas.LineTo(s2.x,s2.y); //Verbindungslinie 1 zwischen den Bögen
  canvas.MoveTo(e1.x,e1.y); canvas.LineTo(e2.x,e2.y);//Verbindungslinie 2 zwischen den Bögen

  EndPath(Canvas.Handle);
  FillPath(Canvas.Handle);

  Region := PathToRegion(Canvas.Handle);

  if (Region<>0) then
  begin
    ShowMessage('gültige Region');
    DeleteObject(Region);
  end;{if}

Gruß Kostas

Hawkeye219 28. Jan 2007 20:27

Re: Eine Region erzeugen mit BeginPath ... EndPath
 
Hallo Kostas,

es ist tatsächlich nicht ganz einfach. Nach vielen vergeblichen Versuchen mit Arc hat es schließlich mit AngleArc funktioniert:

Delphi-Quellcode:
BeginPath(Canvas.Handle);

MoveToEx(Canvas.Handle, s2.x, s2.y, nil);
AngleArc(Canvas.Handle, offset.x, offset.y, r1 div 2, -TrackBar2.Position, -TrackBar1.Position);
AngleArc(Canvas.Handle, offset.x, offset.y, r2 div 2, -(TrackBar2.Position + TrackBar1.Position), TrackBar1.Position);

EndPath(Canvas.Handle);
Gruß Hawkeye

Kostas 28. Jan 2007 21:39

Re: Eine Region erzeugen mit BeginPath ... EndPath
 
Zitat:

Zitat von Hawkeye219
Hallo Kostas,

es ist tatsächlich nicht ganz einfach. Nach vielen vergeblichen Versuchen mit Arc hat es schließlich mit AngleArc funktioniert:

Delphi-Quellcode:
BeginPath(Canvas.Handle);

MoveToEx(Canvas.Handle, s2.x, s2.y, nil);
AngleArc(Canvas.Handle, offset.x, offset.y, r1 div 2, -TrackBar2.Position, -TrackBar1.Position);
AngleArc(Canvas.Handle, offset.x, offset.y, r2 div 2, -(TrackBar2.Position + TrackBar1.Position), TrackBar1.Position);

EndPath(Canvas.Handle);
Gruß Hawkeye


Herzlichen Dank Hawkeye219,

es funkt einwandfrei, und der code ist auch schlanker geworden.

Gruß Kostas

Delphi-Quellcode:
var
  offset,s:TPoint;
  R1,R2:integer;
  Alpha:real;

  Region : HRGN;
  FillColor:TBrush;

begin
  //Zentrum des Bogens
  offset.x:=300;
  offset.y:=300;

  R1:=200; //Äußerer Bogen
  R2:=140; //Innerer Bogen

  Alpha := DegToRad(TrackBar2.position); //Startwinkel

  //Startpunkt der Schnittpunktlinie Bogen innen
  s.x := offset.x + Round((r2 div 2) * (cos(Alpha)));
  s.y := offset.y + Round((r2 div 2) * (sin(Alpha)));

  canvas.brush.Color:=clWhite;
  canvas.FillRect(canvas.ClipRect);

  Canvas.brush.Color:=clRed;

  BeginPath(Canvas.Handle);

  MoveToEx(Canvas.Handle, s.x, s.y, nil);
  AngleArc(Canvas.Handle, offset.x, offset.y, r1 div 2, -TrackBar2.Position, -TrackBar1.Position);
  AngleArc(Canvas.Handle, offset.x, offset.y, r2 div 2, -(TrackBar2.Position + TrackBar1.Position), TrackBar1.Position);

  EndPath(Canvas.Handle);
  FillPath(Canvas.Handle);

Kostas 28. Jan 2007 23:48

Re: Eine Region erzeugen mit BeginPath ... EndPath
 
So funkte es jetzt auch mit der Region zum anklicken.

Gruß Kostas

Delphi-Quellcode:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if PtInRegion(Region, X, Y)
  then bsm('gefunden');
end;

Delphi-Quellcode:
procedure TForm1.Bogen;
var
  offset,s:TPoint;
  R1,R2:integer;
  Alpha:real;
  FillColor:TBrush;

begin
  //Zentrum des Bogens
  offset.x:=300;
  offset.y:=300;

  R1:=200; //Äußerer Bogen
  R2:=140; //Innerer Bogen

  Alpha := DegToRad(TrackBar2.position); //Startwinkel

  //Startpunkt der Schnittpunktlinie Bogen innen
  s.x := offset.x + Round((r2 div 2) * (cos(Alpha)));
  s.y := offset.y + Round((r2 div 2) * (sin(Alpha)));

  canvas.brush.Color:=clWhite;
  canvas.FillRect(canvas.ClipRect);

  Canvas.brush.Color:=clRed;

  BeginPath(Canvas.Handle);

  MoveToEx(Canvas.Handle, s.x, s.y, nil);
  AngleArc(Canvas.Handle, offset.x, offset.y, r1 div 2, -TrackBar2.Position, -TrackBar1.Position);
  AngleArc(Canvas.Handle, offset.x, offset.y, r2 div 2, -(TrackBar2.Position + TrackBar1.Position), TrackBar1.Position);

  EndPath(Canvas.Handle);
  Region := PathToRegion(Canvas.Handle);
  PaintRgn(Canvas.Handle, Region);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz