Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

EWeiss 2. Apr 2015 02:36


Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Kennt der Canvas beim zeichnen keine ZOrder?
Jetzt zeichne ich schon auf ein Bitmap und ist immer noch Müll!
Ich zeichne alles in der richtigen Reihenfolge trotzdem sind die Linien über den Kreisen und nicht drunter.

Delphi-Quellcode:
procedure TGraph.Draw;
begin

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

  If Physics.D <> 0 then
  begin
    // 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));
  end;

  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);
end;
gruss

himitsu 2. Apr 2015 03:18

AW: Zeichnen auf Canvas und ZOrder
 
Nein, natürlich nicht.

Wozu sollte eine 2-dimensionale Zeichenfläche (wie ein Blatt Papier) eine dritte Dimension behandeln?
Und wenn doch, warum dann nicht auch die Vierte, Fünfte und Sechste?

Wer zuletzt malt, der malt zuletzt,
aber hab jetzt keine Ahnung was DrawEllipseFromCenter macht.



Die übermalten Bälle sind nicht zufällig Bälle, die schon vor Aufruf der Draw-Funktion auf dem Bitmap drauf sind? :stupid:

EWeiss 2. Apr 2015 03:43

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

Die übermalten Bälle sind nicht zufällig Bälle, die schon vor Aufruf der Draw-Funktion auf dem Bitmap drauf sind?
Nö!
Warum sollten Sie?
Und zufällig schon gar nicht.
Wie du im Code ersehen kannst.
Delphi-Quellcode:
DrawEllipseFromCenter(Bitmap.Canvas, xxc(Physics.x1), yyc(Physics.y1), round(Physics.r1 * xFact));


Dabei ist es uninteressant was DrawEllipseFromCenter macht.
Wenn ich eine Linie zeichne und anschließend einen Ball, auf dem die Linie zur hälft liegt (Normaler weise dahinter)
Dann sollte die Linie eigentlich nicht sichtbar sein Oder?
Denn schließlich zeichne ich die Linie zuerst.

Delphi-Quellcode:
Bitmap.Canvas.brush.Color := clred;


Ist die Farbe vielleicht Transparent und nicht deckend so das man die Linie noch sieht?
Wobei wie man sehen kann der Style Solid ist
Delphi-Quellcode:
Bitmap.Canvas.Brush.Style:= bsSolid;
Zitat:

Wozu sollte eine 2-dimensionale Zeichenfläche (wie ein Blatt Papier) eine dritte Dimension behandeln?
Zumindest ist ein Strich den ich mit einer anderen satten Farbe übermale nicht mehr sichtbar.

Sieh Bild.
Alle Linien müssten eigentlich unsichtbar sein innerhalb des roten Ball's da dieser zuletzt gezeichnet wird.

gruss

Popov 2. Apr 2015 06:18

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
 
Hast du mal Pen.Mode mal eingestellt?
Delphi-Quellcode:
begin
  with canvas do
  begin
    Pen.Width := 5;
    Pen.Mode := pmMergePenNot; //<<<---

    Brush.Color := clRed;
    Brush.Style := bsSolid;

    MoveTo(0, 0);
    LineTo(200, 200);

    Ellipse(0, 0, 200, 200);
  end;
end;

EWeiss 2. Apr 2015 06:22

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

Zitat von Popov (Beitrag 1295904)
Hast du mal Pen.Mode mal eingestellt?
Delphi-Quellcode:
begin
  with canvas do
  begin
    Pen.Width := 5;
    Pen.Mode := pmMergePenNot; //<<<---

    Brush.Color := clRed;
    Brush.Style := bsSolid;

    MoveTo(0, 0);
    LineTo(200, 200);

    Ellipse(0, 0, 200, 200);
  end;
end;

Werde das mal mit dem alten Projekt testen.
Habe es jetzt auf GDI+ umgestellt.

Delphi-Quellcode:
procedure TGraph.Draw;
begin
  PrepareScale;

  graphics := TGPGraphics.Create(Bitmap.Canvas.Handle);
  graphics.SetSmoothingMode(SmoothingModeAntiAlias);

  Pen := TGPPen.Create(MakeColor(255, 0, 0, 0));
  path := TGPGraphicsPath.Create;
  brush := TGPSolidBrush.Create(MakeColor(255, 0, 0, 0));

  // Pendel Linie
  If Physics.D <> 0 then
    graphics.DrawLine(Pen, xxc(Physics.x0), yyc(Physics.y0), xxc(Physics.x1), yyc(Physics.y1));

  // Pendel Center Punkt
  DrawEllipseFromCenter(path, xxc(Physics.x0), yyc(Physics.y0), round(Physics.r0 * xFact));

  graphics.DrawPath(pen, path);
  graphics.FillPath(brush, path);

  // Pendel (Ball)
  path.Reset;
  Pen.SetColor(MakeColor(255, 0, 0, 0));
  brush.SetColor(MakeColor(255, 255, 0, 0));

  DrawEllipseFromCenter(path, xxc(Physics.x1), yyc(Physics.y1), round(Physics.r1 * xFact));

  graphics.DrawPath(pen, path);
  graphics.FillPath(brush, path);

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

  Pen.Free;
  path.Free;
  brush.Free;
  graphics.Free;
end;
Damit geht es wie es soll.. Qualität siehe Anhang.
Danke!

gruss

EWeiss 2. Apr 2015 06:34

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

Delphi-Quellcode:
FImage.Canvas.Pen.Mode := pmMergePenNot;

Sehe ich jetzt nicht mehr den Hintergrund (Linie) vom Grauen Kreis.
Aber immer noch die Linie auf dem Ball.

Delphi-Quellcode:
procedure TGraph.Draw;
begin
  FImage.Canvas.Font.Color := clblack;
  FImage.Canvas.Pen.Mode := pmMergePenNot;

  PrepareScale;
 
  // Die Linie ist noch auf dem Ball sichtbar.
  If Physics.D <> 0 then
  begin
    FImage.Canvas.Pen.Color := clblack;
    FImage.Canvas.MoveTo(xxc(Physics.x0), yyc(Physics.y0));
    FImage.Canvas.LineTo(xxc(Physics.x1), yyc(Physics.y1));
  end;

  FImage.Canvas.Brush.Style:= bsSolid;
  FImage.Canvas.brush.Color := clblack;
  FImage.Canvas.Pen.Width := 5;

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

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

  FImage.Canvas.Pen.Width := 1;

end;
gruss

BadenPower 2. Apr 2015 08:36

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

Zitat von EWeiss (Beitrag 1295901)
Dabei ist es uninteressant was DrawEllipseFromCenter macht.

Ja eben nicht.

Zitat:

Zitat von EWeiss (Beitrag 1295901)
Wenn ich eine Linie zeichne und anschließend einen Ball, auf dem die Linie zur hälft liegt (Normaler weise dahinter)
Dann sollte die Linie eigentlich nicht sichtbar sein Oder?
Denn schließlich zeichne ich die Linie zuerst.

Den Ball zeichnest Du in DrawEllipseFromCenter und daher könnte dort der Fehler liegen.

EWeiss 2. Apr 2015 08:45

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

Den Ball zeichnest Du in DrawEllipseFromCenter und daher könnte dort der Fehler liegen.
Warum bist du da so sicher, wenn ich sage das es uninteressant ist?
Dort wird nur der Mittelpunkt ermittelt und Ellipse(R) ausgeführt nicht mehr.
Alles andere ist in Draw.

Die zeichnen Operationen sind bereits schon in Draw festgelegt bevor ich den Ball Zeichne.

Delphi-Quellcode:
FImage.Canvas.brush.Color := clred;
FImage.Canvas.Pen.Width := 2;
gruss

BadenPower 2. Apr 2015 09:31

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

Zitat von EWeiss (Beitrag 1295922)
Zitat:

Den Ball zeichnest Du in DrawEllipseFromCenter und daher könnte dort der Fehler liegen.
Warum bist du da so sicher, wenn ich sage das es uninteressant ist?
Dort wird nur der Mittelpunkt ermittelt und Ellipse(R) ausgeführt nicht mehr.
Alles andere ist in Draw.

Ich bin mir ja nicht sicher, deshalb steht dort auch "könnte".

Da in der Draw keine Kreise gezeichnet werden, müssen diese ja in "DrawEllipseFromCenter" gezeichnet werden.
Und da Du uns diese verheimlichst können wir auch nicht sehen, was darin oder was nicht passiert.

EWeiss 2. Apr 2015 10:04

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

Und da Du uns diese verheimlichst können wir auch nicht sehen, was darin oder was nicht passiert.
Wie oft muss ich jetzt noch darauf rumreiten.
Wenn ich sage es ist uninteressant das ist das so.. und fertig.

Wie lange wollen wir jetzt darüber debattieren.
Es steht in keinen Bezug zu meinem Problem.
Wenn ich eine Linie zeichne und einen Kreis darüber lege sollte die Linie überdeckt werden.

Geht wohl nicht mit Boardmitteln daher bin ich auf GDI+ ausgewichen.
Hat sich also erledigt.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 Uhr.
Seite 1 von 3  1 23      

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