AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Zeichnen auf Canvas und ZOrder bzw. Übermalen

Zeichnen auf Canvas und ZOrder bzw. Übermalen

Ein Thema von EWeiss · begonnen am 2. Apr 2015 · letzter Beitrag vom 2. Apr 2015
Antwort Antwort
Seite 1 von 2  1 2   
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#1

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 08:36
Dabei ist es uninteressant was DrawEllipseFromCenter macht.
Ja eben nicht.

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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 08:45
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

Geändert von EWeiss ( 2. Apr 2015 um 08:51 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#3

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 09:31
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 10:04
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

Geändert von EWeiss ( 2. Apr 2015 um 10:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 10:16
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.
daher bin ich auf GDI+ ausgewichen.
Hat sich also erledigt.
Auch gut.
Uli Gerhardt
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 10:18
Zitat:
Freilich geht das.
Nö! nicht mit Canvas.

Zitat:
Auch gut.
Richtig.

gruss
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#7

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 10:22
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 10:56
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 13:10
Geht wohl nicht mit Boardmitteln...
Das ist wie mit Ockhams Rasiermesser: "Von mehreren möglichen Erklärungen desselben Sachverhalts ist die einfachste Theorie allen anderen vorzuziehen." Letztendlich stellte sich nie wirklich die Frage wo das Problem liegt, denn es konnte nur Pen.Mode sein. Pen.Mode macht so einen Sch...

Der Bösewicht findet sich in der Prozedur PrepareScale:
Delphi-Quellcode:
procedure TGraph.PrepareScale;
var
  gray: Integer;
begin
...
  // Koordinatenkreuz
  Image.Canvas.Pen.Mode := pmNotXor; //<<<--- hier
  Image.Canvas.MoveTo(xxc(xMin), yyc(0));
  Image.Canvas.LineTo(xxc(xMax), yyc(0));
...
Einmal eingestellt beleibt es über Prozeduren bestehen.


//EDIT:

Sorry, hab deinen letzten Beitrag #20 vor meinem Beitrag nicht gelesen. Anscheinend hast du schon selbst das Problem gefunden.
Zitat:
Aber würde mich trotzdem nochmal interessieren warum Pen.Mode und bsClear sich im Wege stehen...
Tun sie nicht. Zuerst mal, pmMergeNotPen war nur eine Möglichkeit, der Hinweis war, dass es Pen.Mode sein muss. Was Pen.Mode angeht, so hat er im Grunde keine Auswirkung auf bsClear. bsClear entscheidet ob ein Objekt eine Füllung hat oder nicht (oder Muster). Hat es keine Füllung, gilt im Objekt der alte Hintergrund. Aber das weißt du ja. Somit hat Pen.Mode keinen Einfluss auf Brush, er richtet sich einfach nach dem was im Hintergrund ist. Standardmäßig ist pmCopy eingestellt. Mit pmCopy zeichnet Pen mit der eingestellten Color Farbe. Ist pmBlack eingestellt, wird immer schwarz gezeichnet. Bei pmNotXor wird eine Farbe genommen die weder Pen Farbe ist, noch im Hintergrund vorkommt. Pen prüft also bevor es zeichnet die Farbe des Hintergrudes.

Also, Pen.Mode hat mit bsClear nichts zu tun.

Geändert von Popov ( 2. Apr 2015 um 13:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Zeichnen auf Canvas und ZOrder bzw. Übermalen

  Alt 2. Apr 2015, 13:38
Einmal am Canvas zuviel rumgespielt und schon geht es in die Hose.

Um solche unliebsamen Überraschungen zu vermeiden gibt es Delphi-Referenz durchsuchenTRecall bzw. auch die konkreten Ableitungen für
Delphi-Quellcode:
procedure DoSomething( ACanvas : TCanvas );
var
  LPenRecall : TPenRecall;
begin
  LPenRecall := TPenRecall.Create( ACanvas.Pen );
  try

    ACanvas.Pen. // nach Belieben Pen verändern

  finally
    LPenRecall.Free; // Danach ist ACanvas.Pen wieder wie vorher
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 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