Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Zeichnen auf Canvas und ZOrder bzw. Übermalen (https://www.delphipraxis.net/184528-zeichnen-auf-canvas-und-zorder-bzw-uebermalen.html)

uligerhardt 2. Apr 2015 10:16

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Zitat:

Zitat von EWeiss (Beitrag 1295937)
Wenn ich eine Linie zeichne und einen Kreis darüber lege sollte die Linie überdeckt werden.

Geht wohl nicht mit Board mitteln

Freilich geht das.
Zitat:

Zitat von EWeiss (Beitrag 1295937)
daher bin ich auf GDI+ ausgewichen.
Hat sich also erledigt.

Auch gut. :mrgreen:

EWeiss 2. Apr 2015 10:18

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Zitat:

Freilich geht das.
Nö! nicht mit Canvas.

Zitat:

Auch gut.
Richtig. :)

gruss

BadenPower 2. Apr 2015 10:22

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Zitat:

Zitat von EWeiss (Beitrag 1295946)
Zitat:

Freilich geht das.
Nö! nicht mit Canvas.

Doch!

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin

  Image1.Canvas.Font.Color := clblack;
  Image1.Canvas.Pen.Color := clblack;
  Image1.Canvas.MoveTo(0,0);
  Image1.Canvas.LineTo(100,100);

  Image1.Canvas.Brush.Style:= bsSolid;
  Image1.Canvas.Brush.Color := clLime;
  Image1.Canvas.Pen.Width := 5;

  Image1.Canvas.Ellipse(30,30,70,70);

end;
Der Kreis liegt über der Linie und die Linie ist definitiv nicht im Bereich des Kreises sichtbar, sondern wird komplett verdeckt.

Also doch ein moglicher Fehler in DrawEllipseFromCenter.

EWeiss 2. Apr 2015 10:25

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Zitat:

Also doch ein moglicher Fehler in DrawEllipseFromCenter.
Sorry aber du nervst..

Delphi-Quellcode:
procedure TGraph.DrawEllipseFromCenter(Canvas: TCanvas; XOffset: integer;
  YOffset: integer; RadiusOfCircle: Integer);
Var
  R: TRect;
begin

  R.Top := YOffset - RadiusOfCircle;
  R.Left := XOffset - RadiusOfCircle;
  R.Bottom := YOffset + RadiusOfCircle;
  R.Right := XOffset + RadiusOfCircle;
  Canvas.Ellipse(R);
end;
Fehler? LOL

gruss

Bjoerk 2. Apr 2015 10:44

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Hallo Emil, wer zuletzt malt malt zuletzt, das trifft auch für Brush.Style zu (Siehe Setter von TBrush). :wink:

Delphi-Quellcode:
    // ergibt bsClear;
    Bitmap.Canvas.Brush.Color := clInfoBK;
    Bitmap.Canvas.Brush.Style := bsClear;

    // ergibt bsSolid;
    Bitmap.Canvas.Brush.Style := bsClear;
    Bitmap.Canvas.Brush.Color := clInfoBK; // ***
Color und Style beeinflussen sich auch gegenseitig.

EWeiss 2. Apr 2015 10:56

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Zitat:

Zitat von Bjoerk (Beitrag 1295959)
Hallo Emil, wer zuletzt malt malt zuletzt, das trifft auch für Brush.Style zu (Siehe Setter von TBrush). :wink:

Delphi-Quellcode:
    // ergibt bsClear;
    Bitmap.Canvas.Brush.Color := clInfoBK;
    Bitmap.Canvas.Brush.Style := bsClear;

    // ergibt bsSolid;
    Bitmap.Canvas.Brush.Style := bsClear;
    Bitmap.Canvas.Brush.Color := clInfoBK; // ***
Color und Style beeinflussen sich auch gegenseitig.

Danke!
Verstehe aber nicht wo ich es einsetzen soll.
Funktioniert einfach nicht.

Zuerst wird PrepareScale aufgerufen aus der Draw function.
Delphi-Quellcode:
procedure TGraph.PrepareScale;
var
  gray: Integer;
begin

  If ScaleMax = 0 Then
    ScaleMax := 1;

  Aspect := Bitmap.Width / Bitmap.Height;

  yMin := -ScaleMax;
  yMax := ScaleMax;
  xMin := -ScaleMax * Aspect;
  xMax := ScaleMax * Aspect;

  Bo := 20;
  BoLeft := Bo;
  BoTop := Bo;
  BoRight := Bo;
  BoBottom := Bo;

  Fact;

  Bitmap.Canvas.brush.Color := $00E0FFFF;
  // Hintergrund löschen
  Bitmap.Canvas.FillRect(Bitmap.Canvas.ClipRect);

  if HelpIsOn then
    DrawHelp;

  gray := 200;
  gray := RGB(gray, gray, gray);
  Bitmap.Canvas.Pen.Color := gray;

  // Koordinatenkreuz
  Bitmap.Canvas.MoveTo(xxc(xMin), yyc(0));
  Bitmap.Canvas.LineTo(xxc(xMax), yyc(0));
  Bitmap.Canvas.MoveTo(xxc(0), yyc(yMin));
  Bitmap.Canvas.LineTo(xxc(0), yyc(yMax));

  // Brush löschen
  Bitmap.Canvas.Brush.Style:= bsClear;

  // Kreis zeichnen
  DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics.x0), yyc(Physics.y0), trunc(xFact * Physics.L0));

  Bitmap.Canvas.Pen.Color := clblack;
  //Rechteck von links oben nach rechts unten
  Bitmap.Canvas.Rectangle(xxc(xMin), yyc(yMin), xxc(xMax), yyc(yMax));
end;
dann die Draw selbst.
Delphi-Quellcode:
procedure TGraph.Draw;
begin

  Bitmap.Canvas.Font.Color := clblack;

  PrepareScale;

  // Pendel Linie
  If Physics.D <> 0 then
  begin
    Bitmap.Canvas.Pen.Color := clblack;
    Bitmap.Canvas.MoveTo(xxc(Physics.x0), yyc(Physics.y0));
    Bitmap.Canvas.LineTo(xxc(Physics.x1), yyc(Physics.y1));
  end;

  // Pendel Center Punkt
  Bitmap.Canvas.Brush.Style:= bsclear;
  Bitmap.Canvas.Pen.Width := 3;
  Bitmap.Canvas.Pen.Mode := pmMergePenNot;

  DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics.x0), yyc(Physics.y0), round(Physics.r0 * xFact));

  // Pendel (Ball)
  Bitmap.Canvas.brush.Color := clred;
  Bitmap.Canvas.Pen.Width := 2;
  DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics.x1), yyc(Physics.y1), round(Physics.r1 * xFact));

  Bitmap.Canvas.Pen.Width := 1;

  // vom Bitmap auf das Canvas kopieren
  BitBlt(PaintFrame.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, srccopy);
end;

pmMergeNotPen > Combination of canvas background color and inverse of pen Color.
Sorgt dafür das der gro0e Graue Kreis überdeckt wird.
Was soll da falsch sein (oder vergessen) das es nicht geht.

gruss

uligerhardt 2. Apr 2015 10:56

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Zitat:

Zitat von EWeiss (Beitrag 1295946)
Zitat:

Freilich geht das.
Nö! nicht mit Canvas.

Ich hab deinen Code mal in eine lauffähige Form gebracht und sehe Kreise über Strichen:
Delphi-Quellcode:
procedure DrawEllipseFromCenter(Canvas: TCanvas; XOffset: integer; YOffset: integer; RadiusOfCircle: Integer);
var
  R: TRect;
begin
  R.Top := YOffset - RadiusOfCircle;
  R.Left := XOffset - RadiusOfCircle;
  R.Bottom := YOffset + RadiusOfCircle;
  R.Right := XOffset + RadiusOfCircle;
  Canvas.Ellipse(R);
end;

procedure TForm2.PaintFramePaint(Sender: TObject);
var
  Bitmap: TBitmap;
const
  Physics_x0 = 100;
  Physics_x1 = 200;
  Physics_y0 = 100;
  Physics_y1 = 200;
  Physics_r0 = 30;
  Physics_r1 = 40;
  xFact = 1;

  function xxc(x: Integer): Integer;
  begin
    Result := x;
  end;

  function yyc(y: Integer): Integer;
  begin
    Result := y;
  end;

begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.SetSize(PaintFrame.ClientWidth, PaintFrame.ClientHeight);

    Bitmap.Canvas.Font.Color := clblack;
    Bitmap.Canvas.Pen.Width := 1;
    //PrepareScale;

    // Linie an der das Pendel (Ball) hängt
    Bitmap.Canvas.Pen.Color := clblack;
    Bitmap.Canvas.MoveTo(xxc(Physics_x0), yyc(Physics_y0));
    Bitmap.Canvas.LineTo(xxc(Physics_x1), yyc(Physics_y1));

    Bitmap.Canvas.Brush.Style := bsSolid;
    Bitmap.Canvas.brush.Color := clblack;
    Bitmap.Canvas.Pen.Width := 5;
    // Center Punkt
    DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics_x0), yyc(Physics_y0), round(Physics_r0 * xFact));

    // Ball
    Bitmap.Canvas.brush.Color := clred;
    Bitmap.Canvas.Pen.Width := 2;
    DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics_x1), yyc(Physics_y1), round(Physics_r1 * xFact));

    // vom Bitmap auf das Canvas kopieren
    BitBlt(PaintFrame.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, srccopy);
  finally
    Bitmap.Free;
  end;
end;
(PaintFrame ist dabei eine TPaintBox) Also irgendwie zeigst du uns nicht das Relevante. :-)

EWeiss 2. Apr 2015 11:04

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Zitat:

Also irgendwie zeigst du uns nicht das Relevante.
Hab meinen Beitrag nochmal editiert.

gruss

Bjoerk 2. Apr 2015 11:21

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Zitat:

Danke! Verstehe aber nicht wo ich es einsetzen soll. Funktioniert einfach nicht. [..]
Ich will damit sagen, daß wenn man Color bzw. Style angibt, noch lange nicht sichergestellt ist, daß das auch so auf dem Canvas ankommt.

Bei deiner Skizze sieht es ja so aus als ob der Kreis quasi mit bsClear gezeichnet wäre? Lass mal den Pen.Mode weg.

Delphi-Quellcode:
procedure TBrush.SetColor(Value: TColor);
var
  BrushData: TBrushData;
begin
  if (Value <> Color) or ((Style = bsClear) and (Style <> bsSolid)) then
  begin
    GetData(BrushData);
    BrushData.Color := Value;
    if BrushData.Style = bsClear then
      BrushData.Style := bsSolid;
    SetData(BrushData);
  end;
end;

procedure TBrush.SetStyle(Value: TBrushStyle);
var
  BrushData: TBrushData;
begin
  if (Value <> Style) or ((Value = bsClear) and (Color <> clWhite)) then
  begin
    GetData(BrushData);
    BrushData.Style := Value;
    if BrushData.Style = bsClear then
      BrushData.Color := clWhite;
    SetData(BrushData);
  end;
end;

EWeiss 2. Apr 2015 11:34

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Hallo Bjoerk

Zitat:

Bei deiner Skizze sieht es ja so aus als ob der Kreis quasi mit bsClear gezeichnet wäre? Lass mal den Pen.Mode weg.
Wir haben einen Gewinner ;)
Jetzt funktioniert es.

Aber würde mich trotzdem nochmal interessieren warum Pen.Mode und bsClear sich im Wege stehen (für spätere Projekte).

Danke schön..
Jetzt kann ich 2 Projekte hochladen einmal mit GDI und einmal GDI+
So kann man das mal vergleichen.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:46 Uhr.
Seite 2 von 3     12 3      

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