![]() |
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:
gruss
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; |
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: |
AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
Zitat:
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:
Sieh Bild. Alle Linien müssten eigentlich unsichtbar sein innerhalb des roten Ball's da dieser zuletzt gezeichnet wird. gruss |
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; |
AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
Zitat:
Habe es jetzt auf GDI+ umgestellt.
Delphi-Quellcode:
Damit geht es wie es soll.. Qualität siehe Anhang.
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; Danke! gruss |
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:
gruss
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; |
AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
Zitat:
Zitat:
|
AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
Zitat:
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:
gruss
FImage.Canvas.brush.Color := clred;
FImage.Canvas.Pen.Width := 2; |
AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
Zitat:
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. |
AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen
Zitat:
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 03:35 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-2025 by Thomas Breitkreuz